LIBGL_ALWAYS_INDIRECT = 1 वास्तव में क्या करता है?


22

केडीई एससी 4.5.0 में कुछ वीडियो कार्डों के साथ कुछ समस्याएं हैं जिनमें मेरा भी शामिल है। रिलीज के बाद आर्क ने कई वर्कअराउंड की सिफारिश की । जिनमें से एक था

KDE शुरू करने से पहले "LIBGL_ALWAYS_INDIRECT = 1" निर्यात करें

मैंने फैसला किया कि यह सबसे आसान, सबसे अच्छा तरीका था। लेकिन मुझे नहीं पता कि यह क्या करता है या यह मेरे सिस्टम को कैसे प्रभावित करता है। क्या यह डिफ़ॉल्ट से धीमी है? क्या मुझे समस्या पर नज़र रखने और बाद में इसे ठीक करने के बाद इसे अक्षम करना चाहिए?

जवाबों:


13

अप्रत्यक्ष प्रतिपादन का अर्थ है कि GLX प्रोटोकॉल का उपयोग OpenGL कमांड को प्रसारित करने के लिए किया जाएगा और X.org वास्तविक ड्राइंग करेगा।

डायरेक्ट रेंडरिंग का मतलब है कि एप्लीकेशन सीधे X.org के साथ मीसा के माध्यम से संचार के बिना हार्डवेयर का उपयोग कर सकता है।

प्रत्यक्ष प्रतिपादन तेजी से होता है क्योंकि उसे संदर्भ के परिवर्तन की आवश्यकता नहीं होती है X.org प्रक्रिया में।

स्पष्टता: दोनों ही मामलों में प्रतिपादन GPU (या तकनीकी रूप से - GPU द्वारा किया जा सकता है) द्वारा किया जाता है। हालाँकि अप्रत्यक्ष प्रतिपादन में प्रक्रिया इस प्रकार दिखती है:

  1. कार्यक्रम एक कमांड को बुलाता है
  2. कमांड (ओं) को GLX प्रोटोकॉल द्वारा X.org पर भेजा जाता है
  3. X.org कॉल करने के लिए हार्डवेयर (यानी GPU) कहते हैं

प्रत्यक्ष प्रतिपादन में

  1. कार्यक्रम एक कमांड को बुलाता है
  2. कमांड (एस) GPU के लिए भेजा जाता है

कृपया ध्यान दें कि क्योंकि OpenGL इस तरह से डिज़ाइन किया गया था कि नेटवर्क पर काम कर सकता है अप्रत्यक्ष प्रतिपादन तेज है तो वास्तुकला का अनुभवहीन कार्यान्वयन होगा अर्थात एक ही बार में एक कमांड भेजने की अनुमति देता है। हालाँकि, संदर्भ स्विच और हैंडलिंग प्रोटोकॉल के लिए खर्च किए गए CPU समय के संदर्भ में कुछ ओवरहेड है।


इसका मतलब यह है कि मेरे सीपीयू मेरे वीडियो चिप के बजाय प्रतिपादन एटीएम कर रहा है?
एक्सनोटेरासाइड

3
नहीं। यदि आपके पास त्वरण है तो दोनों स्थितियों में GPU ड्राइंग करता है - हालांकि अतिरिक्त ओवरहेड है। त्वरित गति से बनाई गई ड्राइंग तेजी से धीमी है और LIBGL_ALWAYS_INDIRECT=1इसके साथ काम करने वाले किसी भी प्रभाव की आवश्यकता नहीं होगी (अर्थात अप्रत्यक्ष प्रतिपादन वर्कअराउंड की आवश्यकता आमतौर पर ओएनजीसीएल के उन्नत उपयोग के लिए होती है जैसे कि समग्र wm)।
मैकीज पाइचोटका

14

सबसे पहले, LIBGL_ALWAYS_INDIRECTमेसा 3 डी क्लाइंट-साइड ओपनजीएल कार्यान्वयन (libGL.so) से संबंधित एक ध्वज है। यह अन्य विक्रेताओं (जैसे एनवीआईडीआईए) के बाइनरी ड्राइवरों के साथ काम नहीं करेगा।

दूसरा, आपके सवाल का सीधा जवाब देने के लिए, आखिरी बार मैंने मेसा कोड को देखा था जो झंडा इस तरह काम करता है:

प्री ~ 2008 जब मेसा एक अप्रत्यक्ष एक्स सर्वर के साथ काम कर रहा था (जैसे आपने किया था ssh -Xया स्पष्ट रूप से आपके प्रदर्शन को गैर-स्थानीय सर्वर पर सेट किया था ) तो यह जीएलएक्स विजुअल्स की सूची प्रदान करेगा जो आपके जीएलएक्स एप्लिकेशन को दूरस्थ एक्स सर्वर द्वारा उपलब्ध कराएगा। आवेदन कॉल जैसे glXChooseVisual () और मेसा को मिलान करने के लिए कुछ उचित मिलेगा, और बाद में glFoo()कॉल को दूरस्थ एक्स सर्वर पर भेजा जाएगा जहां वे जिस परिवाद द्वारा निष्पादित किए गए थे, वह रिमोट एक्स सर्वर को झुका दिया गया था (संभावित GPU)।

