OpenGL ES और EGL लागू करना

OpenGL एक क्रॉस-प्लैटफ़ॉर्म ग्राफ़िक एपीआई है. यह 3D ग्राफ़िक प्रोसेसिंग हार्डवेयर के लिए, स्टैंडर्ड सॉफ़्टवेयर इंटरफ़ेस तय करता है. OpenGL ES, एम्बेड किए गए डिवाइसों के लिए OpenGL स्पेसिफ़िकेशन का एक सबसेट है.

Android के साथ काम करने के लिए, डिवाइसों में EGL, OpenGL ES 1.x, और OpenGL ES 2.0 के लिए ड्राइवर होने चाहिए. OpenGL ES 3.x के साथ काम करना ज़रूरी नहीं है. इन बातों का ध्यान रखें:

  • यह पक्का करना कि GL ड्राइवर बेहतर हो और वह OpenGL ES के स्टैंडर्ड के मुताबिक हो.
  • अनलिमिटेड जीएल कॉन्टेक्स्ट की अनुमति देना. Android, ऐप्लिकेशन को बैकग्राउंड में चलने की अनुमति देता है और GL कॉन्टेक्स्ट को चालू रखने की कोशिश करता है. इसलिए, आपको अपने ड्राइवर में कॉन्टेक्स्ट की संख्या सीमित नहीं करनी चाहिए.
  • हर कॉन्टेक्स्ट के लिए, तय की गई मेमोरी का ध्यान रखें, क्योंकि एक साथ 20 से 30 ऐक्टिव GL कॉन्टेक्स्ट होना आम बात है.
  • YV12 इमेज फ़ॉर्मैट और YUV इमेज के दूसरे फ़ॉर्मैट के साथ काम करना, जो सिस्टम के दूसरे कॉम्पोनेंट से मिलते हैं. जैसे, मीडिया कोडेक या कैमरा.
  • ज़रूरी एक्सटेंशन के साथ काम करना चाहिए: EGL_KHR_wait_sync, GL_OES_texture_external, EGL_ANDROID_image_native_buffer, और EGL_ANDROID_recordable. इसके अलावा, Hardware Composer v1.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 में मौजूद नई सुविधाओं के बारे में जानकारी पाने के लिए, Khronos Releases 1.5 Specification देखें.

ड्राइवर लोड हो रहा है

Android चाहता है कि सिस्टम इमेज बनने के बाद, सिस्टम के लिए उपलब्ध जीपीयू की जानकारी हो. 32-बिट और 64-बिट OpenGL ES ड्राइवर के लिए, /vendor/lib/egl और /vendor/lib64/egl, सबसे सही पाथ हैं. loader, सिस्टम ड्राइवर को ढूंढने और लोड करने के लिए, सिस्टम की दो प्रॉपर्टी, 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 के सेटअप करने के तरीके का इस्तेमाल करके, लेयर को ढूंढ और लोड कर सकते हैं.

ईजीएल लोडर में मौजूद एक कॉम्पोनेंट, जीएलईएस लेयरलोडर, जीएलईएस लेयर की पहचान करता है. जीएलईएस लेयरलोडर को मिलने वाली हर लेयर के लिए, जीएलईएस लेयरलोडर 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

लेयर की जांच करना

जीएलईएस लेयर पर Android सीटीएस है. साथ ही, इन्हें इसके साथ काम करने वाले डिवाइसों के लिए, सीटीएस टेस्ट में पास होना ज़रूरी है. यह पता लगाने के लिए कि डिवाइस पर लेयर काम कर रही हैं या नहीं, $ atest CtsGpuToolsHostTestCases चलाएं.