پیاده‌سازی OpenGL ES و EGL

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

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

  • تأیید کنید که درایور GL قوی است و با استانداردهای OpenGL ES مطابقت دارد.
  • تعداد نامحدودی بافت GL مجاز است. ازآنجایی‌که Android به برنامه‌ها اجازه می‌دهد در پس‌زمینه اجرا شوند و تلاش می‌کند بافت‌های GL را زنده نگه دارد، نباید تعداد بافت‌ها را در درایورتان محدود کنید.
  • به مقدار حافظه اختصاص‌داده‌شده برای هر بافت توجه داشته باشید، زیرا معمولاً ۲۰ تا ۳۰ بافت GL فعال به‌طور هم‌زمان وجود دارد.
  • از قالب تصویر YV12 و دیگر قالب‌های تصویر YUV که از دیگر عناصر سیستم، مثل کدک‌های رسانه یا دوربین، می‌آیند پشتیبانی می‌کند.
  • از افزونه‌های اجباری زیر پشتیبانی کند: EGL_KHR_wait_sync، GL_OES_texture_external، EGL_ANDROID_image_native_buffer، و EGL_ANDROID_recordable. علاوه‌براین، «آهنگ‌ساز سخت‌افزاری» نسخه ۱.۱ و بالاتر به افزونه EGL_ANDROID_framebuffer_target نیاز دارد.

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

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

درحال بار کردن درایور

Android انتظار دارد GPUهای دردسترس برای سیستم هنگام ساخته شدن تصویر سیستم شناخته شوند. مسیرهای ترجیحی برای درایورهای OpenGL ES ۳۲ بیتی و ۶۴ بیتی به‌ترتیب /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

Android 10 سیستم لایه‌بندی را برای GLES نسخه ۲.۰ و بالاتر معرفی می‌کند. لایه‌های 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 را اجرا کنید.