นำ 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 นอกจากนี้ ยังมีการใช้ Computer 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 ไดรเวอร์จัดส่งในไบนารี 1 รายการ ให้ใช้ชื่อใดชื่อหนึ่งต่อไปนี้

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