SDV Media نمایشگرهای موجود را با استفاده از رابط برنامهنویسی کاربردی DRM لینوکس در اختیار برنامههای OEM قرار میدهد.
شکل ۱. تعامل بین اجزای DRM.
یک فریمبافر منبعی از دادههای پیکسلی است که توسط یک بافر حافظه خارجی پشتیبانی میشود.
یک صفحه (plane) یک منبع تصویر است که توسط CRTC استفاده میشود. این صفحه با یک فریمبافر (framebuffer) مرتبط است و میتواند یک نمای برشخورده از فریمبافر را نشان دهد.
CRTC یک خط لوله نمایش کلی را نشان میدهد. این خط لوله میتواند چندین صفحه را برای ایجاد خروجی ویدیوی نهایی ترکیب کند و خروجی را به چندین رمزگذار ارسال کند.
یک رمزگذار، خروجی ویدئو را از CRTC به شکلی مناسب برای کانکتور خاص تبدیل میکند.
یک کانکتور، نشان دهنده یک کانکتور نمایشگر موجود است. به عنوان مثال، یک پورت HDMI.
برای توضیحات بیشتر و عمیقتر، رجوع کنید به:
سطح API
SDV Media رابطهای DRM لینوکس را ارائه میدهد. اگرچه میتوان آنها را مستقیماً با استفاده از ioctl syscall استفاده کرد، اما برای توسعه برنامه توصیه میشود از یک کتابخانه کمکی فضای کاربر استفاده شود. به عنوان مثال:
- جعبه
drm-rsبرای Rust (توصیه میشود)، -
libdrmبرای C/C++. صفحه راهنمایdrm-kmsمروری جامع بر APIها و کاربرد آنها ارائه میدهد.
رندر را روی یک نمایشگر واحد تنظیم کنید
یک دستگاه DRM (
/dev/dri/card*) را باز کنید و از APIهای DRM لینوکس، مثلاً از طریقlibdrm، در توصیفگر فایل آن، برای انتخاب نمایش و حالت آن استفاده کنید.معمولاً سیستم میزبان فقط یک دستگاه GPU مجازی را در معرض نمایش قرار میدهد که به صورت
/dev/dri/card0نمایش داده میشود.بافرهای جلویی و پشتی را با رابط برنامهنویسی کاربردی DRM لینوکس اختصاص دهید.
توصیه میشود از تابع
gbm_bo_create()درminigbmاستفاده کنید و توصیفگر فایل DMA-BUF را باgbm_bo_get_fd()دریافت کنید.فریمبافرهای GL را که توسط بافرهای اختصاص داده شده پشتیبانی میشوند، ایجاد کنید.
با استفاده از
eglCreateImageKHRوEGL_LINUX_DMA_BUF_EXT(از افزونهEGL_EXT_image_dma_buf_import)، یکEGLImageاز بافر DRM ایجاد کنید.یک بافت GL ایجاد کنید و از
glEGLImageTargetTexture2DOES(از افزونهGL_OES_EGL_image) برای تنظیم فضای ذخیرهسازی بافت رویEGLImageاز مرحله قبل استفاده کنید.یک GL framebuffer ایجاد کنید و
glFramebufferTexture2Dبرای تنظیم بافت پشتی آن روی بافتی که در مرحله قبل ایجاد کردهاید، استفاده کنید.
برای رندر کردن یک فریم:
یکی از فریمبافرهای GL ایجاد شده را متصل کنید.
یک فریم با API های معمول GLES رسم کنید.
نمایش فریم روی صفحه: از رابط برنامهنویسی کاربردی DRM لینوکس (
drmModeAtomicCommit()) برای ارسالDRM_MODE_PAGE_FLIP_EVENTبه همراه توصیفگر فایل DMA-BUF که توسط بافر فریم GL محدود شده استفاده میشود، استفاده کنید.
خروجی ویدیو را از چندین لایه تهیه کنید
برای ترکیب چندلایه (چندصفحهای) با شتابدهنده سختافزاری، ما به سیستم میزبان متکی هستیم که هر لایه را به عنوان یک رابط DRM جداگانه (نمایش مجازی) نمایش میدهد و آنها را به مکان/خط لوله سختافزاری مناسب نگاشت میکند.
برای جزئیات بیشتر به بخش «تنظیمات رندرینگ برای چندین نمایشگر» مراجعه کنید.
تنظیم رندر برای چندین نمایشگر
دستگاه DRM
/dev/dri/card*را مانند جریان تک نمایشگر باز کنید.کانکتورهای نمایشگر موجود را فهرست کنید.
هر نمایشگر به عنوان یک رابط DRM جداگانه از دستگاه DRM نمایش داده میشود.
برای هر کانکتور نمایشگر:
یک CRTC سازگار با کانکتور انتخاب کنید. هر کانکتور لیستی از انکودرهای موجود دارد و هر انکودر نشان میدهد که با کدام CRTCها قابل استفاده است. همیشه حداقل یک CRTC سازگار وجود دارد.
یک صفحه نمایش سازگار با CRTC انتخاب کنید.
فریمبافرهای DRM را که توسط بافرهای GPU پشتیبانی میشوند، ایجاد کنید. این فرآیند مشابه نوع تک نمایشگری است.
صفحه، 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 وارد حلقه رندر شوید:
قبل از رندر کردن فریم بعدی، منتظر رویداد ورق زدن صفحه در CRTC باشید.
یک فریم را رندر کنید و با زمانبندی ورق زدن صفحه برای CRTC+framebuffer داده شده، آن را روی صفحه نمایش دهید.