OpenGL คือ API กราฟิกข้ามแพลตฟอร์มที่ระบุอินเทอร์เฟซซอฟต์แวร์มาตรฐานสำหรับฮาร์ดแวร์การประมวลผลกราฟิก 3 มิติ OpenGL ES คือกลุ่มย่อยของข้อกําหนด OpenGL สําหรับอุปกรณ์แบบฝัง
อุปกรณ์เพื่อให้ใช้งานร่วมกับ Android ได้ จะต้องมีไดรเวอร์สำหรับ EGL, OpenGL ES 1.x และ OpenGL ES 2.0 การรองรับ OpenGL ES 3.x ไม่บังคับ ข้อควรพิจารณาที่สำคัญมีดังนี้
- ตรวจสอบว่าไดรเวอร์ GL มีประสิทธิภาพและเป็นไปตามมาตรฐาน OpenGL ES
- อนุญาตให้มีบริบท GL ได้ไม่จำกัดจำนวน เนื่องจาก Android อนุญาตให้แอปทำงานอยู่เบื้องหลังและพยายามทำให้บริบท GL ทำงานต่อไป คุณจึงไม่ควรจำกัดจำนวนบริบทในไดรเวอร์
- พิจารณาจํานวนหน่วยความจําที่จัดสรรสําหรับบริบทแต่ละรายการ เนื่องจากบริบท GL ที่ใช้งานอยู่พร้อมกันมักจะมี 20-30 รายการ
- รองรับรูปแบบรูปภาพ 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 โปรดดูข้อมูลจำเพาะของ Kronos รุ่น 1.5
กำลังโหลดไดรเวอร์
Android คาดหวังให้ระบบทราบ GPU ที่ใช้ได้กับระบบเมื่อระบบ
ขึ้น เส้นทางที่แนะนำสำหรับไดรเวอร์ OpenGL ES แบบ 32 บิตและ 64 บิต คือ
/vendor/lib/egl
และ /vendor/lib64/egl
ตามลำดับ
ตัวโหลดใช้พร็อพเพอร์ตี้ของระบบ 2 รายการ ได้แก่ ro.hardware.egl
และ ro.board.platform
หรือชื่อที่ตรงกันทั้งหมดเพื่อค้นหาและโหลดไดรเวอร์ของระบบ ไดรเวอร์ OpenGL ES ต้องจัดส่งในรูปแบบไบนารี 1 รายการหรือแยกออกเป็นไบนารี 3 รายการ หากมีการรวมไดรเวอร์ OpenGL ES ไว้ในไบนารีเดียว ให้ใช้ชื่ออย่างใดอย่างหนึ่งต่อไปนี้
libGLES_${ro.hardware.egl}.so libGLES_${ro.board.platform}.so libGLES.so
หากมีการรวมไดรเวอร์ OpenGL ES ไว้ในไบนารี 3 รายการ ให้ใช้ชุดชื่ออย่างใดอย่างหนึ่งต่อไปนี้
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 จะเรียกใช้ 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