LIBGL_ALWAYS_INDIRECT = 1 ทำอะไรได้จริง


22

KDE SC 4.5.0 มีปัญหากับการ์ดแสดงผลบางตัวรวมถึงของฉันด้วย เมื่อปล่อยArch แนะนำหลายวิธีการแก้ปัญหา หนึ่งในนั้นคือ

ส่งออก "LIBGL_ALWAYS_INDIRECT = 1" ก่อนเริ่ม KDE

ฉันตัดสินใจว่ามันเป็นวิธีที่ง่ายที่สุดและดีที่สุด แต่ฉันไม่รู้ว่ามันทำอะไรหรือมีผลกระทบต่อระบบของฉันอย่างไร มันช้ากว่าค่าเริ่มต้นหรือไม่ ฉันควรจำที่จะจับตามองปัญหาและปิดการใช้งานในภายหลังเมื่อมันได้รับการแก้ไข?

คำตอบ:


13

การเรนเดอร์ทางอ้อมหมายความว่าโปรโตคอล GLX จะถูกใช้เพื่อส่งคำสั่ง OpenGL และ X.org จะทำการวาดตามจริง

การแสดงผลโดยตรงหมายความว่าแอปพลิเคชันสามารถเข้าถึงฮาร์ดแวร์โดยตรงโดยไม่ต้องสื่อสารกับ X.org ก่อนผ่าน mesa

การเรนเดอร์โดยตรงนั้นเร็วขึ้นเนื่องจากไม่ต้องการเปลี่ยนบริบทในกระบวนการ X.org

การชี้แจง:ในทั้งสองกรณีการแสดงผลกระทำโดย GPU (หรือในทางเทคนิค - อาจทำได้โดย GPU) อย่างไรก็ตามในการแสดงผลทางอ้อมกระบวนการดูเหมือนว่า:

  1. โปรแกรมเรียกคำสั่ง
  2. คำสั่งคือ / ถูกส่งไปยัง X.org โดยโปรโตคอล GLX
  3. X.org เรียกฮาร์ดแวร์ (เช่น GPU) เพื่อวาด

ในการเรนเดอร์โดยตรง

  1. โปรแกรมเรียกคำสั่ง
  2. คำสั่งคือ / ถูกส่งไปยัง GPU

โปรดทราบว่าเนื่องจาก OpenGL ได้รับการออกแบบในลักษณะที่อาจทำงานผ่านเครือข่ายการเรนเดอร์ทางอ้อมนั้นจะเร็วขึ้นดังนั้นการใช้งานสถาปัตยกรรมที่ไร้เดียงสาเช่นช่วยให้สามารถส่งคำสั่งได้ในคราวเดียว อย่างไรก็ตามมีค่าใช้จ่ายในแง่ของเวลา CPU ที่ใช้สำหรับการสลับบริบทและการจัดการโปรโตคอล


นี่หมายความว่า CPU ของฉันกำลังแสดงผล atm แทนที่จะเป็นชิปวิดีโอหรือไม่
xenoterracide

3
ไม่ทั้งสองกรณี GPU ทำหน้าที่วาดภาพหากคุณมีความเร่ง แต่มีค่าใช้จ่ายเพิ่มเติม การวาดภาพแบบไม่เร่งความเร็วนั้นช้ามากและไม่มีผลกระทบใด ๆ ที่จะต้องใช้LIBGL_ALWAYS_INDIRECT=1กับมัน (เช่นการแก้ปัญหาการเรนเดอร์ทางอ้อมเป็นสิ่งจำเป็นสำหรับการใช้งานขั้นสูงของ OpenGL เช่นคอมโพสิต wm)
Maciej Piechotka

14

อันดับแรก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 เท่านั้น) หรือหลีกเลี่ยงข้อผิดพลาดอื่น ๆ

แน่นอนคุณต้องการลบการตั้งค่าสถานะนี้เมื่อปัญหาพื้นฐานได้รับการแก้ไข


ตามหมายเหตุ: ผู้ใช้รายอื่นสามารถทำได้ด้วย nVidia ด้วย: __GL_ALLOW_UNOFFICIAL_PROTOCOL ... ฉันใช้สิ่งนี้เพื่อพิสูจน์แอประยะไกลของ gnome-session-wayland (3.18)
elika kohen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.