อันดับแรกLIBGL_ALWAYS_INDIRECT
คือการตั้งค่าสถานะที่เกี่ยวข้องกับการใช้งาน OpenGL ฝั่งไคลเอ็นต์ Mesa 3D (libGL.so) มันจะไม่ทำงานกับไดร์เวอร์ไบนารีจากผู้จำหน่ายรายอื่น (เช่น NVIDIA)
ประการที่สองเพื่อตอบคำถามของคุณโดยตรงสุดท้ายฉันดูรหัส Mesa ที่การตั้งค่าสถานะเป็นดังนี้:
ก่อน ~ 2008 เมื่อ Mesa ทำงานกับเซิร์ฟเวอร์ X ทางอ้อม (เช่นคุณทำssh -X
หรือตั้งค่าการแสดงผลของคุณเป็นเซิร์ฟเวอร์ที่ไม่ใช่เฉพาะในพื้นที่) มันจะทำให้รายการของภาพ GLX ที่มาจากเซิร์ฟเวอร์ X ระยะไกลพร้อมใช้งานสำหรับแอปพลิเคชัน GLX ของคุณ การเรียกใช้แอปพลิเคชันเช่น glXChooseVisual () และ Mesa จะพบบางสิ่งที่สมเหตุสมผลในการจับคู่และการglFoo()
โทรที่ตามมาจะถูกส่งไปยังเซิร์ฟเวอร์ X ระยะไกลซึ่งพวกเขาถูกเรียกใช้โดย libGL ใดก็ตามที่เซิร์ฟเวอร์ X ระยะไกลถูกยึด
ประมาณปลายปี 2551 เมซามีการเปลี่ยนแปลงเพื่อต้องการใช้ซอฟต์แวร์ภายใน OpenGL renderer ( ไดรเวอร์ Xlib ) สำหรับการเชื่อมต่อ X ระยะไกล (การแจกแจงบางอย่างเช่น SuSE ได้ทำการแก้ไขสิ่งนี้โดยเฉพาะเพื่อกลับไปสู่พฤติกรรมเก่า) สิ่งนี้จะเริ่มขึ้นหากเซิร์ฟเวอร์ X ระยะไกลเสนอภาพ GLX ที่ตรงกับตัวแสดงซอฟต์แวร์ภายในตัวใดตัวหนึ่งเท่านั้น (ไม่เช่นนั้นคุณจะได้รับข้อความทั่วไป " ข้อผิดพลาด: ไม่สามารถรับ RGB, double-buffered visual ") หากพบภาพดังกล่าว Mesa จะแสดงglFoo()
คำสั่งทั้งหมดด้วยซีพียูท้องถิ่น (ไปยังแอปพลิเคชัน) แล้วกด ผลไปยังเซิร์ฟเวอร์ X ระยะไกลผ่านภาพแรสเตอร์ ( XPutImage()
); การตั้งค่าLIBGL_ALWAYS_INDIRECT=1
(ก่อน Mesa 17.3 ค่าใด ๆ จะใช้ได้ตั้งแต่นั้นคุณต้องใช้1หรือจริง) บอกให้เมซาละเว้นการเรนเดอร์โดยตรงปกติหรือตัวสร้างซอฟต์แวร์ภายในและใช้การเรนเดอร์ทางอ้อมเหมือนที่เคยทำ
การเลือกการเรนเดอร์ทางอ้อมหรือการเรนเดอร์ซอฟต์แวร์โดยตรงจะมีผลกับสองสิ่ง:
รุ่น OpenGL
- การเรนเดอร์ทางอ้อมโดยทั่วไปถูก จำกัด ไว้ที่ OpenGL 1.4
- การเรนเดอร์ซอฟต์แวร์โดยตรงจะสนับสนุนสิ่งที่ Rasterizer ซอฟต์แวร์ Mesa สนับสนุนอาจเป็น OpenGL 2.1+
ประสิทธิภาพ
- หากแอปพลิเคชันของคุณได้รับการออกแบบสำหรับการเชื่อมต่อทางอ้อม (ใช้รายการที่แสดงให้ลดการสอบถามแบบไปกลับ) ให้น้อยที่สุดคุณจะได้รับประสิทธิภาพที่สมเหตุสมผล
- หากแอปพลิเคชันของคุณทำอะไรโง่ ๆ เช่น
glGetInteger()
100 ครั้งต่อเฟรมแม้แต่ใน LAN ที่รวดเร็วแต่ละข้อความค้นหาเหล่านั้นจะใช้เวลา 1ms หรือรวมทั้งหมด 100ms ต่อเฟรมหมายความว่าคุณจะไม่ได้รับมากกว่า 10 FPS ในแอปพลิเคชันของคุณ
- แอปพลิเคชันเดียวกันนั้นหากการโหลดการเรนเดอร์ไม่หนักเกินไปอาจทำงานได้ดีกับการเรนเดอร์ซอฟต์แวร์โดยตรงเนื่องจากการ
glGetInteger()
โทรเหล่านั้นจะได้รับคำตอบโดยตรงในเรื่องของไมโครหรือนาโนวินาที
- หากแอปพลิเคชันของคุณสร้างรายการที่แสดงเป็นล้านจุดสุดยอดแล้วหมุนไปมาจำนวนมากการเรนเดอร์ทางอ้อมด้วย GPU จริงในอีกด้านหนึ่งจะให้ประสิทธิภาพที่ดีกว่ามาก
- แอปพลิเคชันอาจถอยกลับไปยังเส้นทางของรหัสที่แตกต่างกันเมื่อมีเฉพาะ OpenGL 1.4 vs 2.x ซึ่งมีผลต่อประสิทธิภาพการทำงานด้วยเช่นกัน
ดังนั้นคุณสามารถดูได้โดยไม่มีรายละเอียดที่แน่นอนของแอปพลิเคชันของคุณและลักษณะเครือข่ายของคุณมันเป็นไปไม่ได้ที่จะบอกว่าการเรนเดอร์ซอฟต์แวร์โดยตรงหรือการเรนเดอร์ทางอ้อมนั้น
ในกรณีของคุณดูเหมือนว่าคุณกำลังใช้งานอินสแตนซ์ kwin ในเครื่องดังนั้นผลของLIBGL_ALWAYS_INDIRECT
การบังคับให้เรนเดอร์เรนเดอร์กับเซิร์ฟเวอร์ X ภายในเครื่องของคุณ เห็นได้ชัดว่าอาจเป็นการเปลี่ยนแปลงkwin
พฤติกรรม (OpenGL 1.4 เท่านั้น) หรือหลีกเลี่ยงข้อผิดพลาดอื่น ๆ
แน่นอนคุณต้องการลบการตั้งค่าสถานะนี้เมื่อปัญหาพื้นฐานได้รับการแก้ไข