ใช้ OpenGL ES และ EGL

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 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

ทดสอบชั้น

เลเยอร์ GLES ได้รับการสนับสนุนโดย Android CTS และจำเป็นต้องผ่านการทดสอบ CTS สำหรับ อุปกรณ์ที่รองรับ หากต้องการระบุว่าเลเยอร์กำลังทำงานบนอุปกรณ์หรือไม่ ให้รัน $ atest CtsGpuToolsHostTestCases