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

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