นำ OpenGL ES และ EGL มาใช้

OpenGL คือ API กราฟิกข้ามแพลตฟอร์มที่ระบุอินเทอร์เฟซซอฟต์แวร์มาตรฐานสำหรับฮาร์ดแวร์ประมวลผลกราฟิก 3 มิติ OpenGL ES คือกลุ่มย่อยของข้อกําหนด OpenGL สําหรับอุปกรณ์แบบฝัง

อุปกรณ์ต้องระบุไดรเวอร์สำหรับ EGL, OpenGL ES 1.x และ OpenGL ES 2.0 จึงจะเข้ากันได้กับ Android คุณสามารถเลือกรองรับ 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 นอกจากนี้ ฮาร์ดแวร์ 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 รุ่น 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 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