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 เวอร์ชัน 1.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
กำลังโหลดไดรเวอร์
Android คาดว่า GPU ที่มีอยู่ในระบบจะเป็นที่รู้จักเมื่อสร้างอิมเมจระบบ พาธที่ต้องการสำหรับไดรเวอร์ 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 จะอัปเดตรายการ hook ของฟังก์ชันให้ชี้ไปที่จุดเริ่มต้นของเลเยอร์
เปิดใช้งานเลเยอร์
คุณสามารถเปิดใช้งานเลเยอร์ 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