SDV Media cung cấp các màn hình có sẵn cho các ứng dụng OEM bằng API DRM của Linux.
Hình 1. Tương tác giữa các thành phần DRM.
Framebuffer là một nguồn dữ liệu pixel, được hỗ trợ bởi một số vùng đệm bộ nhớ được phân bổ bên ngoài.
Plane là một nguồn hình ảnh mà CRTC sử dụng. Đối tượng này được liên kết với một vùng đệm khung và có thể biểu thị một khung hiển thị bị cắt của vùng đệm khung.
CRTC đại diện cho một quy trình hiển thị tổng thể. Nó có thể kết hợp nhiều mặt phẳng để tạo đầu ra video cuối cùng và điều phối đầu ra đến nhiều bộ mã hoá.
Bộ mã hoá chuyển đổi đầu ra video từ CRTC thành một dạng phù hợp với đầu nối cụ thể.
Trình kết nối đại diện cho một trình kết nối màn hình hiện có. Ví dụ: cổng HDMI.
Để biết nội dung mô tả chi tiết hơn, hãy tham khảo:
Nền tảng API
SDV Media cung cấp các giao diện DRM của Linux. Mặc dù có thể sử dụng trực tiếp bằng cách dùng lệnh gọi hệ thống ioctl, nhưng bạn nên dùng một thư viện trợ giúp không gian người dùng để phát triển ứng dụng. Ví dụ:
- Crate
drm-rscho Rust (nên dùng), libdrmcho C/C++. Trangdrm-kmsman cung cấp thông tin tổng quan chi tiết về các API và cách sử dụng chúng.
Thiết lập kết xuất cho một màn hình
Mở một thiết bị DRM (
/dev/dri/card*) và sử dụng các API DRM của Linux, chẳng hạn như thông qualibdrm, trên chỉ số mô tả tệp của thiết bị để chọn màn hình và chế độ của màn hình.Thông thường, hệ thống lưu trữ chỉ hiển thị một thiết bị GPU ảo duy nhất, xuất hiện dưới dạng
/dev/dri/card0.Phân bổ bộ nhớ đệm trước và sau bằng API DRM của Linux.
Bạn nên dùng
gbm_bo_create()củaminigbmvà lấy chỉ số mô tả tệp DMA-BUF bằnggbm_bo_get_fd().Tạo framebuffer GL được hỗ trợ bởi các vùng đệm đã phân bổ.
Tạo
EGLImagetừ vùng đệm DRM bằngeglCreateImageKHRvớiEGL_LINUX_DMA_BUF_EXT(từ tiện íchEGL_EXT_image_dma_buf_import).Tạo một kết cấu GL và dùng
glEGLImageTargetTexture2DOES(từ tiện íchGL_OES_EGL_image) để đặt bộ nhớ của kết cấu thànhEGLImagetừ bước trước.Tạo một khung hình đệm GL và dùng
glFramebufferTexture2Dđể đặt kết cấu hỗ trợ của khung hình đệm này thành kết cấu được tạo ở bước trước.
Cách kết xuất một khung hình:
Liên kết một trong các framebuffer GL đã tạo.
Vẽ một khung hình bằng các API GLES thông thường.
Hiển thị khung hình trên màn hình: sử dụng API DRM của Linux (
drmModeAtomicCommit()) để gửiDRM_MODE_PAGE_FLIP_EVENTbằng chỉ số mô tả tệp DMA-BUF do khung hình đệm GL liên kết sử dụng.
Tạo đầu ra video từ nhiều lớp
Đối với thành phần nhiều lớp (nhiều mặt phẳng) được tăng tốc bằng phần cứng, chúng tôi dựa vào hệ thống máy chủ lưu trữ để hiển thị từng lớp dưới dạng một trình kết nối DRM riêng biệt (màn hình ảo) và ánh xạ các lớp đó đến đúng vị trí / pipeline phần cứng.
Hãy xem phần Thiết lập hoạt động kết xuất cho nhiều màn hình để biết thông tin chi tiết.
Thiết lập hoạt động kết xuất cho nhiều màn hình
Mở thiết bị DRM
/dev/dri/card*như trong quy trình một màn hình.Liệt kê các giắc cắm màn hình hiện có.
Mỗi màn hình được hiển thị dưới dạng một trình kết nối DRM riêng biệt của thiết bị DRM.
Đối với mỗi giắc cắm màn hình:
Chọn một CRTC tương thích với giắc cắm. Mỗi đầu nối có một danh sách bộ mã hoá có sẵn và mỗi bộ mã hoá cho biết bộ mã hoá đó có thể được dùng với CRTC nào. Luôn có ít nhất một CRTC tương thích.
Chọn một gói cước tương thích với CRTC.
Tạo các khung hình DRM được hỗ trợ bởi các vùng đệm GPU. Quy trình này giống như đối với biến thể một màn hình.
Kết nối mặt phẳng, CRTC và đầu nối, đồng thời đặt chế độ video trên CRTC.
Bạn có thể đặt chế độ của nhiều màn hình cùng một lúc bằng cách sử dụng API nguyên tử để đặt các thuộc tính DRM sau đây cho từng bộ kết nối, CRTC và mặt phẳng.
Danh sách đầy đủ các thuộc tính cần thiết:
Mục tiêu Thuộc tính Loại Mô tả Cầu nối cộng đồng CRTC_IDMã nhận dạng CRTC Mã của CRTC cần chỉ định cho trình kết nối CRTC MODE_IDMã nhận dạng blob Mã nhận dạng của một blob thuộc tính được tạo bằng drmModeCreatePropertyBlob, chứa cấu trúcdrmModeModeInfocủa chế độ video đã chọnCRTC ACTIVEBoolean trueđể đánh dấu CRTC là đang hoạt độngMáy bay FB_IDMã Framebuffer Mã nhận dạng của vùng đệm khung DRM để hiển thị trên màn hình Máy bay SRC_XPixel Toạ độ X của hình chữ nhật hình ảnh nguồn vùng đệm khung Máy bay SRC_YPixel Toạ độ Y của hình chữ nhật hình ảnh nguồn bộ đệm khung Máy bay SRC_WSố cố định 16.16 Chiều rộng của hình chữ nhật hình ảnh nguồn bộ đệm khung (pixel được dịch chuyển sang trái 16 bit) Máy bay SRC_HSố cố định 16.16 Chiều cao của hình chữ nhật hình ảnh nguồn framebuffer (pixel được dịch chuyển sang trái 16 bit) Máy bay CRTC_XPixel Toạ độ X của hình chữ nhật hình ảnh đích CRTC Máy bay CRTC_YPixel Toạ độ Y của hình chữ nhật hình ảnh đích CRTC Máy bay CRTC_WPixel Chiều rộng của hình chữ nhật hình ảnh đích CRTC Máy bay CRTC_HPixel Chiều cao của hình chữ nhật hình ảnh đích của CRTC Nhập vòng lặp kết xuất:
Đợi sự kiện lật trang trên CRTC trước khi kết xuất khung hình tiếp theo.
Kết xuất một khung hình và hiển thị khung hình đó trên màn hình bằng cách lên lịch lật trang cho CRTC + vùng đệm khung hình đã cho.