SDV Media, Linux DRM API ile kullanılabilen ekranları OEM uygulamalarına sunar.
Framebuffer, harici olarak ayrılmış bir bellek arabelleği tarafından desteklenen piksel verilerinin kaynağıdır.
Plane, CRTC tarafından kullanılan bir resim kaynağıdır. Bir çerçeve arabelleğiyle ilişkilendirilir ve çerçeve arabelleğinin kırpılmış bir görünümünü temsil edebilir.
CRTC, genel bir görüntüleme işlem hattını temsil eder. Son video çıkışını oluşturmak için birden fazla düzlemi birleştirebilir ve çıkışı birden fazla kodlayıcıya gönderebilir.
Kodlayıcı, CRTC'den gelen video çıkışını belirli bir konnektöre uygun bir biçime dönüştürür.
Bağlayıcı, kullanılabilir bir ekran bağlayıcısını temsil eder. Örneğin, bir HDMI bağlantı noktası.
Daha ayrıntılı açıklama için aşağıdaki makaleyi inceleyin:
API yüzeyi
SDV Media, Linux DRM arayüzlerini sağlar. Doğrudan ioctl syscall kullanılarak kullanılabilse de uygulama geliştirme için kullanıcı alanı yardımcı kitaplığı kullanılması önerilir. Örneğin:
- Rust için
drm-rssandığı (önerilir), - C/C++ için
libdrm.drm-kmsman sayfası, API'ler ve bunların kullanımı hakkında kapsamlı bir genel bakış sunar.
Tek bir ekranda oluşturmayı ayarlama
Bir DRM cihazı (
/dev/dri/card*) açın ve ekranı ve modunu seçmek için dosya tanımlayıcısında Linux DRM API'lerini (ör.libdrmaracılığıyla) kullanın.Genellikle, ana sistem yalnızca tek bir sanal GPU cihazı kullanıma sunar. Bu cihaz
/dev/dri/card0olarak gösterilir.Linux DRM API ile ön ve arka arabellekler ayırın.
minigbmgbm_bo_create()kullanmanız vegbm_bo_get_fd()ile DMA-BUF dosya tanımlayıcısını almanız önerilir.Ayrılan arabellekler tarafından desteklenen GL çerçeve arabellekleri oluşturun.
EGL_LINUX_DMA_BUF_EXTileeglCreateImageKHRkullanarak DRM arabelleğindenEGLImageoluşturun (EGL_EXT_image_dma_buf_importuzantısından).GL dokusu oluşturun ve dokunun depolama alanını önceki adımdaki
EGLImageolarak ayarlamak içinglEGLImageTargetTexture2DOES(GL_OES_EGL_imageuzantısından) kullanın.GL çerçeve arabelleği oluşturun ve
glFramebufferTexture2Dkullanarak destek dokusunu önceki adımda oluşturulan doku olarak ayarlayın.
Bir kareyi oluşturmak için:
Oluşturulan GL çerçeve arabelleklerinden birini bağlayın.
Normal GLES API'leriyle bir çerçeve çizin.
Kareyi ekranda gösterme: Bağlı GL çerçeve arabelleği tarafından kullanılan DMA-BUF dosya tanımlayıcısıyla
DRM_MODE_PAGE_FLIP_EVENTgöndermek için Linux DRM API'sini (drmModeAtomicCommit()) kullanın.
Birden fazla katmandan video çıktısı oluşturma
Donanım hızlandırmalı çok katmanlı (çok düzlemli) kompozisyon için, her katmanı ayrı bir DRM bağlayıcısı (sanal ekran) olarak sunan ve bunları doğru donanım konumuna / işlem hattına eşleyen ana bilgisayar sistemine güveniriz.
Ayrıntılar için Görüntülemeyi birden fazla ekranda ayarlama başlıklı makaleyi inceleyin.
Birden fazla ekranda görüntü oluşturmayı ayarlama
Tek ekranlı akışta olduğu gibi
/dev/dri/card*DRM cihazını açın.Kullanılabilir ekran bağlayıcılarını listeleyin.
Her ekran, DRM cihazının ayrı bir DRM bağlayıcısı olarak gösterilir.
Her ekran bağlayıcısı için:
Bağlayıcıyla uyumlu bir CRTC seçin. Her bağlayıcının kullanılabilir kodlayıcıların listesi vardır ve her kodlayıcı, hangi CRTC'lerle kullanılabileceğini belirtir. Her zaman en az bir uyumlu CRTC olacaktır.
CRTC ile uyumlu bir uçak seçin.
GPU arabellekleri tarafından desteklenen DRM çerçeve arabellekleri oluşturun. Bu işlem, tek ekranlı varyant için de aynıdır.
Düzlemi, CRTC'yi ve bağlayıcıyı bağlayın ve CRTC'de video modunu ayarlayın.
Her bağlayıcı, CRTC ve düzlem seti için aşağıdaki DRM özelliklerini ayarlamak üzere atomik API'yi kullanarak birden fazla ekranın modunu aynı anda ayarlayabilirsiniz.
Gerekli özelliklerin tam listesi:
Hedef Özellik Tür Açıklama konnektör CRTC_IDCRTC kimliği Bağlayıcıya atanacak CRTC kimliği CRTC MODE_IDBLOB kimliği Seçilen video modunun drmModeModeInfoyapısını içeren,drmModeCreatePropertyBlobkullanılarak oluşturulan bir özellik blob'unun kimliğiCRTC ACTIVEbool trueseçeneğini belirleyerek CRTC'yi etkinleştirin.uçak FB_IDframebuffer ID Ekranda gösterilecek DRM çerçeve arabelleğinin kimliği uçak SRC_Xpiksel Çerçeve arabelleği kaynak görüntü dikdörtgeninin X koordinatı uçak SRC_Ypiksel Çerçeve arabelleği kaynak görüntü dikdörtgeninin y koordinatı uçak SRC_W16.16 sabit nokta framebuffer kaynak resim dikdörtgeninin genişliği (piksel, 16 bit sola kaydırılmış) uçak SRC_H16.16 sabit nokta Framebuffer kaynak resim dikdörtgeninin yüksekliği (16 bit sola kaydırılmış pikseller) uçak CRTC_Xpiksel CRTC hedef resim dikdörtgeninin X koordinatı uçak CRTC_Ypiksel CRTC hedef resim dikdörtgeninin Y koordinatı uçak CRTC_Wpiksel CRTC hedef resim dikdörtgeninin genişliği uçak CRTC_Hpiksel CRTC hedef resim dikdörtgeninin yüksekliği Render döngüsünü girin:
Sonraki kareyi oluşturmadan önce bir CRTC'de sayfa çevirme etkinliğini bekleyin.
Belirli CRTC+framebuffer için sayfa çevirme planlayarak bir kare oluşturun ve ekranda görüntüleyin.