2012-06-06 12 views
10

मैं यह समझने की कोशिश कर रहा हूं कि ओपनजीएल और डायरेक्टएक्स ग्राफिक कार्ड के साथ कैसे काम करते हैं।जीपीयू ओपनजीएल और डायरेक्टएक्स एपीआई निष्पादन दोनों का समर्थन कैसे करते हैं?

यदि मैं ओपनजीएल में एक प्रोग्राम लिखता हूं जो त्रिभुज करता है, और डायरेक्टएक्स में दूसरा एक ही काम करता है, तो GPU पक्ष के साथ वास्तव में क्या होता है?

क्या हम प्रोग्राम चलाते हैं, ओपनजीएल लाइब्रेरी में प्रत्येक कॉल और डायरेक्टएक्स लाइब्रेरी में प्रत्येक कॉल जीपीयू के लिए कोड उत्पन्न करेगी, और दो कार्यक्रमों से उत्पादित जीपीयू का मशीन कोड वही होगा? (जैसे कि डायरेक्टएक्स और ओपनजीएल जावा बाइटकोड की तरह हैं, प्रीकंपिल्ड, फिर जब यह वास्तव में चल रहा है, तो यह वही चीज उत्पन्न करता है)

या जीपीयू में 2 अलग-अलग निर्देश सेट हैं, प्रत्येक के लिए एक। मेरा मतलब है, GPU के लिए एक्साक्लिटी ओपनजीएल और डायरेक्टएक्स क्या है, यह 2 एपीआई के बीच अंतर कैसे कर सकता है?

क्या यह प्रोग्रामर परिप्रेक्ष्य से केवल अलग है?

+3

यह ड्राइवर में प्री-संकलन का संयोजन है, और कार्ड पर - डीएक्स और ओपनजीएल के लिए स्लिग्लि अलग है। Http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the- ग्राफिक्स-pipeline-2011-part-1/ –

+0

क्या एक GPU "दोनों" ओपनजीएल और डायरेक्टएक्स संदर्भों में चल सकता है एक ही समय या वे हमेशा अलग हो जाते हैं? (उदा। एकाधिक [पृथक] संदर्भ, लेकिन प्रति संदर्भ केवल एक एपीआई।) –

+0

केप्लर तक जीपीयू आमतौर पर एक बार "कमांड बफर" निष्पादित कर रहे थे। केप्लर आर्किटेक्चर सबसे पहले मुझे पता है कि वास्तव में एक ही समय में एकाधिक कमांड स्ट्रीम को संसाधित करने की अनुमति है। – Bahbar

उत्तर

8

मैं पहले से ही यहाँ On Windows, how does OpenGL differ from DirectX? उन जवाब

जवाब में से एक की

पूर्ण उद्धरण


यह सवाल लगभग अपने आप में क्योंकि ओपन जवाब देने के लिए असंभव है इस प्रकार है सिर्फ एक सामने अंत एपीआई, और जब तक है चूंकि एक कार्यान्वयन विनिर्देशों का पालन करता है और परिणाम इसके अनुरूप है, इसे किसी भी तरह से किया जा सकता है।

सवाल यह हो सकता है: ओपनजीएल ड्राइवर निम्नतम स्तर पर कैसे काम करता है। अब सामान्य रूप से जवाब देना असंभव है, क्योंकि ड्राइवर हार्डवेयर के कुछ टुकड़ों से बारीकी से बंधे हैं, जो फिर से चीजें कर सकते हैं हालांकि डेवलपर ने इसे डिज़ाइन किया है।

