تنفيذ 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 والإصدارات الأحدث من Hardware Composer توفّر الإضافة EGL_ANDROID_framebuffer_target.

ننصحك بشدة بتوفير دعم للغات EGL_ANDROID_blob_cache وEGL_KHR_fence_sync وEGL_ANDROID_native_fence_sync أيضًا.

يتضمّن الإصدار 10 من نظام التشغيل Android واجهة EGL 1.5. للحصول على معلومات حول الميزات الجديدة في الإصدار 1.5 من EGL، راجِع مواصفات الإصدار 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.