Triển khai OpenGL ES và EGL

OpenGL là một API đồ hoạ đa nền tảng, chỉ định một giao diện phần mềm tiêu chuẩn cho phần cứng xử lý đồ hoạ 3D. OpenGL ES là một phần của quy cách 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. Bạn không bắt buộc phải hỗ trợ OpenGL ES 3.x. Một số điểm chính cần cân nhắc:

  • Đả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 ngữ cảnh GL không giới hạn. Vì Android cho phép các ứng dụng chạy ở chế độ nền và cố gắng duy trì các bối cảnh GL, nên bạn không nên giới hạn số lượng bối cảnh trong trình điều khiển.
  • Hãy lưu ý đến lượng bộ nhớ được phân bổ cho mỗi bối cảnh, vì thường có 20–30 bối cảnh GL đang 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ộ mã hoá và giải mã nội dung nghe nhìn hoặc camera.
  • Hỗ trợ các tiện ích bắt buộc EGL_KHR_wait_sync, GL_OES_texture_external, EGL_ANDROID_image_native_bufferEGL_ANDROID_recordable. Ngoài ra, Hardware Composer phiên bản 1.1 trở lên yêu cầu tiện ích EGL_ANDROID_framebuffer_target.

Bạn nên hỗ trợ cả 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 dự kiến hệ thống sẽ biết các GPU có sẵn khi hệ thống tạo hình ảnh. Đườ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 loader 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 vận chuyển trong một tệp nhị phân hoặc chia thành 3 tệp nhị phân. Nếu trình điều khiển OpenGL ES được chuyển trong một tệp 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 vào 3 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

Lớp OpenGL ES

Android 10 giới thiệu một hệ thống phân lớp cho GLES 2.0 trở lên. Các lớp GLES là các đối tượng dùng chung có sẵn trong các ứng dụng hoặc do các công cụ cung cấp. Các lớp GLES cho phép các ứng dụng có thể gỡ lỗi khám phá và tải các lớp bằng cách sử dụng cùng một cơ chế thiết lập 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 sẽ gọi AndroidGLESLayer_Initialize, duyệt danh sách hàm của libEGL và gọi AndroidGLESLayer_GetProcAddress cho tất cả hàm đã biết. Nếu chặn một hàm, thì lớp sẽ theo dõi địa chỉ của hàm. Nếu lớp không chặn một hàm, AndroidGLESLayer_GetProcAddress sẽ trả về chính địa chỉ hàm đã truyền. Sau đó, LayerLoader sẽ cập nhật danh sách móc hàm để trỏ đến điểm truy cập của lớp.

Bật lớp

Bạn có thể bật lớp GLES trên mỗi ứng dụng hoặc trên toàn cục. Các chế độ cài đặt theo từng ứng dụng vẫn tồn tại sau những lần khởi động lại, trong khi các thuộc tính toàn cục sẽ bị xoá khi bạn khởi động lại.

Cách bật lớp trên 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

Cách tắt lớp trên 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

Cách bật lớp trên toàn cục:

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

Lớp kiểm thử

Các lớp GLES được hỗ trợ bởi Android CTS và bắt buộc phải vượt qua các kiểm thử CTS đối với 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.