SDV Media: مدیریت نمایشگرها

SDV Media نمایشگرهای موجود را با استفاده از رابط برنامه‌نویسی کاربردی DRM لینوکس در اختیار برنامه‌های OEM قرار می‌دهد.

تعامل بین اجزای DRM

شکل ۱. تعامل بین اجزای DRM.

  • یک فریم‌بافر منبعی از داده‌های پیکسلی است که توسط یک بافر حافظه خارجی پشتیبانی می‌شود.

  • یک صفحه (plane) یک منبع تصویر است که توسط CRTC استفاده می‌شود. این صفحه با یک فریم‌بافر (framebuffer) مرتبط است و می‌تواند یک نمای برش‌خورده از فریم‌بافر را نشان دهد.

  • CRTC یک خط لوله نمایش کلی را نشان می‌دهد. این خط لوله می‌تواند چندین صفحه را برای ایجاد خروجی ویدیوی نهایی ترکیب کند و خروجی را به چندین رمزگذار ارسال کند.

  • یک رمزگذار، خروجی ویدئو را از CRTC به شکلی مناسب برای کانکتور خاص تبدیل می‌کند.

  • یک کانکتور، نشان دهنده یک کانکتور نمایشگر موجود است. به عنوان مثال، یک پورت HDMI.

برای توضیحات بیشتر و عمیق‌تر، رجوع کنید به:

سطح API

SDV Media رابط‌های DRM لینوکس را ارائه می‌دهد. اگرچه می‌توان آنها را مستقیماً با استفاده از ioctl syscall استفاده کرد، اما برای توسعه برنامه توصیه می‌شود از یک کتابخانه کمکی فضای کاربر استفاده شود. به عنوان مثال:

رندر را روی یک نمایشگر واحد تنظیم کنید

  1. یک دستگاه DRM ( /dev/dri/card* ) را باز کنید و از APIهای DRM لینوکس، مثلاً از طریق libdrm ، در توصیف‌گر فایل آن، برای انتخاب نمایش و حالت آن استفاده کنید.

    معمولاً سیستم میزبان فقط یک دستگاه GPU مجازی را در معرض نمایش قرار می‌دهد که به صورت /dev/dri/card0 نمایش داده می‌شود.

  2. بافرهای جلویی و پشتی را با رابط برنامه‌نویسی کاربردی DRM لینوکس اختصاص دهید.

    توصیه می‌شود از تابع gbm_bo_create() در minigbm استفاده کنید و توصیفگر فایل DMA-BUF را با gbm_bo_get_fd() دریافت کنید.

  3. فریم‌بافرهای GL را که توسط بافرهای اختصاص داده شده پشتیبانی می‌شوند، ایجاد کنید.

    1. با استفاده از eglCreateImageKHR و EGL_LINUX_DMA_BUF_EXT (از افزونه EGL_EXT_image_dma_buf_import )، یک EGLImage از بافر DRM ایجاد کنید.

    2. یک بافت GL ایجاد کنید و از glEGLImageTargetTexture2DOES (از افزونه GL_OES_EGL_image ) برای تنظیم فضای ذخیره‌سازی بافت روی EGLImage از مرحله قبل استفاده کنید.

    3. یک GL framebuffer ایجاد کنید و glFramebufferTexture2D برای تنظیم بافت پشتی آن روی بافتی که در مرحله قبل ایجاد کرده‌اید، استفاده کنید.

  4. برای رندر کردن یک فریم:

    1. یکی از فریم‌بافرهای GL ایجاد شده را متصل کنید.

    2. یک فریم با API های معمول GLES رسم کنید.

    3. نمایش فریم روی صفحه: از رابط برنامه‌نویسی کاربردی DRM لینوکس ( drmModeAtomicCommit() ) برای ارسال DRM_MODE_PAGE_FLIP_EVENT به همراه توصیف‌گر فایل DMA-BUF که توسط بافر فریم GL محدود شده استفاده می‌شود، استفاده کنید.

خروجی ویدیو را از چندین لایه تهیه کنید

