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 layersadb shell settings put global enable_gpu_debug_layers 1# Specify target appadb 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 layersadb shell settings put global gpu_debug_layer_app package1:package2:...:packageN
برای غیرفعال کردن لایهها برای هر برنامه:
adb shell settings delete global enable_gpu_debug_layersadb shell settings delete global gpu_debug_appadb 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 را اجرا کنید.