SDV Media จะแสดงจอแสดงผลที่มีให้ใช้งานแก่แอป OEM ด้วย Linux DRM API
รูปที่ 1 การโต้ตอบระหว่างคอมโพเนนต์ DRM
เฟรมบัฟเฟอร์เป็นแหล่งที่มาของข้อมูลพิกเซล ซึ่งได้รับการสนับสนุนจากบัฟเฟอร์หน่วยความจำที่จัดสรรภายนอก
ระนาบคือแหล่งที่มาของรูปภาพที่ CRTC ใช้ โดยจะเชื่อมโยงกับ เฟรมบัฟเฟอร์ และแสดงมุมมองที่ครอบตัดของเฟรมบัฟเฟอร์ได้
CRTC แสดงถึงไปป์ไลน์การแสดงผลโดยรวม โดยสามารถรวมระนาบหลายระนาบเพื่อสร้างเอาต์พุตวิดีโอขั้นสุดท้าย และส่งเอาต์พุตไปยังตัวเข้ารหัสหลายตัวได้
โปรแกรมเปลี่ยนไฟล์จะแปลงเอาต์พุตวิดีโอจาก CRTC เป็นรูปแบบที่เหมาะสำหรับ ขั้วต่อที่เฉพาะเจาะจง
ขั้วต่อแสดงถึงขั้วต่อจอแสดงผลที่พร้อมใช้งาน เช่น พอร์ต HDMI
ดูคำอธิบายแบบเจาะลึกเพิ่มเติมได้ที่
แพลตฟอร์ม API
SDV Media มีอินเทอร์เฟซ DRM ของ Linux แม้ว่าจะใช้โดยตรงได้
โดยใช้ ioctl syscall แต่เราขอแนะนำให้ใช้
ไลบรารีผู้ช่วยในพื้นที่ผู้ใช้สำหรับการพัฒนาแอปพลิเคชัน เช่น
drm-rsสำหรับ Rust (แนะนำ)libdrmสำหรับ C/C++drm-kmsหน้า man จะแสดงภาพรวมโดยละเอียดของ API และการใช้งาน
ตั้งค่าการแสดงผลไปยังจอแสดงผลเดียว
เปิดอุปกรณ์ DRM (
/dev/dri/card*) และใช้ Linux DRM API เช่น ผ่านlibdrmในตัวบอกไฟล์เพื่อเลือกจอแสดงผลและโหมดโดยปกติแล้ว ระบบโฮสต์จะแสดงอุปกรณ์ GPU เสมือนเพียงเครื่องเดียว ซึ่งจะปรากฏเป็น
/dev/dri/card0จัดสรรบัฟเฟอร์ด้านหน้าและด้านหลังด้วย Linux DRM API
ขอแนะนำให้ใช้
minigbmgbm_bo_create()และรับตัวบอกไฟล์ DMA-BUF ด้วยgbm_bo_get_fd()สร้าง Framebuffer ของ GL ที่มีบัฟเฟอร์ที่จัดสรรเป็นข้อมูลสำรอง
สร้าง
EGLImageนอกบัฟเฟอร์ DRM ด้วยeglCreateImageKHRโดยมีEGL_LINUX_DMA_BUF_EXT(จากส่วนขยายEGL_EXT_image_dma_buf_import)สร้างเท็กซ์เจอร์ GL และใช้
glEGLImageTargetTexture2DOES(จากส่วนขยายGL_OES_EGL_image) เพื่อตั้งค่าพื้นที่เก็บข้อมูลของเท็กซ์เจอร์เป็นEGLImageจากขั้นตอนก่อนหน้าสร้าง GL Framebuffer และใช้
glFramebufferTexture2Dเพื่อตั้งค่า เท็กซ์เจอร์สำรองเป็นเท็กซ์เจอร์ที่สร้างขึ้นในขั้นตอนก่อนหน้า
วิธีเรนเดอร์เฟรม
เชื่อมโยง Framebuffer ของ GL ที่สร้างขึ้น
วาดเฟรมด้วย GLES API ปกติ
แสดงเฟรมบนหน้าจอ: ใช้ Linux DRM API (
drmModeAtomicCommit()) เพื่อส่งDRM_MODE_PAGE_FLIP_EVENTพร้อมตัวอธิบายไฟล์ DMA-BUF ที่ใช้โดยเฟรมบัฟเฟอร์ GL ที่เชื่อมโยง
สร้างเอาต์พุตวิดีโอจากหลายเลเยอร์
สำหรับการคอมโพสิตแบบหลายเลเยอร์ (หลายระนาบ) ที่เร่งด้วยฮาร์ดแวร์ เราจะใช้ ระบบโฮสต์ที่แสดงแต่ละเลเยอร์เป็นขั้วต่อ DRM แยกกัน (จอแสดงผลเสมือน) และแมปเลเยอร์เหล่านั้นไปยังตำแหน่ง / ไปป์ไลน์ฮาร์ดแวร์ที่ถูกต้อง
ดูรายละเอียดได้ที่ตั้งค่าการแสดงผลในหลายจอแสดงผล
ตั้งค่าการแสดงผลในหลายจอแสดงผล
เปิดอุปกรณ์
/dev/dri/card*DRM เหมือนในโฟลว์แบบจอแสดงผลเดียวแสดงรายการขั้วต่อจอแสดงผลที่พร้อมใช้งาน
จอแสดงผลแต่ละจอจะแสดงเป็นตัวเชื่อมต่อ DRM แยกกันของอุปกรณ์ DRM
สำหรับขั้วต่อจอแสดงผลแต่ละตัว
เลือก CRTC ที่เข้ากันได้กับตัวเชื่อมต่อ ขั้วต่อแต่ละตัวมีรายการ ของตัวเข้ารหัสที่ใช้ได้ และตัวเข้ารหัสแต่ละตัวจะระบุว่าใช้กับ CRTC ใดได้ โดยจะมี CRTC ที่เข้ากันได้อย่างน้อย 1 รายการเสมอ
เลือกเครื่องบินที่เข้ากันได้กับ CRTC
สร้างเฟรมบัฟเฟอร์ DRM ที่มีบัฟเฟอร์ GPU เป็นข้อมูลสำรอง กระบวนการนี้ จะเหมือนกับกระบวนการสำหรับรุ่นที่มีจอแสดงผลเดียว
เชื่อมต่อระนาบ, CRTC และตัวเชื่อมต่อ แล้วตั้งค่าวิดีโอโหมดใน CRTC
คุณสามารถตั้งค่าโหมดของจอแสดงผลหลายจอพร้อมกันได้ โดยใช้ Atomic API เพื่อตั้งค่าพร็อพเพอร์ตี้ DRM ต่อไปนี้สำหรับ แต่ละตัวเชื่อมต่อ, CRTC และชุดระนาบ
รายการพร็อพเพอร์ตี้ที่จำเป็นทั้งหมดมีดังนี้
เป้าหมาย พร็อพเพอร์ตี้ ประเภท คำอธิบาย มนุษยสัมพันธ์ดี CRTC_IDCRTC ID รหัสของ CRTC ที่จะกำหนดให้กับตัวเชื่อมต่อ CRTC MODE_IDรหัส Blob รหัสของ Blob พร็อพเพอร์ตี้ที่สร้างขึ้นโดยใช้ drmModeCreatePropertyBlobซึ่งมีโครงสร้างdrmModeModeInfoของโหมดวิดีโอที่เลือกCRTC ACTIVEบูลีน trueเพื่อทําเครื่องหมายว่า CRTC ใช้งานอยู่เครื่องบิน FB_IDรหัส Framebuffer รหัสของเฟรมบัฟเฟอร์ DRM ที่จะแสดงบนหน้าจอ เครื่องบิน SRC_Xพิกเซล พิกัด X ของสี่เหลี่ยมผืนผ้าของรูปภาพต้นฉบับของ Framebuffer เครื่องบิน SRC_Yพิกเซล พิกัด Y ของสี่เหลี่ยมผืนผ้าของรูปภาพต้นฉบับของ Framebuffer เครื่องบิน SRC_Wจุดคงที่ 16.16 ความกว้างของสี่เหลี่ยมผืนผ้าของรูปภาพต้นฉบับของเฟรมบัฟเฟอร์ (พิกเซลที่เลื่อนไปทางซ้าย 16 บิต) เครื่องบิน SRC_Hจุดคงที่ 16.16 ความสูงของสี่เหลี่ยมผืนผ้าของรูปภาพต้นฉบับของเฟรมบัฟเฟอร์ (พิกเซลที่เลื่อนไปทางซ้าย 16 บิต) เครื่องบิน CRTC_Xพิกเซล พิกัด X ของสี่เหลี่ยมผืนผ้าของรูปภาพปลายทาง CRTC เครื่องบิน CRTC_Yพิกเซล พิกัด Y ของสี่เหลี่ยมผืนผ้าของรูปภาพปลายทาง CRTC เครื่องบิน CRTC_Wพิกเซล ความกว้างของสี่เหลี่ยมผืนผ้าของรูปภาพปลายทาง CRTC เครื่องบิน CRTC_Hพิกเซล ความสูงของสี่เหลี่ยมผืนผ้าของรูปภาพปลายทางของ CRTC เข้าสู่ลูปการแสดงผล
รอเหตุการณ์การสลับหน้าใน CRTC ก่อนที่จะแสดงผลเฟรมถัดไป
แสดงผลเฟรมและแสดงบนหน้าจอโดยกำหนดเวลาการสลับหน้า สำหรับ CRTC + เฟรมบัฟเฟอร์ที่ระบุ