تنفيذ 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، يجب ألا تحدّ من عدد السياقات في برنامج التشغيل.
  • الانتباه إلى مقدار الذاكرة المخصّصة لكل سياق، لأنّه من الشائع أن يكون لديك من 20 إلى 30 سياقًا نشِطًا لـ GL في الوقت نفسه
  • أن يكون متوافقًا مع تنسيق صور YV12 وغيره من تنسيقات صور YUV التي تأتي من مكوّنات أخرى في النظام، مثل برامج ترميز الوسائط أو الكاميرا
  • أن تتيح الإضافات الإلزامية EGL_KHR_wait_sync و GL_OES_texture_external و EGL_ANDROID_image_native_buffer و EGL_ANDROID_recordable بالإضافة إلى ذلك، يتطلب الإصدار 1.1 من "أداة إنشاء الأجهزة" والإصدارات الأحدث إضافة 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، اطّلِع على مواصفات الإصدار 1.5 من Khronos.

تحميل برنامج تشغيل

يتوقع Android أن تكون وحدات معالجة الرسومات المتاحة للنظام معروفة عند إنشاء صورة النظام. المسارات المفضّلة لبرامج تشغيل 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

يقدّم نظام التشغيل Android 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 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 مع مجموعة أدوات اختبار التوافق (CTS) في Android، ويجب أن تجتاز اختبارات CTS على الأجهزة المتوافقة. لتحديد ما إذا كانت الطبقات تعمل على جهاز، شغِّل $ atest CtsGpuToolsHostTestCases.