SDV Media חושף תצוגות זמינות לאפליקציות OEM עם Linux DRM API.
איור 1. אינטראקציה בין רכיבי DRM.
מאגר מסגרות הוא מקור של נתוני פיקסלים, שמגובה על ידי מאגר זיכרון שהוקצה חיצונית.
מישור הוא מקור תמונה שמשמש את CRTC. הוא משויך למאגר מסגרות, ויכול לייצג תצוגה חתוכה של מאגר המסגרות.
CRTC מייצג צינור עיבוד נתונים כולל של מודעות לרשת המדיה. הוא יכול לשלב בין כמה מישורים כדי ליצור את פלט הווידאו הסופי, ולשלוח את הפלט לכמה מקודדים.
מקודד ממיר את פלט הווידאו מ-CRTC לפורמט שמתאים לחיבור ספציפי.
מחבר מייצג מחבר מסך זמין. לדוגמה, יציאת HDMI.
לתיאור מפורט יותר, אפשר לעיין במאמרים הבאים:
פלטפורמת ה-API
SDV Media מספקת את ממשקי ה-DRM של Linux. אפשר להשתמש בהם ישירות באמצעות ioctl syscall, אבל מומלץ להשתמש בספריית עזר במרחב המשתמשים לפיתוח אפליקציות. לדוגמה:
-
drm-rscrate ל-Rust (מומלץ), -
libdrmל-C/C++. בדף man שלdrm-kmsמופיעה סקירה כללית מקיפה של ממשקי ה-API ושל אופן השימוש בהם.
הגדרת רינדור למסך אחד
פותחים מכשיר DRM (
/dev/dri/card*) ומשתמשים בממשקי API של Linux DRM, למשל, דרךlibdrm, בתיאור הקובץ שלו כדי לבחור את התצוגה ואת המצב שלה.בדרך כלל, מערכת המארח חושפת רק מכשיר GPU וירטואלי אחד, שמופיע בתור
/dev/dri/card0.הקצאת מאגרי חזיתיים ואחוריים באמצעות Linux DRM API.
מומלץ להשתמש ב-
minigbm'sgbm_bo_create()ולקבל את מתאר הקובץ DMA-BUF באמצעותgbm_bo_get_fd().יצירת מאגרי מסגרות GL שמגובים על ידי מאגרי הנתונים שהוקצו.
יצירת
EGLImageממאגר הנתונים הזמני של DRM באמצעותeglCreateImageKHRעםEGL_LINUX_DMA_BUF_EXT(מהתוסףEGL_EXT_image_dma_buf_import).יוצרים טקסטורה של GL ומשתמשים ב-
glEGLImageTargetTexture2DOES(מהתוסףGL_OES_EGL_image) כדי להגדיר את האחסון של הטקסטורה ל-EGLImageמהשלב הקודם.יוצרים מאגר מסגרות GL ומשתמשים ב-
glFramebufferTexture2Dכדי להגדיר את מרקם הגיבוי שלו למרקם שנוצר בשלב הקודם.
כדי לעבד פריים:
מבצעים קישור לאחד ממאגרי הפריימים של GL שנוצרו.
מציירים פריים באמצעות ממשקי ה-API הרגילים של GLES.
הצגת הפריים במסך: משתמשים ב-Linux DRM API (
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 וקבוצת מישורים.
הרשימה המלאה של המאפיינים הנדרשים:
יעד מאפיין (property) סוג תיאור גשר בין אנשים CRTC_IDCRTC ID המזהה של ה-CRTC שיוקצה למחבר CRTC MODE_IDמזהה Blob המזהה של blob של מאפיין שנוצר באמצעות drmModeCreatePropertyBlob, שמכיל את מבנה הנתוניםdrmModeModeInfoשל מצב הסרטון שנבחרCRTC ACTIVEבוליאני trueכדי לסמן את CRTC כפעילמטוס FB_IDמזהה של מאגר מסגרות המזהה של מאגר המסגרות של DRM שיוצג על המסך מטוס SRC_Xפיקסלים קואורדינטת ה-X של מלבן תמונת המקור של מאגר המסגרות מטוס SRC_Yפיקסלים קואורדינטת ה-Y של המלבן של תמונת המקור של מאגר המסגרות מטוס SRC_Wנקודה קבועה 16.16 רוחב המלבן של תמונת המקור של מאגר המסגרות (פיקסלים שהוסטו שמאלה ב-16 ביטים) מטוס SRC_Hנקודה קבועה 16.16 גובה המלבן של תמונת המקור של מאגר המסגרות (פיקסלים שהוסטו שמאלה ב-16 ביטים) מטוס CRTC_Xפיקסלים קואורדינטת ה-X של המלבן של תמונת היעד של CRTC מטוס CRTC_Yפיקסלים קואורדינטת ה-Y של המלבן של תמונת היעד של CRTC מטוס CRTC_Wפיקסלים רוחב המלבן של תמונת היעד של ה-CRTC מטוס CRTC_Hפיקסלים הגובה של המלבן של תמונת היעד של CRTC מזינים את לולאת הרינדור:
צריך להמתין לאירוע של החלפת הדף ב-CRTC לפני שמבצעים רינדור של הפריים הבא.
רינדור של פריים והצגה שלו על המסך על ידי תזמון של החלפת דף עבור CRTC+framebuffer נתון.