SDV Media חושף את התצוגות הזמינות לאפליקציות OEM עם Linux DRM API.
Framebuffer הוא מקור של נתוני פיקסלים, שמגובה על ידי מאגר זיכרון שהוקצה חיצונית.
Plane הוא מקור תמונות שמשמש את CRTC. הוא משויך למאגר מסגרות, ועשוי לייצג תצוגה חתוכה של מאגר המסגרות.
CRTC מייצג צינור כולל של תצוגה. יכול להיות שהמערכת תשלב כמה מישורים כדי ליצור את פלט הסרטון הסופי, ותשלח את הפלט לכמה מקודדים.
מקודד ממיר את פלט הווידאו מ-CRTC לפורמט שמתאים לחיבור ספציפי.
Connector מייצג מחבר תצוגה זמין. לדוגמה, יציאת 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.
מומלץ להשתמש ב-
minigbmsgbm_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 ACTIVEbool trueכדי לסמן את CRTC כפעילמטוס FB_IDמזהה מקטע Frame buffer המזהה של מאגר המסגרות של 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 נתון.