SDV Media: डिसप्ले मैनेज करना

SDV Media, Linux DRM API के साथ ओईएम ऐप्लिकेशन के लिए उपलब्ध डिसप्ले दिखाता है.

डीआरएम कॉम्पोनेंट के बीच इंटरैक्शन

  • फ़्रेमबफ़र, पिक्सल डेटा का सोर्स होता है. इसे बाहरी तौर पर बंटवारा किए गए मेमोरी बफ़र से बैक अप मिलता है.

  • Plane, CRTC की ओर से इस्तेमाल किया जाने वाला इमेज सोर्स है. यह फ़्रेमबफ़र से जुड़ा होता है. यह फ़्रेमबफ़र के काटे गए हिस्से को दिखा सकता है.

  • CRTC, डिसप्ले पाइपलाइन को दिखाता है. यह फ़ाइनल वीडियो आउटपुट बनाने के लिए, कई प्लेन को एक साथ जोड़ सकता है. साथ ही, आउटपुट को कई एनकोडर को भेज सकता है.

  • एन्कोडर, CRTC से मिले वीडियो आउटपुट को ऐसे फ़ॉर्म में बदलता है जो किसी कनेक्टर के लिए सही हो.

  • कनेक्टर, उपलब्ध डिसप्ले कनेक्टर को दिखाता है. उदाहरण के लिए, एचडीएमआई पोर्ट.

ज़्यादा जानकारी के लिए, इन्हें देखें:

एपीआई सरफ़ेस

SDV Media, Linux DRM इंटरफ़ेस उपलब्ध कराता है. इनका इस्तेमाल सीधे तौर पर ioctl syscall का इस्तेमाल करके किया जा सकता है. हालांकि, ऐप्लिकेशन डेवलपमेंट के लिए, userspace हेल्पर लाइब्रेरी का इस्तेमाल करने का सुझाव दिया जाता है. उदाहरण के लिए:

  • Rust के लिए drm-rs क्रेट (सुझाया गया),
  • libdrm C/C++ के लिए. drm-kms मैन पेज में, एपीआई और उनके इस्तेमाल के बारे में पूरी जानकारी दी गई है.

किसी एक डिसप्ले पर रेंडर करने की सुविधा सेट अप करना

  1. DRM डिवाइस (/dev/dri/card*) खोलें और डिसप्ले और उसके मोड को चुनने के लिए, उसके फ़ाइल डिस्क्रिप्टर पर Linux DRM API (जैसे कि libdrm के ज़रिए) का इस्तेमाल करें.

    आम तौर पर, होस्ट सिस्टम सिर्फ़ एक वर्चुअल जीपीयू डिवाइस को दिखाता है. यह /dev/dri/card0 के तौर पर दिखता है.

  2. Linux DRM API की मदद से, फ़्रंट और बैक बफ़र असाइन करें.

    हमारा सुझाव है कि आप minigbm gbm_bo_create() का इस्तेमाल करें और gbm_bo_get_fd() की मदद से, डीएमए-बफ़ फ़ाइल डिस्क्रिप्टर पाएं.

  3. बंटवारा किए गए बफ़र के साथ GL फ़्रेमबफ़र बनाएं.

    1. EGL_EXT_image_dma_buf_import एक्सटेंशन की मदद से, DRM बफ़र से eglCreateImageKHR के साथ EGL_LINUX_DMA_BUF_EXT का इस्तेमाल करके EGLImage बनाएं.

    2. GL टेक्सचर बनाएं और glEGLImageTargetTexture2DOES (GL_OES_EGL_image एक्सटेंशन से) का इस्तेमाल करके, टेक्सचर के स्टोरेज को पिछले चरण के EGLImage पर सेट करें.

    3. एक GL फ़्रेमबफ़र बनाएं और glFramebufferTexture2D का इस्तेमाल करके, उसकी बैकिंग टेक्सचर को पिछले चरण में बनाए गए टेक्सचर पर सेट करें.

  4. किसी फ़्रेम को रेंडर करने के लिए:

    1. बनाए गए किसी एक GL फ़्रेमबफ़र को बाइंड करें.

    2. सामान्य GLES API की मदद से फ़्रेम बनाएं.

    3. स्क्रीन पर फ़्रेम दिखाएं: Linux DRM API (drmModeAtomicCommit()) का इस्तेमाल करके, DRM_MODE_PAGE_FLIP_EVENT भेजें. इसमें बाउंड GL फ़्रेमबफ़र के लिए इस्तेमाल किया गया डीएमए-बफ़ फ़ाइल डिस्क्रिप्टर शामिल हो.

कई लेयर से वीडियो आउटपुट कंपोज़ करना

