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 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
را اجرا کنید.