تنفيذ برنامج 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 أيضًا.

يطبق Android 10 واجهة EGL 1.5 . للحصول على معلومات حول الميزات الجديدة في EGL 1.5، راجع مواصفات إصدارات Khronos 1.5 .

تحميل السائق

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