SDV Media: ניהול תצוגות

‫SDV Media חושף תצוגות זמינות לאפליקציות OEM עם Linux DRM API.

אינטראקציה בין רכיבי DRM

איור 1. אינטראקציה בין רכיבי DRM.

  • מאגר מסגרות הוא מקור של נתוני פיקסלים, שמגובה על ידי מאגר זיכרון שהוקצה חיצונית.

  • מישור הוא מקור תמונה שמשמש את CRTC. הוא משויך למאגר מסגרות, ויכול לייצג תצוגה חתוכה של מאגר המסגרות.

  • CRTC מייצג צינור עיבוד נתונים כולל של מודעות לרשת המדיה. הוא יכול לשלב בין כמה מישורים כדי ליצור את פלט הווידאו הסופי, ולשלוח את הפלט לכמה מקודדים.

  • מקודד ממיר את פלט הווידאו מ-CRTC לפורמט שמתאים לחיבור ספציפי.

  • מחבר מייצג מחבר מסך זמין. לדוגמה, יציאת HDMI.

לתיאור מפורט יותר, אפשר לעיין במאמרים הבאים:

פלטפורמת ה-API

‫SDV Media מספקת את ממשקי ה-DRM של Linux. אפשר להשתמש בהם ישירות באמצעות ioctl syscall, אבל מומלץ להשתמש בספריית עזר במרחב המשתמשים לפיתוח אפליקציות. לדוגמה:

  • drm-rs crate ל-Rust (מומלץ),
  • libdrm ל-C/C++. בדף man של drm-kms מופיעה סקירה כללית מקיפה של ממשקי ה-API ושל אופן השימוש בהם.

הגדרת רינדור למסך אחד

  1. פותחים מכשיר DRM ‏ (/dev/dri/card*) ומשתמשים בממשקי API של Linux DRM, למשל, דרך libdrm, בתיאור הקובץ שלו כדי לבחור את התצוגה ואת המצב שלה.

    בדרך כלל, מערכת המארח חושפת רק מכשיר GPU וירטואלי אחד, שמופיע בתור /dev/dri/card0.

  2. הקצאת מאגרי חזיתיים ואחוריים באמצעות Linux DRM API.

    מומלץ להשתמש ב-minigbm‎'s gbm_bo_create() ולקבל את מתאר הקובץ DMA-BUF באמצעות gbm_bo_get_fd().

  3. יצירת מאגרי מסגרות GL שמגובים על ידי מאגרי הנתונים שהוקצו.

    1. יצירת EGLImage ממאגר הנתונים הזמני של DRM באמצעות eglCreateImageKHR עם EGL_LINUX_DMA_BUF_EXT (מהתוסף EGL_EXT_image_dma_buf_import).

    2. יוצרים טקסטורה של GL ומשתמשים ב-glEGLImageTargetTexture2DOES (מהתוסף GL_OES_EGL_image) כדי להגדיר את האחסון של הטקסטורה ל-EGLImage מהשלב הקודם.

    3. יוצרים מאגר מסגרות GL ומשתמשים ב-glFramebufferTexture2D כדי להגדיר את מרקם הגיבוי שלו למרקם שנוצר בשלב הקודם.

  4. כדי לעבד פריים:

    1. מבצעים קישור לאחד ממאגרי הפריימים של GL שנוצרו.

    2. מציירים פריים באמצעות ממשקי ה-API הרגילים של GLES.

    3. הצגת הפריים במסך: משתמשים ב-Linux DRM API ‏(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 וקבוצת מישורים.

    הרשימה המלאה של המאפיינים הנדרשים:

    יעד מאפיין (property)סוגתיאור
    גשר בין אנשיםCRTC_IDCRTC IDהמזהה של ה-CRTC שיוקצה למחבר
    CRTCMODE_IDמזהה Blob המזהה של blob של מאפיין שנוצר באמצעות drmModeCreatePropertyBlob, שמכיל את מבנה הנתונים drmModeModeInfo של מצב הסרטון שנבחר
    CRTCACTIVEבוליאני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
  4. מזינים את לולאת הרינדור:

    1. צריך להמתין לאירוע של החלפת הדף ב-CRTC לפני שמבצעים רינדור של הפריים הבא.

    2. רינדור של פריים והצגה שלו על המסך על ידי תזמון של החלפת דף עבור CRTC+framebuffer נתון.