ओपनजीएल, जीएलएक्स, डीआरआई और मेसा 3 डी के बीच क्या संबंध है?


17

मैं लिनक्स में कुछ निम्न स्तर की 3 डी प्रोग्रामिंग करना शुरू कर रहा हूं। मुझे उच्च स्तरीय ग्राफिक्स API OpenInventor का उपयोग करने का बहुत अनुभव है।

मुझे पता है कि इन सभी चीजों को एक साथ फिट करने के बारे में पता होना कड़ाई से जरूरी नहीं है, लेकिन मैं सिर्फ उत्सुक हूं। मुझे पता है कि ओपनजीएल ग्राफिक्स अनुप्रयोगों के लिए एक मानक है। Mesa3D इस मानक का एक खुला स्रोत कार्यान्वयन प्रतीत होता है।

तो जीएलएक्स और डीआरआई कहां फिट होते हैं? विकिपीडिया और इन सभी वेबसाइटों पर घूमते हुए, मुझे अभी तक इसका स्पष्टीकरण नहीं मिल पाया है कि यह सब एक साथ कैसे चलता है। हार्डवेयर त्वरण कहाँ होता है? मालिकाना चालकों को इससे क्या लेना-देना है?

जवाबों:


15

ओपनजीएल को छोड़कर, मैंने कभी भी उन पुस्तकालयों का उपयोग नहीं किया, लेकिन मैं अनुमान लगाने की कोशिश करने जा रहा हूं, जैसे कि आपने विकिपीडिया पृष्ठों को पढ़ा है।

आप मेसा के बारे में सही लगते हैं। यहां हमारे पास अतिरिक्त जानकारी है:

"एक्स विंडो सिस्टम एक कंप्यूटर सॉफ्टवेयर सिस्टम और नेटवर्क प्रोटोकॉल है जो नेटवर्क वाले कंप्यूटरों के लिए एक आधार GUI प्रदान करता है। यह एक हार्डवेयर अमूर्त परत बनाता है।"

"GLX X विंडो सिस्टम द्वारा प्रदान की गई विंडो के भीतर OpenGL का उपयोग करने के इच्छुक कार्यक्रमों को सक्षम करता है।
GLX में तीन भाग होते हैं:
- एक एपीआई जो ओपनग्लग फ़ंक्शन प्रदान करता है।
- एक्स प्रोटोकॉल का एक विस्तार, जो क्लाइंट को 3D भेजने की अनुमति देता है। रेंडरिंग कमांड्स - एक्स सर्वर का एक एक्सटेंशन जो क्लाइंट से रेंडरिंग कमांड प्राप्त करता है और उन्हें इंस्टाल की गई ओपनजीएल लाइब्रेरी में भेजता है
यदि क्लाइंट और सर्वर एक ही कंप्यूटर पर चल रहे हैं और एक त्वरित 3 डी ग्राफिक्स कार्ड उपलब्ध है, तो पूर्व दो घटक कर सकते हैं DRI द्वारा बायपास किया जा सकता है। क्लाइंट प्रोग्राम को फिर सीधे ग्राफिक्स हार्डवेयर तक पहुंचने की अनुमति दी जाती है। "

"डायरेक्ट रेंडरिंग इंफ्रास्ट्रक्चर (DRI) एक्स विंडो सिस्टम में उपयोग किया जाने वाला एक इंटरफ़ेस है, जो उपयोगकर्ता को एक्स सर्वर के माध्यम से डेटा की आवश्यकता के बिना वीडियो हार्डवेयर का उपयोग करने की अनुमति देता है।"

"ओपन इन्वेंटर एक सी ++ 3 डी ग्राफिक्स एपीआई है जिसे ओपनजीएल के लिए प्रोग्रामिंग की एक उच्च परत प्रदान करने के लिए डिज़ाइन किया गया है"

चीजों को सरल बनाने के लिए, आइए डेटा (और आदेशों) के सरलीकृत प्रवाह की कल्पना करें जो उन प्रत्येक एपीआई की प्रविष्टियों और निकासों पर होता है। शुरुआत में हमारे पास आपका एप्लिकेशन प्रोग्राम (संकलित कोड) है, जिसे आप अपने कंप्यूटर से चलाते हैं। अंत में हमारे पास आपकी स्क्रीन पर प्रदर्शित होने वाली छवियां हैं।

