SDV Media: Manage displays

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

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

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

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

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

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

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

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

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

एपीआई सरफ़ेस

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

  • Rust के लिए drm-rs क्रेट (सुझाया गया),
  • C/C++ के लिए libdrm. 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 प्रॉपर्टी को सेट करने के लिए एटॉमिक एपीआई का इस्तेमाल करें.

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

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

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

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