OpenGL ES و EGL را پیاده سازی کنید

OpenGL یک API گرافیکی بین پلتفرمی است که یک رابط نرم افزاری استاندارد را برای سخت افزار پردازش گرافیک سه بعدی مشخص می کند. OpenGL ES زیرمجموعه ای از مشخصات OpenGL برای دستگاه های تعبیه شده است.

برای سازگاری با Android، دستگاه‌ها باید درایورهایی برای EGL، OpenGL ES 1.x و OpenGL ES 2.0 ارائه کنند. پشتیبانی از OpenGL ES 3.x اختیاری است. ملاحظات کلیدی عبارتند از:

  • اطمینان از اینکه درایور GL قوی است و با استانداردهای OpenGL ES مطابقت دارد.
  • اجازه دادن به تعداد نامحدودی از زمینه های GL. از آنجایی که اندروید به برنامه‌ها در پس‌زمینه اجازه می‌دهد و سعی می‌کند زمینه‌های GL را زنده نگه دارد، نباید تعداد زمینه‌ها را در درایور خود محدود کنید.
  • توجه به مقدار حافظه اختصاص داده شده برای هر زمینه، زیرا داشتن 20 تا 30 زمینه GL فعال در یک زمان معمول است.
  • پشتیبانی از فرمت تصویر YV12 و سایر فرمت‌های تصویر YUV که از سایر اجزای سیستم مانند کدک‌های رسانه یا دوربین می‌آیند.
  • پشتیبانی از برنامه های افزودنی اجباری EGL_KHR_wait_sync , GL_OES_texture_external , EGL_ANDROID_image_native_buffer و EGL_ANDROID_recordable . علاوه بر این، Hardware Composer نسخه 1.1 و بالاتر به پسوند EGL_ANDROID_framebuffer_target نیاز دارد.

به شدت توصیه می شود از EGL_ANDROID_blob_cache ، EGL_KHR_fence_sync ، و EGL_ANDROID_native_fence_sync نیز پشتیبانی کنید.

اندروید 10 رابط کاربری EGL 1.5 را پیاده سازی می کند. برای اطلاعات در مورد ویژگی‌های جدید در EGL 1.5، به مشخصات Khronos Releases 1.5 مراجعه کنید.

درایور در حال بارگیری

اندروید انتظار دارد که GPUهای موجود در سیستم هنگام ساخت تصویر سیستم مشخص شوند. مسیرهای ترجیحی برای درایورهای OpenGL ES 32 بیتی و 64 بیتی به ترتیب /vendor/lib/egl و /vendor/lib64/egl هستند. لودر از دو ویژگی سیستم ro.hardware.egl و ro.board.platform یا نام دقیق برای کشف و بارگیری درایورهای سیستم استفاده می کند. درایور OpenGL ES باید در یک باینری ارسال شود یا به سه باینری تقسیم شود. اگر درایور OpenGL ES در یک باینری ارسال شده است، از یکی از نام‌های زیر استفاده کنید:

libGLES_${ro.hardware.egl}.so
libGLES_${ro.board.platform}.so
libGLES.so

اگر درایور OpenGL ES به سه باینری ارسال می‌شود، از یکی از مجموعه‌های نام زیر استفاده کنید:

libEGL_${ro.hardware.egl}.so
libGLESv1_CM_${ro.hardware.egl}.so
libGLESv2_${ro.hardware.egl}.so

libEGL_${ro.board.platform}.so
libGLESv1_CM_${ro.board.platform}.so
libGLESv2_${ro.board.platform}.so

libEGL.so
libGLESv1_CM.so
libGLESv2.so

لایه های OpenGL ES

اندروید 10 یک سیستم لایه بندی را برای GLES 2.0+ معرفی می کند. لایه‌های GLES اشیاء مشترکی هستند که از داخل برنامه‌ها در دسترس هستند یا توسط ابزارها ارائه می‌شوند. لایه‌های GLES برنامه‌های قابل اشکال‌زدایی را قادر می‌سازد تا با استفاده از مکانیسم‌های راه‌اندازی مشابه Vulkan، لایه‌ها را کشف و بارگذاری کنند.

GLES LayerLoader، مؤلفه ای در بارگذار EGL، لایه های GLES را شناسایی می کند. برای هر لایه ای که GLES LayerLoader پیدا می کند، GLES LayerLoader AndroidGLESLayer_Initialize را فراخوانی می کند، لیست های توابع libEGL را پیاده می کند، و AndroidGLESLayer_GetProcAddress برای همه توابع شناخته شده فراخوانی می کند. اگر لایه یک تابع را قطع کند، آدرس تابع را ردیابی می کند. اگر لایه تابعی را رهگیری نکند، AndroidGLESLayer_GetProcAddress همان آدرس تابعی را که ارسال شده برمی‌گرداند. سپس LayerLoader لیست هوک تابع را به روز می کند تا به نقطه ورودی لایه اشاره کند.

لایه ها را فعال کنید

می‌توانید لایه‌های GLES را در هر برنامه یا در سطح جهانی فعال کنید. تنظیمات هر برنامه در طول راه‌اندازی مجدد ادامه می‌یابد، در حالی که ویژگی‌های کلی در راه‌اندازی مجدد پاک می‌شوند.

برای فعال کردن لایه ها در هر برنامه :

# Enable layers
adb shell settings put global enable_gpu_debug_layers 1

# Specify target app
adb shell settings put global gpu_debug_app package_name

# Specify layer list (from top to bottom)
adb shell settings put global gpu_debug_layers_gles layer1:layer2:...:layerN

# Specify packages to search for layers
adb shell settings put global gpu_debug_layer_app package1:package2:...:packageN

برای غیرفعال کردن لایه ها در هر برنامه :

adb shell settings delete global enable_gpu_debug_layers
adb shell settings delete global gpu_debug_app
adb shell settings delete global gpu_debug_layer_app

برای فعال کردن لایه ها در سطح جهانی :

# Attempts to load layers for all applications, including native executables
adb shell setprop debug.gles.layers layer1:layer2:...:layerN

لایه های تست

لایه‌های GLES توسط Android CTS پشتیبانی می‌شوند و برای گذراندن تست‌های CTS برای دستگاه‌های سازگار لازم هستند. برای تشخیص اینکه آیا لایه‌ها روی یک دستگاه کار می‌کنند، $ atest CtsGpuToolsHostTestCases را اجرا کنید.