Triển khai OpenGL ES và EGL

OpenGL là API đồ họa đa nền tảng chỉ định giao diện phần mềm tiêu chuẩn cho phần cứng xử lý đồ họa 3D. OpenGL ES là tập hợp con của đặc tả OpenGL dành cho các thiết bị nhúng.

Để tương thích với Android, các thiết bị cần cung cấp trình điều khiển cho EGL, OpenGL ES 1.x và OpenGL ES 2.0. Hỗ trợ OpenGL ES 3.x là tùy chọn. Những cân nhắc chính bao gồm:

  • Đảm bảo trình điều khiển GL mạnh mẽ và tuân thủ các tiêu chuẩn OpenGL ES.
  • Cho phép số lượng bối cảnh GL không giới hạn. Vì Android cho phép các ứng dụng ở chế độ nền và cố gắng duy trì ngữ cảnh GL nên bạn không nên giới hạn số lượng ngữ cảnh trong trình điều khiển của mình.
  • Hãy lưu ý đến lượng bộ nhớ được phân bổ cho từng bối cảnh, vì thông thường có 20–30 bối cảnh GL hoạt động cùng một lúc.
  • Hỗ trợ định dạng hình ảnh YV12 và các định dạng hình ảnh YUV khác đến từ các thành phần khác trong hệ thống, chẳng hạn như bộ giải mã phương tiện hoặc máy ảnh.
  • Hỗ trợ các tiện ích mở rộng bắt buộc EGL_KHR_wait_sync , GL_OES_texture_external , EGL_ANDROID_image_native_bufferEGL_ANDROID_recordable . Ngoài ra, Hardware Composer v1.1 trở lên yêu cầu tiện ích mở rộng EGL_ANDROID_framebuffer_target .

Chúng tôi cũng khuyên bạn nên hỗ trợ EGL_ANDROID_blob_cache , EGL_KHR_fence_syncEGL_ANDROID_native_fence_sync .

Android 10 triển khai giao diện EGL 1.5 . Để biết thông tin về các tính năng mới trong EGL 1.5, hãy xem Thông số kỹ thuật của Khronos Releases 1.5 .

Đang tải trình điều khiển

Android hy vọng các GPU có sẵn cho hệ thống sẽ được biết khi hình ảnh hệ thống được tạo. Các đường dẫn ưu tiên cho trình điều khiển OpenGL ES 32 bit và 64 bit lần lượt là /vendor/lib/egl/vendor/lib64/egl . Trình tải sử dụng hai thuộc tính hệ thống ro.hardware.eglro.board.platform hoặc tên chính xác để khám phá và tải trình điều khiển hệ thống. Trình điều khiển OpenGL ES phải được gửi ở dạng một nhị phân hoặc chia thành ba nhị phân. Nếu trình điều khiển OpenGL ES được gửi ở dạng nhị phân, hãy sử dụng một trong các tên sau:

libGLES_${ro.hardware.egl}.so
libGLES_${ro.board.platform}.so
libGLES.so

Nếu trình điều khiển OpenGL ES được chuyển thành ba tệp nhị phân, hãy sử dụng một trong các bộ tên sau:

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

Các lớp OpenGL ES

Android 10 giới thiệu hệ thống phân lớp cho GLES 2.0+. Các lớp GLES là các đối tượng dùng chung có sẵn trong ứng dụng hoặc được cung cấp bởi các công cụ. Các lớp GLES cho phép các ứng dụng có thể sửa lỗi khám phá và tải các lớp bằng cách sử dụng cơ chế thiết lập tương tự như Vulkan .

GLES LayerLoader, một thành phần trong trình tải EGL, xác định các lớp GLES. Đối với mỗi lớp mà GLES LayerLoader tìm thấy, GLES LayerLoader gọi AndroidGLESLayer_Initialize , duyệt danh sách hàm của libEGL và gọi AndroidGLESLayer_GetProcAddress cho tất cả các hàm đã biết. Nếu lớp chặn một chức năng, nó sẽ theo dõi địa chỉ của chức năng đó. Nếu lớp không chặn một hàm, AndroidGLESLayer_GetProcAddress sẽ trả về cùng một địa chỉ hàm mà nó đã được truyền. Sau đó, LayerLoader cập nhật danh sách hook chức năng để trỏ đến điểm vào của lớp.

Kích hoạt lớp

Bạn có thể kích hoạt các lớp GLES trên mỗi ứng dụng hoặc trên toàn cầu. Cài đặt cho mỗi ứng dụng vẫn tồn tại trong suốt quá trình khởi động lại, trong khi các thuộc tính chung sẽ bị xóa khi khởi động lại.

Để bật các lớp cho mỗi ứng dụng :

# 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

Để tắt các lớp cho mỗi ứng dụng :

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

Để kích hoạt các lớp trên toàn cầu :

# Attempts to load layers for all applications, including native executables
adb shell setprop debug.gles.layers layer1:layer2:...:layerN

Lớp thử nghiệm

Các lớp GLES được Android CTS hỗ trợ và bắt buộc phải vượt qua các bài kiểm tra CTS cho các thiết bị tương thích . Để xác định xem các lớp có hoạt động trên thiết bị hay không, hãy chạy $ atest CtsGpuToolsHostTestCases .