SDV Media: Ekranları yönetme

SDV Media, Linux DRM API ile kullanılabilen ekranları OEM uygulamalarına sunar.

DRM bileşenleri arasındaki etkileşim

  • 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-rs sandığı (önerilir),
  • C/C++ için libdrm. drm-kms man sayfası, API'ler ve bunların kullanımı hakkında kapsamlı bir genel bakış sunar.

Tek bir ekranda oluşturmayı ayarlama

  1. 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. libdrm aracılığıyla) kullanın.

    Genellikle, ana sistem yalnızca tek bir sanal GPU cihazı kullanıma sunar. Bu cihaz /dev/dri/card0 olarak gösterilir.

  2. Linux DRM API ile ön ve arka arabellekler ayırın.

    minigbm gbm_bo_create() kullanmanız ve gbm_bo_get_fd() ile DMA-BUF dosya tanımlayıcısını almanız önerilir.

  3. Ayrılan arabellekler tarafından desteklenen GL çerçeve arabellekleri oluşturun.

    1. EGL_LINUX_DMA_BUF_EXT ile eglCreateImageKHR kullanarak DRM arabelleğinden EGLImage oluşturun (EGL_EXT_image_dma_buf_import uzantısından).

    2. GL dokusu oluşturun ve dokunun depolama alanını önceki adımdaki EGLImage olarak ayarlamak için glEGLImageTargetTexture2DOES (GL_OES_EGL_image uzantısından) kullanın.

    3. GL çerçeve arabelleği oluşturun ve glFramebufferTexture2D kullanarak destek dokusunu önceki adımda oluşturulan doku olarak ayarlayın.

  4. Bir kareyi oluşturmak için:

    1. Oluşturulan GL çerçeve arabelleklerinden birini bağlayın.

    2. Normal GLES API'leriyle bir çerçeve çizin.

    3. 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_EVENT gö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

  1. Tek ekranlı akışta olduğu gibi /dev/dri/card* DRM cihazını açın.

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

  3. Her ekran bağlayıcısı için:

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

      1. CRTC ile uyumlu bir uçak seçin.

      2. GPU arabellekleri tarafından desteklenen DRM çerçeve arabellekleri oluşturun. Bu işlem, tek ekranlı varyant için de aynıdır.

      3. 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_ID CRTC kimliği Bağlayıcıya atanacak CRTC kimliği
    CRTC MODE_ID BLOB kimliği Seçilen video modunun drmModeModeInfo yapısını içeren, drmModeCreatePropertyBlob kullanılarak oluşturulan bir özellik blob'unun kimliği
    CRTC ACTIVE bool true seçeneğini belirleyerek CRTC'yi etkinleştirin.
    uçak FB_ID framebuffer ID Ekranda gösterilecek DRM çerçeve arabelleğinin kimliği
    uçak SRC_X piksel Çerçeve arabelleği kaynak görüntü dikdörtgeninin X koordinatı
    uçak SRC_Y piksel Çerçeve arabelleği kaynak görüntü dikdörtgeninin y koordinatı
    uçak SRC_W 16.16 sabit nokta framebuffer kaynak resim dikdörtgeninin genişliği (piksel, 16 bit sola kaydırılmış)
    uçak SRC_H 16.16 sabit nokta Framebuffer kaynak resim dikdörtgeninin yüksekliği (16 bit sola kaydırılmış pikseller)
    uçak CRTC_X piksel CRTC hedef resim dikdörtgeninin X koordinatı
    uçak CRTC_Y piksel CRTC hedef resim dikdörtgeninin Y koordinatı
    uçak CRTC_W piksel CRTC hedef resim dikdörtgeninin genişliği
    uçak CRTC_H piksel CRTC hedef resim dikdörtgeninin yüksekliği
  4. Render döngüsünü girin:

    1. Sonraki kareyi oluşturmadan önce bir CRTC'de sayfa çevirme etkinliğini bekleyin.

    2. Belirli CRTC+framebuffer için sayfa çevirme planlayarak bir kare oluşturun ve ekranda görüntüleyin.