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 की तरह ही सेटअप के तरीके इस्तेमाल करते हैं.
GLES LayerLoader, EGL लोडर का एक कॉम्पोनेंट है. यह GLES लेयर की पहचान करता है.
GLES LayerLoader को मिलने वाली हर लेयर के लिए, GLES LayerLoader AndroidGLESLayer_Initialize
को कॉल करता है. इसके बाद, libEGL के फ़ंक्शन की सूचियों को देखता है और सभी जाने-पहचाने फ़ंक्शन के लिए AndroidGLESLayer_GetProcAddress
को कॉल करता है.
अगर लेयर किसी फ़ंक्शन को इंटरसेप्ट करती है, तो वह फ़ंक्शन के पते को ट्रैक करती है.
अगर लेयर किसी फ़ंक्शन को इंटरसेप्ट नहीं करती है, तो
AndroidGLESLayer_GetProcAddress
उसी फ़ंक्शन का पता दिखाता है
जो उसे पास किया गया था. इसके बाद, LayerLoader, फ़ंक्शन हुक की सूची को अपडेट करता है, ताकि वह लेयर के एंट्री पॉइंट की ओर इशारा करे.
लेयर चालू करना
GLES लेयर को हर ऐप्लिकेशन के लिए या ग्लोबल तौर पर चालू किया जा सकता है. हर ऐप्लिकेशन के लिए की गई सेटिंग, रीबूट करने पर भी बनी रहती हैं. वहीं, ग्लोबल प्रॉपर्टी रीबूट करने पर हट जाती हैं.
हर ऐप्लिकेशन के लिए लेयर चालू करने के लिए:
# Enable layersadb shell settings put global enable_gpu_debug_layers 1
# Specify target appadb 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 layersadb 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
चलाएं.