برای ترکیب چندلایه (چندصفحه‌ای) با شتاب‌دهنده سخت‌افزاری، ما به سیستم میزبان متکی هستیم که هر لایه را به عنوان یک رابط DRM جداگانه (نمایش مجازی) نمایش می‌دهد و آنها را به مکان/خط لوله سخت‌افزاری مناسب نگاشت می‌کند.

برای جزئیات بیشتر به بخش «تنظیمات رندرینگ برای چندین نمایشگر» مراجعه کنید.

تنظیم رندر برای چندین نمایشگر

  1. دستگاه DRM /dev/dri/card* را مانند جریان تک نمایشگر باز کنید.

  2. کانکتورهای نمایشگر موجود را فهرست کنید.

    هر نمایشگر به عنوان یک رابط DRM جداگانه از دستگاه DRM نمایش داده می‌شود.

  3. برای هر کانکتور نمایشگر:

    1. یک CRTC سازگار با کانکتور انتخاب کنید. هر کانکتور لیستی از انکودرهای موجود دارد و هر انکودر نشان می‌دهد که با کدام CRTCها قابل استفاده است. همیشه حداقل یک CRTC سازگار وجود دارد.

      1. یک صفحه نمایش سازگار با CRTC انتخاب کنید.

      2. فریم‌بافرهای DRM را که توسط بافرهای GPU پشتیبانی می‌شوند، ایجاد کنید. این فرآیند مشابه نوع تک نمایشگری است.

      3. صفحه، CRTC و کانکتور را وصل کنید و حالت ویدیو را روی CRTC تنظیم کنید.

        می‌توان با استفاده از API اتمی برای تنظیم ویژگی‌های DRM زیر برای هر کانکتور، CRTC و مجموعه صفحه، حالت چندین نمایشگر را به طور همزمان تنظیم کرد.

    لیست کامل خواص مورد نیاز:

    هدف ملک نوع توضیحات
    کانکتور CRTC_ID شناسه CRTC شناسه CRTC برای اختصاص به کانکتور
    سی آر تی سی MODE_ID شناسه لکه شناسه‌ی یک بلوک ویژگی که با استفاده از drmModeCreatePropertyBlob ایجاد شده و حاوی ساختار drmModeModeInfo مربوط به حالت ویدیوی انتخاب شده است.
    سی آر تی سی ACTIVE بولی برای فعال نشان دادن CRTC، true
    هواپیما FB_ID شناسه فریم بافر شناسه‌ی بافر فریم DRM برای نمایش روی صفحه
    هواپیما SRC_X پیکسل‌ها مختصات X مستطیل تصویر منبع framebuffer
    هواپیما SRC_Y پیکسل‌ها مختصات Y مستطیل تصویر منبع فریم بافر
    هواپیما SRC_W ۱۶.۱۶ نقطه ثابت عرض مستطیل تصویر منبع فریم بافر (پیکسل‌ها به اندازه ۱۶ بیت به سمت چپ منتقل شده‌اند)
    هواپیما SRC_H ۱۶.۱۶ نقطه ثابت ارتفاع مستطیل تصویر منبع فریم بافر (پیکسل‌ها ۱۶ بیت به سمت چپ منتقل شده‌اند)
    هواپیما CRTC_X پیکسل‌ها مختصات X مستطیل تصویر مقصد CRTC
    هواپیما CRTC_Y پیکسل‌ها مختصات Y مستطیل تصویر مقصد CRTC
    هواپیما CRTC_W پیکسل‌ها عرض مستطیل تصویر مقصد CRTC
    هواپیما CRTC_H پیکسل‌ها ارتفاع مستطیل تصویر مقصد CRTC
  4. وارد حلقه رندر شوید:

    1. قبل از رندر کردن فریم بعدی، منتظر رویداد ورق زدن صفحه در CRTC باشید.

    2. یک فریم را رندر کنید و با زمان‌بندی ورق زدن صفحه برای CRTC+framebuffer داده شده، آن را روی صفحه نمایش دهید.