तो सवाल यह होना चाहिए था: "यह ओपनजीएल और ग्राफिक्स सिस्टम के दृश्यों के पीछे औसत कैसे दिखता है?"। आइए इसे नीचे से देखें:

  1. निम्नतम स्तर पर कुछ ग्राफिक्स डिवाइस हैं। आजकल ये जीपीयू हैं जो अपने ऑपरेशन को नियंत्रित करने वाले रजिस्टरों का एक सेट प्रदान करते हैं (जो रजिस्टर्स बिल्कुल डिवाइस निर्भर हैं) में शेडर्स के लिए कुछ प्रोग्राम मेमोरी है, इनपुट डेटा (वर्टिसेस, टेक्सचर इत्यादि) के लिए थोक मेमोरी और बाकी के लिए आई/ओ चैनल जिस प्रणाली पर यह डेटा प्राप्त करता है/डेटा और कमांड स्ट्रीम भेजता है।

  2. ग्राफिक्स ड्राइवर जीपीयू राज्य और जीपीयू का उपयोग करने वाले सभी संसाधन अनुप्रयोग कार्यक्रमों का ट्रैक रखता है। इसके अलावा यह रूपांतरण या अनुप्रयोगों द्वारा भेजे गए डेटा को किसी अन्य प्रोसेसिंग के लिए ज़िम्मेदार है (जीपीयू द्वारा समर्थित पिक्सेलफॉर्मेट में बनावट को परिवर्तित करें, GPU के मशीन कोड में संकलित संकलित करें)। इसके अलावा यह अनुप्रयोग कार्यक्रमों के लिए कुछ सार, ड्राइवर निर्भर इंटरफ़ेस प्रदान करता है।

  3. फिर ड्राइवर निर्भर ओपनजीएल क्लाइंट लाइब्रेरी/ड्राइवर है।

    • X11 GLX मॉड्यूल और चालक निर्भर GLX चालक और /usr/lib/libGL.so हो सकती है: Windows पर इस opengl32.dll के माध्यम से प्रॉक्सी द्वारा लोड, यूनिक्स सिस्टम पर इस दो स्थानों में रहता हो जाता है प्रत्यक्ष प्रतिपादन

    मैकोज़ एक्स पर यह "ओपनजीएल फ्रेमवर्क" होता है।

    यह वह हिस्सा है जो ओपनजीएल का अनुवाद करता है कि आप इसे (2) में वर्णित ड्राइवर के हिस्से में ड्राइवर विशिष्ट कार्यों को कॉल में कैसे करते हैं।

  4. अंततः वास्तविक ओपनजीएल एपीआई लाइब्रेरी, विंडोज़ में opengl32.dll, और यूनिक्स /usr/lib/libGL.so पर; यह ज्यादातर ओपनजीएल कार्यान्वयन के लिए आदेशों को उचित रूप से पास करता है।

वास्तविक संचार होता कैसे सामान्यीकृत नहीं किया जा सकता:

यूनिक्स में 3 < -> 4 कनेक्शन हो सकता है या तो सॉकेट से अधिक (हाँ, यह हो सकता है, और यदि आप चाहते हैं नेटवर्क पर जाता है) या साझा मेमोरी के माध्यम से। विंडोज़ में इंटरफ़ेस लाइब्रेरी और ड्राइवर क्लाइंट दोनों प्रक्रिया पता स्थान में लोड होते हैं, इसलिए यह इतना संचार नहीं है लेकिन सरल फ़ंक्शन कॉल और चर/पॉइंटर पास हो रहा है। मैकोज़ एक्स में यह विंडोज के समान है, केवल ओपनजीएल इंटरफ़ेस और ड्राइवर क्लाइंट के बीच कोई अलगाव नहीं है (यही कारण है कि मैकोज़ एक्स नए ओपनजीएल संस्करणों के साथ जारी रखने में इतनी धीमी है, इसे हमेशा नए ऑपरेटिंग सिस्टम को अपग्रेड करने के लिए अपग्रेड करना आवश्यक है ढांचा)।

संचार betwen 3 < -> 2 ioctl, पढ़ने/लिखने, या प्रक्रिया मेमोरी स्पेस में कुछ मेमोरी मैपिंग के माध्यम से जा सकता है और एमएमयू को कॉन्फ़िगर करने के लिए कुछ ड्राइवर कोड को ट्रिगर करने के लिए जब भी उस मेमोरी में परिवर्तन किया जाता है। यह किसी भी ऑपरेटिंग सिस्टम पर काफी समान है क्योंकि आपको हमेशा कर्नेल/यूजरलैंड सीमा पार करना होगा: आखिरकार आप कुछ सिस्कल से गुजरते हैं।

सिस्टम और जीपीयू के बीच संचार परिधीय बस और इसके द्वारा परिभाषित पहुंच विधियों के माध्यम से होता है, इसलिए पीसीआई, एजीपी, पीसीआई-ई, आदि, जो पोर्ट-आई/ओ, मेमोरी मैप किए गए आई/ओ, डीएमए, आईआरक्यू के माध्यम से काम करते हैं। ।