हार्डवेयर की मदद से तेज़ी से रेंडर होने वाली मल्टी-लेयर (मल्टी-प्लेन) कंपोज़िशन के लिए, हम होस्ट सिस्टम पर भरोसा करते हैं. यह सिस्टम, हर लेयर को अलग डीआरएम कनेक्टर (वर्चुअल डिसप्ले) के तौर पर दिखाता है. साथ ही, उन्हें सही हार्डवेयर लोकेशन / पाइपलाइन पर मैप करता है.

ज़्यादा जानकारी के लिए, एक से ज़्यादा डिसप्ले पर रेंडरिंग सेट अप करना लेख पढ़ें.

एक से ज़्यादा डिसप्ले पर रेंडरिंग सेट अप करना

  1. /dev/dri/card* DRM डिवाइस को सिंगल-डिस्प्ले फ़्लो की तरह खोलें.

  2. डिसप्ले कनेक्टर की सूची दिखाएं.

    हर डिसप्ले, DRM डिवाइस के अलग DRM कनेक्टर के तौर पर दिखता है.

  3. हर डिसप्ले कनेक्टर के लिए:

    1. कनेक्टर के साथ काम करने वाला CRTC चुनें. हर कनेक्टर में उपलब्ध एनकोडर की सूची होती है. साथ ही, हर एनकोडर यह बताता है कि इसका इस्तेमाल किन सीआरटीसी के साथ किया जा सकता है. हमेशा कम से कम एक ऐसा सीआरटीसी होगा जो आपके डिवाइस के साथ काम करता हो.

      1. ऐसा प्लान चुनें जो CRTC के साथ काम करता हो.

      2. जीपीयू बफ़र की मदद से, डीआरएम फ़्रेमबफ़र बनाएं. यह प्रोसेस, सिंगल-डिस्प्ले वाले वैरिएंट की तरह ही होती है.

      3. प्लेन, सीआरटीसी, और कनेक्टर को कनेक्ट करें. साथ ही, सीआरटीसी पर वीडियो मोड सेट करें.

        एक ही समय में कई डिसप्ले का मोड सेट किया जा सकता है. इसके लिए, हर कनेक्टर, सीआरटीसी, और प्लेन सेट के लिए, इन DRM प्रॉपर्टी को सेट करने के लिए एटॉमिक एपीआई का इस्तेमाल करें.

    ज़रूरी प्रॉपर्टी की पूरी सूची:

    टारगेट प्रॉपर्टी प्रकार ब्यौरा
    कनेक्टर CRTC_ID सीआरटीसी आईडी कनेक्टर को असाइन करने के लिए CRTC का आईडी
    सीआरटीसी MODE_ID ब्लॉब आईडी drmModeCreatePropertyBlob का इस्तेमाल करके बनाए गए प्रॉपर्टी ब्लोब का आईडी. इसमें चुने गए वीडियो मोड का drmModeModeInfo स्ट्रक्चर होता है
    सीआरटीसी ACTIVE बूलियन CRTC को चालू के तौर पर मार्क करने के लिए true
    फ़्लाइट FB_ID फ़्रेमबफ़र आईडी स्क्रीन पर दिखाने के लिए, DRM फ़्रेमबफ़र का आईडी
    फ़्लाइट SRC_X पिक्सल फ़्रेमबफ़र सोर्स इमेज रेक्टैंगल का X कोऑर्डिनेट
    फ़्लाइट SRC_Y पिक्सल फ़्रेमबफ़र सोर्स इमेज रेक्टैंगल का Y कोऑर्डिनेट
    फ़्लाइट SRC_W 16.16 फ़िक्स्ड पॉइंट फ़्रेमबफ़र सोर्स इमेज रेक्टैंगल की चौड़ाई (पिक्सेल को बाईं ओर 16 बिट से शिफ़्ट किया गया)
    फ़्लाइट SRC_H 16.16 फ़िक्स्ड पॉइंट फ़्रेमबफ़र सोर्स इमेज रेक्टैंगल की ऊंचाई (16 बिट बाईं ओर शिफ़्ट किए गए पिक्सल)
    फ़्लाइट CRTC_X पिक्सल सीआरटीसी डेस्टिनेशन इमेज रेक्टैंगल का X कोऑर्डिनेट
    फ़्लाइट CRTC_Y पिक्सल सीआरटीसी डेस्टिनेशन इमेज रेक्टैंगल का Y कॉर्डिनेट
    फ़्लाइट CRTC_W पिक्सल सीआरटीसी डेस्टिनेशन इमेज रेक्टैंगल की चौड़ाई
    फ़्लाइट CRTC_H पिक्सल सीआरटीसी डेस्टिनेशन इमेज रेक्टैंगल की ऊंचाई
  4. रेंडर लूप डालें:

    1. अगले फ़्रेम को रेंडर करने से पहले, सीआरटीसी पर पेज फ़्लिप इवेंट का इंतज़ार करें.

    2. सीआरटीसी+फ़्रेमबफ़र के लिए पेज फ़्लिप शेड्यूल करके, फ़्रेम रेंडर करें और उसे स्क्रीन पर दिखाएं.