SDV Media: Ekranları yönetme

SDV Media, Linux DRM API'si ile kullanılabilir ekranları OEM uygulamalarına sunar.

DRM bileşenleri arasındaki etkileşim

Şekil 1. DRM bileşenleri arasındaki etkileşim.

  • Framebuffer, harici olarak ayrılmış bir bellek arabelleğiyle desteklenen bir piksel verisi kaynağıdır.

  • Düzlem, CRTC tarafından kullanılan bir görüntü 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 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.

  • Bir kodlayıcı, CRTC'den gelen video çıkışını belirli bir bağlayıcıya 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 Linux DRM API'lerini kullanın. Örneğin, libdrm aracılığıyla dosya tanımlayıcısında ekranı ve modunu seçin.

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

  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 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'yı (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 bulunur.

      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 ÖzellikTürAçıklama
    Bağ KurucuCRTC_IDCRTC kimliğiBağlayıcıya atanacak CRTC kimliği
    CRTCMODE_IDBlob kimliği Seçilen video modunun drmModeModeInfo yapısını içeren, drmModeCreatePropertyBlob kullanılarak oluşturulan bir özellik blob'unun kimliği
    CRTCACTIVEBooleCRTC'yi etkin olarak işaretlemek için true
    UçakFB_IDFramebuffer kimliğiEkranda gösterilecek DRM çerçeve arabelleğinin kimliği
    UçakSRC_XPiksellerÇerçeve arabelleği kaynak görüntü dikdörtgeninin X koordinatı
    UçakSRC_YPiksellerÇerçeve arabelleği kaynak görüntü dikdörtgeninin y koordinatı
    UçakSRC_W16.16 sabit noktaFramebuffer kaynak görüntü dikdörtgeninin genişliği (16 bit sola kaydırılmış pikseller)
    UçakSRC_H16.16 sabit noktaFramebuffer kaynak görüntü dikdörtgeninin yüksekliği (16 bit sola kaydırılmış pikseller)
    UçakCRTC_XPiksellerCRTC hedef resim dikdörtgeninin x koordinatı
    UçakCRTC_YPiksellerCRTC hedef resim dikdörtgeninin Y koordinatı
    UçakCRTC_WPiksellerCRTC hedef resim dikdörtgeninin genişliği
    UçakCRTC_HPiksellerCRTC 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.