सबसे पहले, 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) या कुछ अन्य बग से बचा जाता है।
निश्चित रूप से आप इस झंडे को हटाना चाहते हैं जब अंतर्निहित समस्या ठीक हो जाती है।