OpenGL یک رابط برنامهنویسی کاربردی گرافیکی چند پلتفرمی است که یک رابط نرمافزاری استاندارد برای سختافزار پردازش گرافیک سهبعدی مشخص میکند. OpenGL ES زیرمجموعهای از مشخصات OpenGL برای دستگاههای تعبیهشده است.
برای سازگاری با اندروید، دستگاهها باید درایورهای EGL، OpenGL ES 1.x و OpenGL ES 2.0 را ارائه دهند. پشتیبانی از OpenGL ES 3.x اختیاری است. ملاحظات کلیدی عبارتند از:
- تأیید کنید که درایور GL قوی است و با استانداردهای OpenGL ES مطابقت دارد.
- تعداد نامحدودی از زمینههای GL را مجاز کنید. از آنجا که اندروید به برنامهها در پسزمینه اجازه اجرا میدهد و سعی میکند زمینههای GL را فعال نگه دارد، نباید تعداد زمینههای موجود در درایور خود را محدود کنید.
- به میزان حافظه اختصاص داده شده برای هر context توجه داشته باشید، زیرا معمولاً 20 تا 30 context فعال GL به طور همزمان وجود دارد.
- از فرمت تصویر YV12 و سایر فرمتهای تصویر YUV که از سایر اجزای سیستم مانند کدکهای رسانه یا دوربین میآیند، پشتیبانی کنید.
- از افزونههای اجباری
EGL_KHR_wait_sync
،GL_OES_texture_external
،EGL_ANDROID_image_native_buffer
وEGL_ANDROID_recordable
پشتیبانی میکند. علاوه بر این، Hardware Composer نسخه ۱.۱ و بالاتر به افزونهEGL_ANDROID_framebuffer_target
نیاز دارند.
اکیداً توصیه میشود که EGL_ANDROID_blob_cache
، EGL_KHR_fence_sync
و EGL_ANDROID_native_fence_sync
نیز پشتیبانی شود.
اندروید ۱۰ رابط EGL 1.5 را پیادهسازی میکند. برای اطلاعات بیشتر در مورد ویژگیهای جدید EGL 1.5، به مشخصات انتشارهای Khronos 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
اندروید ۱۰ یک سیستم لایهبندی برای GLES 2.0+ معرفی میکند. لایههای 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_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
را اجرا کنید.