SDV Media mengekspos tampilan yang tersedia ke aplikasi OEM dengan Linux DRM API.
Framebuffer adalah sumber data piksel, yang didukung oleh beberapa buffer memori yang dialokasikan secara eksternal.
Plane adalah sumber gambar yang digunakan oleh CRTC. Objek ini dikaitkan dengan framebuffer, dan dapat merepresentasikan tampilan framebuffer yang dipangkas.
CRTC merepresentasikan keseluruhan pipeline tampilan. Proses ini dapat menggabungkan beberapa bidang untuk membuat output video akhir, dan mengirimkan output ke beberapa encoder.
Encoder mengonversi output video dari CRTC menjadi bentuk yang sesuai untuk konektor tertentu.
Konektor mewakili konektor layar yang tersedia. Misalnya, port HDMI.
Untuk deskripsi yang lebih mendalam, lihat:
Platform API
SDV Media menyediakan antarmuka DRM Linux. Meskipun dapat digunakan secara langsung
menggunakan syscall ioctl, untuk pengembangan aplikasi, sebaiknya gunakan
library helper ruang pengguna. Contoh:
- Crate
drm-rsuntuk Rust (direkomendasikan), libdrmuntuk C/C++.drm-kmsman page memberikan ringkasan yang komprehensif tentang API dan penggunaannya.
Menyiapkan rendering ke satu layar
Buka perangkat DRM (
/dev/dri/card*) dan gunakan DRM API Linux (misalnya melaluilibdrm) pada deskriptor filenya untuk memilih layar dan modenya.Biasanya, sistem host hanya akan mengekspos satu perangkat GPU virtual, yang akan muncul sebagai
/dev/dri/card0.Mengalokasikan buffer depan dan belakang dengan Linux DRM API.
Sebaiknya gunakan
gbm_bo_create()minigbmdan dapatkan deskriptor file DMA-BUF dengangbm_bo_get_fd().Buat framebuffer GL yang didukung oleh buffer yang dialokasikan.
Buat
EGLImagedari buffer DRM denganeglCreateImageKHRdenganEGL_LINUX_DMA_BUF_EXT(dari ekstensiEGL_EXT_image_dma_buf_import).Buat tekstur GL dan gunakan
glEGLImageTargetTexture2DOES(dari ekstensiGL_OES_EGL_image) untuk menyetel penyimpanan tekstur keEGLImagedari langkah sebelumnya.Buat framebuffer GL dan gunakan
glFramebufferTexture2Duntuk menyetel tekstur pendukungnya ke tekstur yang dibuat pada langkah sebelumnya.
Untuk merender frame:
Ikat salah satu framebuffer GL yang dibuat.
Gambar frame dengan API GLES biasa.
Menampilkan frame di layar: gunakan Linux DRM API (
drmModeAtomicCommit()) untuk mengirimDRM_MODE_PAGE_FLIP_EVENTdengan deskriptor file DMA-BUF yang digunakan oleh framebuffer GL terikat.
Menyusun output video dari beberapa lapisan
Untuk komposisi multi-layer (multi-plane) yang dipercepat hardware, kami mengandalkan sistem host yang mengekspos setiap layer sebagai konektor DRM terpisah (tampilan virtual), dan memetakannya ke lokasi / pipeline hardware yang tepat.
Lihat Menyiapkan rendering ke beberapa layar untuk mengetahui detailnya.
Menyiapkan rendering ke beberapa layar
Buka perangkat DRM
/dev/dri/card*seperti pada alur satu layar.Mencantumkan konektor layar yang tersedia.
Setiap layar diekspos sebagai konektor DRM terpisah dari perangkat DRM.
Untuk setiap konektor layar:
Pilih CRTC yang kompatibel dengan konektor. Setiap konektor memiliki daftar encoder yang tersedia, dan setiap encoder menunjukkan CRTC yang dapat digunakan. Setidaknya akan selalu ada satu CRTC yang kompatibel.
Pilih pesawat yang kompatibel dengan CRTC.
Buat framebuffer DRM yang didukung oleh buffer GPU. Proses ini terlihat sama seperti untuk varian layar tunggal.
Hubungkan bidang, CRTC, dan konektor, lalu tetapkan mode video di CRTC.
Anda dapat menyetel mode beberapa layar secara bersamaan dengan menggunakan API atomik untuk menyetel properti DRM berikut untuk setiap konektor, CRTC, dan set bidang.
Daftar lengkap properti yang diperlukan:
Target Properti Jenis Deskripsi konektor CRTC_IDID CRTC ID CRTC yang akan ditetapkan ke konektor CRTC MODE_IDID blob ID blob properti yang dibuat menggunakan drmModeCreatePropertyBlob, yang berisi structdrmModeModeInfodari mode video yang dipilihCRTC ACTIVEbool trueuntuk menandai CRTC sebagai aktifpesawat FB_IDID framebuffer ID framebuffer DRM yang akan ditampilkan di layar pesawat SRC_Xpiksel Koordinat X persegi panjang gambar sumber framebuffer pesawat SRC_Ypiksel Koordinat Y persegi panjang gambar sumber framebuffer pesawat SRC_WTitik tetap 16.16 lebar persegi panjang gambar sumber framebuffer (piksel digeser ke kiri sebesar 16 bit) pesawat SRC_HTitik tetap 16.16 tinggi persegi panjang gambar sumber framebuffer (piksel digeser ke kiri sebesar 16 bit) pesawat CRTC_Xpiksel Koordinat X persegi panjang gambar tujuan CRTC pesawat CRTC_Ypiksel Koordinat Y persegi panjang gambar tujuan CRTC pesawat CRTC_Wpiksel lebar persegi panjang gambar tujuan CRTC pesawat CRTC_Hpiksel tinggi persegi panjang gambar tujuan CRTC Masukkan loop render:
Tunggu peristiwa balik halaman di CRTC sebelum merender frame berikutnya.
Merender frame dan menampilkannya di layar dengan menjadwalkan penggantian halaman untuk CRTC+framebuffer tertentu.