ऐसे कई मामले हैं जो मैं इन सवालों के जवाबों पर रोक
लगाऊंगा : -क्या आपके कंप्यूटर में ग्राफिक फ़ंक्शंस को प्रोसेस करने के लिए ग्राफ़िक कार्ड (GPU), या केवल CPU है?
क्या आपका आवेदन एक्स-विंडो सिस्टम की एक विंडो में एम्बेडेड है?
-यदि आप x विंडो सिस्टम का उपयोग करते हैं, तो क्या "x सर्वर" आपके कंप्यूटर पर या नेटवर्क पर किसी अन्य कंप्यूटर पर चल रहा है?
मुझे लगता है कि अगर आपके पास एक है, और आपके पास सॉफ्टवेयर रेंडरिंग के लिए मेसा है) तो आपके पास आपके GPU के लिए ड्राइवर होंगे।

पहला परिदृश्य: आप बिना X विंडो सिस्टम का उपयोग किए बिना OpenInventor के साथ लिखा गया ग्राफिक एप्लिकेशन चलाते हैं, और आपके पास ग्राफ़िक कार्ड नहीं है। कार्यक्रम का प्रवाह काफी हद तक समान होगा:

Your application
  ↓ (uses functions of)
OpenInventor
  ↓ (calls functions declared by)
OpenGL
  ↓ (redirects function calls to implementation defined by)
Mesa
  ↓ (implemented OpenGL functions to be run on the CPU)
[Probably] Operating System rendering API
  ↓
3D Images on your screen

यहां जो होता है उसे "सॉफ़्टवेयर रेंडरिंग" कहा जाता है: ग्राफिक्स कमांड को किसी भी ग्राफिक हार्डवेयर द्वारा नियंत्रित नहीं किया जाता है, बल्कि आपके सामान्य सीपीयू द्वारा, आमतौर पर सॉफ्टवेयर चलाने वाले प्रोसेसर द्वारा।

दूसरा परिदृश्य: अब कल्पना करें कि उपरोक्त शर्तों के साथ, आपके पास एक ग्राफिक कार्ड है। प्रवाह इस तरह दिखाई देगा:

Your application
  ↓ (uses functions of)
OpenInventor
  ↓ (calls functions declared by)
OpenGL
  ↓ (redirects function calls to implementation defined by)
Proprietary Drivers
  ↓ (converts OpenGL commands to GPU commands)
Graphic Card
  ↓
3D Images on your screen

अब क्या होता है "हार्डवेयर त्वरण" कहा जाता है, आमतौर पर पहले परिदृश्य की तुलना में तेज होता है।

तीसरा परिदृश्य: अब आइए X विंडो सिस्टम फ्लो का परिचय दें, या कम से कम मैं इसे कैसे समझता हूं, यह मेरे द्वारा पढ़ी गई कुछ विकिपीडिया लाइनों पर आधारित है।
चलो ग्राफिक हार्डवेयर और एपीआई के बारे में कुछ समय के लिए भूल जाते हैं। प्रवाह जैसा दिखना चाहिए:

Your application (X Window System sees it as an "X Client")
  ↓ (sends requests defined by the X Window System Core Protocol)
X Server
  ↓ (convert your request to graphic commands)
[Probably] Operating System rendering API
  ↓
Windows or 2D images on your screen

ध्यान दें कि एक्स विंडो सिस्टम का उपयोग करते समय, आपकी स्क्रीन और जिस कंप्यूटर से आप अपना एप्लिकेशन चलाते हैं, वह "सीधे" जुड़ा नहीं हो सकता है, लेकिन एक नेटवर्क के माध्यम से कनेक्ट किया जा सकता है।

चौथा परिदृश्य: मान लीजिए कि आप पिछले उदाहरण से अपने X क्लाइंट एप्लिकेशन में फैंसी 3D ग्राफिक रेंडरिंग जोड़ना चाहते हैं। यह मुझे लगता है कि एक्स विंडो सिस्टम मूल रूप से ऐसा करने में सक्षम नहीं है, या कम से कम यह एक ओपनजीएल एपीआई फ़ंक्शन के बराबर प्रदर्शन करने के लिए बहुत जटिल कोड की आवश्यकता होगी।
सौभाग्य से आप सिस्टम में OpenGL कमांड के लिए समर्थन जोड़ने के लिए GLX का उपयोग कर सकते हैं। अब आपके पास है:

Your application
  ↓ (sends graphic requests defined by the "GLX extension to the X Protocol")
X Server with the GLX extension
  ↓ (convert your request to OpenGL commands)
OpenGL
  ↓ (redirects function calls to implementation defined by)
 ...

अब आप पहले परिदृश्य में "ओपनजीएल" के बाद उस आखिरी तीर को फिर से जोड़ सकते हैं: आप अपनी स्क्रीन पर 3 डी छवियां प्राप्त कर सकते हैं!

अंत में मुझे लगता है कि डीआरआई के बारे में मुझे क्या समझ है:
यह मेसा को GPU तक पहुंच प्रदान करने की अनुमति देता है, ताकि हमारे पहले परिदृश्य के प्रवाह को संशोधित किया जा सके:

...
  ↓
Mesa
  ↓ (forwards OpenGL commands)
DRI
  ↓ (converts OpenGL commands to GPU commands)
Graphic Card
  ↓
3D Images on your screen

और यह GLX का उपयोग करते समय प्रवाह को शॉर्ट-सर्किट करने के लिए भी लगता है, इस शर्त को देखते हुए कि इसका सर्वर और क्लाइंट एक ही कंप्यूटर पर है, और आपके पास एक GPU है। उस स्थिति में हमारे चौथे परिदृश्य का ग्राफ बस बन जाएगा:

Your application
  ↓ (sends graphic requests defined by the "GLX extension to the X Protocol")
DRI
  ↓ ("catches" OpenGL commands and converts them to GPU commands)
Graphic Card
  ↓
3D Images on your screen

बस !
अब ध्यान रखें कि मैं यूनिक्स वातावरण में विशेषज्ञ नहीं हूं, इसलिए मेरी सबसे अच्छी सलाह यह है कि वे प्रत्येक एपीआई के प्रलेखन का अध्ययन करके यह जान सकें कि वे क्या कर सकते हैं।
पिछले चार्ट को एक में जोड़कर चीजों को समझना आसान हो सकता है। मैं इसे आप के लिए एक अभ्यास के रूप में!


1
यह केवल कुछ वाक्यों में कटौती पर आधारित एक सिद्धांत है। यह सच्चाई नहीं है।
कावईएक्स मार्क्स

8

OpenGL प्लेटफ़ॉर्म अज्ञेयवादी है; इसका मतलब है कि ओपनजीएल एपीआई स्वतंत्र है।

OpenGL राज्यों और बफ़र्स को एक अमूर्त वस्तु द्वारा एकत्र किया जाता है, जिसे आमतौर पर संदर्भ कहा जाता है।

होस्टिंग प्लेटफ़ॉर्म अंतर्निहित प्लेटफ़ॉर्म के लिए OpenGL संदर्भ बनाने के लिए कुछ API प्रदान करने के लिए ज़िम्मेदार है। विंडोज पर wgl * रूटीन (GL के लिए विंडोज) हैं, Unix पर glX * रूटीन (X के लिए GL) हैं।

दरअसल GLX एक एपीआई के अलावा और कुछ भी नहीं है जो ओपनजीएल एपीआई का उपयोग करने के लिए ओपनजीएल संदर्भ बनाने की अनुमति देता है।

आम डब्ल्यूजीएल / जीएलएक्स संचालन एक खिड़की का निर्माण है, एक ऑफ-स्क्रीन बफर का निर्माण, एक धागे पर ओपनजीएल संदर्भ को चालू करें, बफ़र्स को स्वैप करें ...

इसके बजाय DRI एक कर्नेल परत है जो ग्राफिक कार्ड के साथ सीधे संचार की अनुमति देता है, Xsver को पास करके, वास्तव में OpenGL रूटीन का उपयोग करके एप्लिकेशन को गति देता है।


3

http://www.bitwiz.org.uk/s/how-dri-and-drm-work.html

डायरेक्ट रेंडरिंग इन्फ्रास्ट्रक्चर, जिसे DRI के रूप में भी जाना जाता है, एक सुरक्षित और कुशल तरीके से एक्स विंडो सिस्टम के तहत ग्राफिक्स हार्डवेयर तक सीधी पहुंच की अनुमति देने के लिए एक रूपरेखा है। इसमें कई क्लाइंट लाइब्रेरी में, और कर्नेल (DRM, डायरेक्ट रेंडरिंग मैनेजर) में एक्स सर्वर में बदलाव शामिल हैं। डीआरआई के लिए सबसे महत्वपूर्ण उपयोग मेसा के लिए हार्डवेयर त्वरण प्रदान करने वाले तेजी से ओपनजीएल कार्यान्वयन बनाना है। डीआरआई विनिर्देश में कई 3 डी त्वरित चालक लिखे गए हैं, जिनमें 3DFX, AMD (पूर्व में अति), इंटेल और Matrox द्वारा निर्मित चिपसेट के लिए ड्राइवर शामिल हैं।


2

सीधे शब्दों में कहें तो OpenGL ग्राफिक्स लाइब्रेरी का प्रकार और विनिर्देश है। मेसा एक आधार निहितार्थ है। DRI एक हार्डवेयर इंटरफ़ेस सिस्टम है।

मेसा मूल रूप से पूरे ढांचे को संदर्भित करता है। हालाँकि, मुझे लगता है कि आप मेसा हार्डवेयर ड्राइवर की बात कर रहे हैं।