2008 के अंत के आसपास मेसा को बदल दिया गया था ताकि वह दूरस्थ एक्स कनेक्शन के लिए अपने आंतरिक सॉफ्टवेयर ओपनजीएल रेंडरर ( एक्सलिब ड्राइवर ) का उपयोग करना चाहता था । (सुसे जैसे कुछ वितरणों ने विशेष रूप से पुराने व्यवहार पर वापस जाने के लिए इसे पैच किया।) यह केवल तभी किक करेगा यदि रिमोट एक्स सर्वर ने GLX दृश्य की पेशकश की जो आंतरिक सॉफ्टवेयर रेंडरर में से एक से बिल्कुल मेल खाता हो। (अन्यथा आपको आम मिलेगा, " त्रुटि: आरजीबी नहीं मिल सकता है, डबल-बफर विजुअल "।) यदि ऐसा दृश्य पाया गया, तो मेसा glFoo()स्थानीय (एप्लिकेशन को) सीपीयू के साथ सभी आदेशों को प्रस्तुत करेगा , और धक्का देगा। रिस्टर छवियों ( XPutImage()) के माध्यम से दूरस्थ एक्स सर्वर का परिणाम ; सेटिंग LIBGL_ALWAYS_INDIRECT=1(मेसा 17.3 से पहले कोई भी मूल्य काम करेगा, तब से आपको 1 या सच का उपयोग करना होगा) मेसा को सामान्य प्रत्यक्ष प्रतिपादन या आंतरिक सॉफ्टवेयर रेंडरर को अनदेखा करने और अप्रत्यक्ष रेंडरिंग का उपयोग करने के लिए कहता है जैसे कि यह प्रयोग किया जाता है।

अप्रत्यक्ष प्रतिपादन या प्रत्यक्ष सॉफ्टवेयर प्रतिपादन का चयन दो चीजों को प्रभावित करेगा:

ओपन संस्करण

  • अप्रत्यक्ष प्रतिपादन आम तौर पर OpenGL 1.4 के लिए प्रतिबंधित है।
  • डायरेक्ट सॉफ्टवेयर रेंडरिंग मेसा सॉफ्टवेयर रैस्टरएजर का समर्थन करेगा, जो शायद OpenGL 2.1+ है

प्रदर्शन

  • यदि आपका एप्लिकेशन अप्रत्यक्ष कनेक्शन के लिए डिज़ाइन किया गया है (यह प्रदर्शन सूचियों का उपयोग करता है, तो राउंड-ट्रिप प्रश्नों को कम करता है) तो आप उचित प्रदर्शन प्राप्त कर सकते हैं।
  • यदि आपका आवेदन glGetInteger()प्रति फ्रेम 100 बार की तरह कुछ बेवकूफी करता है, तो भी एक तेज लैन पर उन प्रश्नों में से प्रत्येक आसानी से 1ms या 100ms प्रति फ्रेम तक ले जाएगा, जिसका अर्थ है कि आप अपने आवेदन में 10 से अधिक एफपीएस कभी नहीं प्राप्त कर सकते हैं।
  • वही एप्लिकेशन, यदि रेंडरिंग लोड बहुत भारी नहीं है, तो सीधे सॉफ्टवेयर रेंडरिंग के साथ बहुत अच्छा प्रदर्शन कर सकते हैं, क्योंकि उन सभी glGetInteger()कॉल का जवाब सीधे सूक्ष्म या नैनोसेकंड के मामले में दिया जाता है।
  • यदि आपका एप्लिकेशन मिलियन-वर्टेक्स डिस्प्ले सूची बनाता है और फिर बहुत सारे घूमता है तो दूसरे छोर पर एक वास्तविक जीपीयू के साथ अप्रत्यक्ष रेंडरिंग बहुत बेहतर प्रदर्शन देगा।
  • एक अनुप्रयोग भी एक अलग कोड पथ पर वापस आ सकता है जब उसके पास केवल OpenGL 1.4 बनाम 2.x उपलब्ध हो, जो प्रदर्शन को भी प्रभावित कर सकता है।

तो, आप अपने आवेदन और अपने नेटवर्क विशेषताओं के सटीक विवरण के बिना देख सकते हैं, यह कहना असंभव है कि क्या किसी भी स्थिति के लिए प्रत्यक्ष सॉफ्टवेयर प्रतिपादन या अप्रत्यक्ष प्रतिपादन बेहतर है।

आपके मामले में ऐसा लगता है कि आप एक स्थानीय kwin उदाहरण चला रहे हैं, इसलिए इसका प्रभाव LIBGL_ALWAYS_INDIRECTआपके स्थानीय X सर्वर पर अप्रत्यक्ष रेंडरिंग को लागू करने के लिए है। यह स्पष्ट रूप से या तो kwinव्यवहार बदल जाता है (केवल OpenGL 1.4) या कुछ अन्य बग से बचा जाता है।

निश्चित रूप से आप इस झंडे को हटाना चाहते हैं जब अंतर्निहित समस्या ठीक हो जाती है।


नोट के रूप में: अन्य उपयोगकर्ता nVidia के साथ ऐसा करने में सक्षम हो सकते हैं: __GL_ALLOW_UNOFFICIAL_PROTOCOL ... मैं इस का उपयोग कर रहा हूं gnome-session-wayland (3.18) दूरस्थ अवधारणा का प्रमाण।
एलिका कोहेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.