SDV Media cung cấp các màn hình hiện có cho các ứng dụng OEM bằng API Linux DRM.
Framebuffer là 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à nguồn hình ảnh mà CRTC sử dụng. Nguồn này được liên kết với một framebuffer và có thể đại diện cho một khung hiển thị đã cắt của framebuffer.
CRTC đại diện cho một quy trình hiển thị tổng thể. Quy trình này có thể kết hợp nhiều plane để tạo ra đầu ra video cuối cùng và gử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ể.
Đầu nối đại diện cho một đầu 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:
Bề mặt API
SDV Media cung cấp các giao diện Linux DRM. Mặc dù bạn có thể sử dụng trực tiếp các giao diện này bằng syscall ioctl, nhưng bạn nên sử dụng thư viện trợ giúp không gian người dùng để phát triển ứng dụng. Ví dụ:
drm-rsthùng cho Rust (nên dùng),libdrmcho C/C++.drm-kmstrang hướng dẫn cung cấp thông tin tổng quan chi tiết về các API và cách sử dụng các API này.
Thiết lập quá trình kết xuất cho một màn hình
Mở thiết bị DRM (
/dev/dri/card*) và sử dụng các API Linux DRM (ví dụ: 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 máy chủ sẽ chỉ cung cấp một thiết bị GPU ảo duy nhất, thiết bị này sẽ xuất hiện dưới dạng
/dev/dri/card0.Phân bổ vùng đệm trước và sau bằng API Linux DRM.
Bạn nên sử dụng
minigbm'sgbm_bo_create()và nhận 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ừEGL_EXT_image_dma_buf_importtiện ích).Tạo một kết cấu GL và sử dụng
glEGLImageTargetTexture2DOES(từGL_OES_EGL_imagetiện ích) để đặt bộ nhớ của kết cấu thànhEGLImagetừ bước trước.Tạo một framebuffer GL và sử dụng
glFramebufferTexture2Dđể đặt kết cấu hỗ trợ của framebuffer thành kết cấu đã tạo ở bước trước.
Cách kết xuất một khung:
Liên kết một trong các framebuffer GL đã tạo.
Vẽ một khung bằng các API GLES thông thường.
Hiển thị khung trên màn hình: sử dụng API Linux DRM (
drmModeAtomicCommit()) để gửiDRM_MODE_PAGE_FLIP_EVENTbằng bộ mô tả tệp DMA-BUF mà framebuffer GL được liên kết sử dụng.
Tạo đầu ra video từ nhiều lớp
Đối với quá trình tạo nhiều lớp (nhiều plane) đượ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ủ để cung cấp từng lớp dưới dạng một đầu nối DRM riêng biệt (màn hình ảo) và ánh xạ các lớp đó đến đúng vị trí / quy trình phần cứng.
Hãy xem bài viết Thiết lập quá trình kết xuất cho nhiều màn hình để biết thông tin chi tiết.
Thiết lập quá trình 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 đầu nối màn hình hiện có.
Mỗi màn hình được cung cấp dưới dạng một đầu nối DRM riêng biệt của thiết bị DRM.
Đối với mỗi đầu nối màn hình:
Chọn một CRTC tương thích với đầu nối. Mỗi đầu nối có một danh sách các bộ mã hoá hiện có và mỗi bộ mã hoá cho biết các CRTC mà bộ mã hoá đó có thể sử dụng. Sẽ luôn có ít nhất một CRTC tương thích.
Chọn một plane tương thích với CRTC.
Tạo framebuffer 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 plane, 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ộ đầu nối, CRTC và bộ plane.
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ả giắc cắm CRTC_IDMã CRTC Mã của CRTC để chỉ định cho đầu nối CRTC MODE_IDMã blob Mã 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 ACTIVEbool trueđể đánh dấu CRTC là đang hoạt độngplane FB_IDMã framebuffer Mã của framebuffer DRM để hiển thị trên màn hình plane SRC_Xpixel Toạ độ X của hình chữ nhật hình ảnh nguồn framebuffer plane SRC_Ypixel Toạ độ Y của hình chữ nhật hình ảnh nguồn framebuffer plane SRC_WĐiểm cố định 16.16 chiều rộng của hình chữ nhật hình ảnh nguồn framebuffer (pixel được dịch sang trái 16 bit) plane SRC_HĐiểm cố định 16.16 chiều cao của hình chữ nhật hình ảnh nguồn framebuffer (pixel được dịch sang trái 16 bit) plane CRTC_Xpixel Toạ độ X của hình chữ nhật hình ảnh đích CRTC plane CRTC_Ypixel Toạ độ Y của hình chữ nhật hình ảnh đích CRTC plane CRTC_Wpixel chiều rộng của hình chữ nhật hình ảnh đích CRTC plane CRTC_Hpixel chiều cao của hình chữ nhật hình ảnh đích CRTC Vào 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 tiếp theo.
Kết xuất một khung và hiển thị khung đó trên màn hình bằng cách lên lịch lật trang cho CRTC+framebuffer đã cho.