DRI मूल रूप से हार्डवेयर को संभालने के लिए कर्नेल इंटरफ़ेस है। यह तकनीकी रूप से अन्य चीजों के लिए इस्तेमाल किया जा सकता है, लेकिन यह मेसा के लिए बनाया गया था और मुख्य रूप से मेसा के लिए उपयोग किया जाता है।

GLX यह एक्स के लिए सभी इंटरफेस है !!

यह समझने के लिए कि प्रत्येक भाग क्या है, आपको यह जानना होगा कि यह एक साथ कैसे फिट बैठता है।

एक कार्यक्रम को किसी भी ओपन लाइब्रेरी के साथ इंटरफेस करने के लिए डिज़ाइन किया गया है।

GLX X11 के साथ या उसके माध्यम से OpenGL को इंटरफ़ेस करने का एक साधन है। यदि आपके पास "डायरेक्ट" इंटरफ़ेस है या "इनडायरेक्ट" इंटरफ़ेस निर्भर करता है, तो यह निर्भर करता है कि आपका प्रोग्राम इस बारे में चिंता करेगा या नहीं।

libGL बहुत इनका इंटरफ़ेस है। यह आमतौर पर मेसा द्वारा प्रदान किया जाता है यदि आप मेसा ड्राइवर का उपयोग कर रहे हैं।

एक अप्रत्यक्ष सेटअप में यह निम्नानुसार है: एप्लीकेशन फ्रेमवर्क (यानी हार्ड-लिखित एप्लिकेशन, इंजन, या एब्सट्रैक्शन एपीआई) LibGL | मेसा चालक | DRI | हार्डवेयर

इस कॉन्फ़िगरेशन में, GLX का उपयोग आपके प्रोग्राम के GL उपयोग और अन्य कार्यक्रमों के बीच के अंतर को संभालने के लिए किया जाता है। GLX विशिष्ट कॉलों के अलावा उन चीजों का उपयोग किया जाता है जिनके लिए X11 स्टैक के संचार की आवश्यकता होती है और यह सपोर्ट प्रोग्राम (जैसे विंडो मैनेजर) GLX काफी हद तक अछूता रहता है। इस व्यवस्था में।

इसके अलावा, इस सिस्टम में लेयर को ऑप्टिमाइज़ करने के लिए कमांड passthrough और शेयर्ड मेमोरी का उपयोग किया जा सकता है। यह सब विलंबता को कम करता है और हार्डवेयर तक पहुंचने की गति में सुधार करता है। यह वही है जो आप आमतौर पर चाहते हैं।

अप्रत्यक्ष के लिए यह आपका एप्लीकेशन फ्रेमवर्क है LibGL (उपयोगकर्ता का पक्ष) | LibGLX | LibGL (X11 साइड) | मेसा हार्डवेयर ड्राइवर | DRI | हार्डवेयर

इसका लाभ यह है कि आपको इस सेटअप का उपयोग करने के लिए हार्डवेयर के साथ प्रत्यक्ष साझा मेमोरी बफर की आवश्यकता नहीं है। (नेटवर्क क्लाइंट के लिए, साथ ही साथ अधिक मजबूती, और अधिक सुरक्षित सेटअप के लिए अनुमति है।)

यह सेटअप एकल वीडियो कार्ड साझा करने वाले कई वीएम पर काम कर सकता है या यहां तक ​​कि इस वजह से एक नेटवर्क तक पहुंच बना सकता है। साझा मेमोरी या वर्चुअल साझा "क्लोन" मेमोरी के कुछ रूपों का उपयोग नए एक्सटेंशन के कारण किया जा सकता है, लेकिन यह डायरेक्ट रेंडरिंग मोड में पाया जाने वाला प्रत्यक्ष वीडियो मेमोरी एक्सेस नहीं है।

नुकसान यह है कि X11 के साथ इंटरफेस करने के लिए पाइप या नेटवर्क सॉकेट का उपयोग धीमा हो सकता है, अच्छी तरह से अनुकूलित कार्यक्रमों पर बहुत कम परिचय दे रहा है, और सबसे खराब रूप से अनुकूलित वाले पर सबसे खराब, घटते फ्रेम-दर।

इस तरह का सेटअप नेटवर्क क्लाइंट्स के लिए बेहतर है, ऐसे सेटअप जिन्हें अधिक मजबूत सुरक्षा की आवश्यकता होती है, और सेटअप जहां कई ऑपरेटिंग सिस्टम को एक ही GL स्टैक के माध्यम से हार्डवेयर को साझा करने की आवश्यकता होती है। यह इष्टतम से बहुत दूर है, लेकिन यह आपको कुछ हद तक हार्डवेयर त्वरण प्रदान करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.