SDV Media: quản lý màn hình

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.

Tương tác giữa các thành phần 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ụ:

Thiết lập quá trình kết xuất cho một màn hình

  1. Mở thiết bị DRM (/dev/dri/card*) và sử dụng các API Linux DRM (ví dụ: thông qua libdrm) 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.

  2. Phân bổ vùng đệm trước và sau bằng API Linux DRM.

    Bạn nên sử dụng minigbm's gbm_bo_create() và nhận chỉ số mô tả tệp DMA-BUF bằng gbm_bo_get_fd().

  3. Tạo framebuffer GL được hỗ trợ bởi các vùng đệm đã phân bổ.

    1. Tạo EGLImage từ vùng đệm DRM bằng eglCreateImageKHR với EGL_LINUX_DMA_BUF_EXT (từ EGL_EXT_image_dma_buf_import tiện ích).

    2. Tạo một kết cấu GL và sử dụng glEGLImageTargetTexture2DOES (từ GL_OES_EGL_image tiện ích) để đặt bộ nhớ của kết cấu thành EGLImage từ bước trước.

    3. 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.

  4. Cách kết xuất một khung:

    1. Liên kết một trong các framebuffer GL đã tạo.

    2. Vẽ một khung bằng các API GLES thông thường.

    3. Hiển thị khung trên màn hình: sử dụng API Linux DRM (drmModeAtomicCommit()) để gửi DRM_MODE_PAGE_FLIP_EVENT bằ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

  1. Mở thiết bị DRM /dev/dri/card* như trong quy trình một màn hình.

  2. 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.

  3. Đối với mỗi đầu nối màn hình:

    1. 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.

      1. Chọn một plane tương thích với CRTC.

      2. 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.

      3. 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_ID Mã CRTC Mã của CRTC để chỉ định cho đầu nối
    CRTC MODE_ID Mã blob Mã của một blob thuộc tính được tạo bằng drmModeCreatePropertyBlob, chứa cấu trúc drmModeModeInfo của chế độ video đã chọn
    CRTC ACTIVE bool true để đánh dấu CRTC là đang hoạt động
    plane FB_ID Mã framebuffer Mã của framebuffer DRM để hiển thị trên màn hình
    plane SRC_X pixel Toạ độ X của hình chữ nhật hình ảnh nguồn framebuffer
    plane SRC_Y pixel 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_X pixel Toạ độ X của hình chữ nhật hình ảnh đích CRTC
    plane CRTC_Y pixel Toạ độ Y của hình chữ nhật hình ảnh đích CRTC
    plane CRTC_W pixel chiều rộng của hình chữ nhật hình ảnh đích CRTC
    plane CRTC_H pixel chiều cao của hình chữ nhật hình ảnh đích CRTC
  4. Vào vòng lặp kết xuất:

    1. Đợi sự kiện lật trang trên CRTC trước khi kết xuất khung tiếp theo.

    2. 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.