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

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

Android को उम्मीद है कि सिस्टम इमेज बनाने के दौरान, सिस्टम में उपलब्ध जीपीयू के बारे में पता चल जाएगा. 32-बिट और 64-बिट OpenGL ES ड्राइवर के लिए पसंदीदा पाथ ये हैं /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 में पेश किया गया जीएलईएस के लिए लेयरिंग सिस्टम 2.0 या इसके बाद के वर्शन. जीएलईएस लेयर, शेयर किए गए ऑब्जेक्ट हैं. ये ऐप्लिकेशन के अंदर से उपलब्ध होते हैं या इन्हें उपलब्ध कराया जाता है टूल. जीएलईएस लेयर की मदद से, डीबग किए जा सकने वाले ऐप्लिकेशन, सेट अप करने के ये तरीके Vulkan.

ईजीएल लोडर में मौजूद एक कॉम्पोनेंट, जीएलईएस लेयरलोडर, जीएलईएस लेयर की पहचान करता है. जीएलईएस लेयरलोडर को मिलने वाली हर लेयर के लिए, जीएलईएस लेयरलोडर AndroidGLESLayer_Initialize को कॉल करता है, libEGL के फ़ंक्शन की सूचियों को दिखाता है, और सभी जाने-पहचाने फ़ंक्शन के लिए AndroidGLESLayer_GetProcAddress को कॉल करता है. अगर लेयर किसी फ़ंक्शन को इंटरसेप्ट करती है, तो यह फ़ंक्शन के पते को ट्रैक करती है. अगर लेयर किसी फ़ंक्शन को इंटरसेप्ट नहीं करती है, तो AndroidGLESLayer_GetProcAddress वही फ़ंक्शन पता दिखाता है जो उसे पास किया गया था. इसके बाद, LayerLoader, फ़ंक्शन हुक की सूची को अपडेट करता है, ताकि वह लेयर के एंट्री पॉइंट पर ले जाए.

लेयर चालू करें

हर ऐप्लिकेशन के हिसाब से या दुनिया भर में जीएलईएस लेयर को चालू किया जा सकता है. हर ऐप्लिकेशन के हिसाब से सेटिंग यह नीति सभी रीबूट में बनी रहती है, जबकि रीबूट करने पर ग्लोबल प्रॉपर्टी हटा दी जाती हैं.

हर ऐप्लिकेशन के लिए लेयर चालू करने के लिए:

# 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 चलाएं.