SDV Media, Linux DRM API की मदद से, ओईएम ऐप्लिकेशन को उपलब्ध डिसप्ले दिखाता है.
पहली इमेज. डीआरएम कॉम्पोनेंट के बीच इंटरैक्शन.
फ़्रेमबफ़र, पिक्सल डेटा का सोर्स होता है. इसे बाहरी तौर पर बंटवारा किए गए मेमोरी बफ़र से बैकअप मिलता है.
प्लेन, इमेज का ऐसा सोर्स है जिसका इस्तेमाल CRTC करता है. यह फ़्रेमबफ़र से जुड़ा होता है और फ़्रेमबफ़र के काटे गए हिस्से को दिखा सकता है.
CRTC, डिसप्ले पाइपलाइन को दिखाता है. यह फ़ाइनल वीडियो आउटपुट बनाने के लिए, कई प्लेन को एक साथ जोड़ सकता है. साथ ही, आउटपुट को कई एनकोडर को भेज सकता है.
एन्कोडर, CRTC से मिले वीडियो आउटपुट को ऐसे फ़ॉर्म में बदलता है जो किसी कनेक्टर के लिए सही हो.
कनेक्टर, उपलब्ध डिसप्ले कनेक्टर को दिखाता है. उदाहरण के लिए, एचडीएमआई पोर्ट.
ज़्यादा जानकारी के लिए, इन्हें देखें:
एपीआई सरफ़ेस
SDV Media, Linux DRM इंटरफ़ेस उपलब्ध कराता है. इनका इस्तेमाल सीधे तौर पर ioctl syscall का इस्तेमाल करके किया जा सकता है. हालांकि, ऐप्लिकेशन डेवलपमेंट के लिए, userspace हेल्पर लाइब्रेरी का इस्तेमाल करने का सुझाव दिया जाता है. उदाहरण के लिए:
- Rust के लिए
drm-rsक्रेट (सुझाया गया), - C/C++ के लिए
libdrm.drm-kmsमैन पेज में, एपीआई और उनके इस्तेमाल के बारे में पूरी जानकारी दी गई है.
किसी एक डिसप्ले पर रेंडर करने की सुविधा सेट अप करना
DRM डिवाइस (
/dev/dri/card*) खोलें और Linux DRM API का इस्तेमाल करें. उदाहरण के लिए,libdrmके ज़रिए, डिसप्ले और उसके मोड को चुनने के लिए, इसके फ़ाइल डिस्क्रिप्टर का इस्तेमाल करें.आम तौर पर, होस्ट सिस्टम सिर्फ़ एक वर्चुअल जीपीयू डिवाइस दिखाता है. यह
/dev/dri/card0के तौर पर दिखता है.Linux DRM API की मदद से, फ़्रंट और बैक बफ़र असाइन करें.
हमारा सुझाव है कि आप
minigbmgbm_bo_create()का इस्तेमाल करें औरgbm_bo_get_fd()की मदद से, डीएमए-बफ़ फ़ाइल डिस्क्रिप्टर पाएं.बंटवारा किए गए बफ़र के साथ GL फ़्रेमबफ़र बनाएं.
EGL_EXT_image_dma_buf_importएक्सटेंशन की मदद से, DRM बफ़र सेeglCreateImageKHRके साथEGL_LINUX_DMA_BUF_EXTका इस्तेमाल करकेEGLImageबनाएं.GL टेक्सचर बनाएं और
glEGLImageTargetTexture2DOES(GL_OES_EGL_imageएक्सटेंशन से) का इस्तेमाल करके, टेक्सचर के स्टोरेज को पिछले चरण केEGLImageपर सेट करें.GL फ़्रेमबफ़र बनाएं और
glFramebufferTexture2Dका इस्तेमाल करके, पिछले चरण में बनाए गए फ़्रेमबफ़र के बैकिंग टेक्सचर को सेट करें.
किसी फ़्रेम को रेंडर करने के लिए:
बनाए गए किसी एक GL फ़्रेमबफ़र को बाइंड करें.
सामान्य GLES API की मदद से फ़्रेम बनाएं.
स्क्रीन पर फ़्रेम दिखाएं: Linux DRM API (
drmModeAtomicCommit()) का इस्तेमाल करके,DRM_MODE_PAGE_FLIP_EVENTभेजें. इसमें बाउंड GL फ़्रेमबफ़र के लिए इस्तेमाल किया गया डीएमए-बफ़ फ़ाइल डिस्क्रिप्टर शामिल हो.
एक से ज़्यादा लेयर से वीडियो आउटपुट कंपोज़ करना
हार्डवेयर की मदद से तेज़ी से काम करने वाली मल्टी-लेयर (मल्टी-प्लेन) कंपोज़िशन के लिए, हम होस्ट सिस्टम पर भरोसा करते हैं. यह सिस्टम, हर लेयर को अलग डीआरएम कनेक्टर (वर्चुअल डिसप्ले) के तौर पर दिखाता है. साथ ही, उन्हें सही हार्डवेयर लोकेशन / पाइपलाइन पर मैप करता है.
ज़्यादा जानकारी के लिए, एक से ज़्यादा डिसप्ले पर रेंडरिंग सेट अप करना लेख पढ़ें.
एक से ज़्यादा डिसप्ले पर रेंडरिंग सेट अप करना
/dev/dri/card*DRM डिवाइस को सिंगल-डिस्प्ले फ़्लो की तरह खोलें.डिसप्ले कनेक्टर की सूची दिखाएं.
हर डिसप्ले, DRM डिवाइस के अलग DRM कनेक्टर के तौर पर दिखता है.
हर डिसप्ले कनेक्टर के लिए:
कनेक्टर के साथ काम करने वाला CRTC चुनें. हर कनेक्टर में उपलब्ध एनकोडर की सूची होती है. साथ ही, हर एनकोडर यह बताता है कि इसका इस्तेमाल किन सीआरटीसी के साथ किया जा सकता है. हमेशा कम से कम एक ऐसा सीआरटीसी होता है जो आपके डिवाइस के साथ काम करता हो.
CRTC के साथ काम करने वाला प्लान चुनें.
जीपीयू बफ़र की मदद से, डीआरएम फ़्रेमबफ़र बनाएं. यह प्रोसेस, सिंगल-डिस्प्ले वैरिएंट के लिए भी इसी तरह काम करती है.
प्लेन, सीआरटीसी, और कनेक्टर को कनेक्ट करें. साथ ही, सीआरटीसी पर वीडियो मोड सेट करें.
एक ही समय में कई डिसप्ले का मोड सेट किया जा सकता है. इसके लिए, हर कनेक्टर, सीआरटीसी, और प्लेन सेट के लिए, इन 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पिक्सल सीआरटीसी डेस्टिनेशन इमेज रेक्टैंगल की ऊंचाई रेंडर लूप डालें:
अगले फ़्रेम को रेंडर करने से पहले, सीआरटीसी पर पेज फ़्लिप इवेंट का इंतज़ार करें.
सीआरटीसी+फ़्रेमबफ़र के लिए पेज फ़्लिप शेड्यूल करके, फ़्रेम रेंडर करें और उसे स्क्रीन पर दिखाएं.