İlk olarak, LIBGL_ALWAYS_INDIRECT
Mesa 3D istemci tarafı OpenGL uygulamasına (libGL.so) ilişkin bir bayrak. Diğer üreticilerin ikili sürücüleri ile çalışmaz (ör. NVIDIA).
İkincisi, sorunuza doğrudan cevap vermek için, son olarak Mesa koduna baktım, bayrak şu şekilde çalışıyor:
Mesa, dolaylı bir X sunucusuyla çalıştığında (örneğin ssh -X
, ekranınızı yerel olmayan bir sunucuya ayarladığınız veya açıkça ayarladığınız ) 2008 yılı öncesi , uzak X sunucusu tarafından sağlanan GLX görsellerinin listesini GLX uygulamanıza uygun hale getirecekti. Uygulama, örneğin glXChooseVisual () işlevini çağırır ve Mesa, uygun bir şey bulur ve ardından gelen glFoo()
çağrılar, uzak X sunucusunun bağladığı libGL ile bağlanmış olan uzak X sunucusuna gönderilir (muhtemelen GPU'nuz).
2008 yılının sonlarında Mesa, uzak X bağlantıları için dahili yazılımı OpenGL renderer'ı ( Xlib sürücüsü ) kullanmak istemek için değiştirildi . (SuSE gibi bazı dağıtımlar bunu eski davranışa geri dönmek için özellikle yattı.) Bu, yalnızca uzak X sunucusunun, iç yazılım oluşturucusuyla tam olarak eşleşen bir GLX görselini sunması durumunda devreye girerdi. (Aksi takdirde, " Hata: bir RGB, Çift arabelleğe alınmış görsel elde edemedi " ifadesini alırsınız .) Eğer böyle bir görsel bulunursa, Mesa tüm glFoo()
komutları yerel (uygulamaya) CPU ile işleyecekti ve Raster resimlerden uzak X sunucusuna sonuç ( XPutImage()
); Ayar LIBGL_ALWAYS_INDIRECT=1
(Mesa 17.3'ten önce herhangi bir değer işe yarar, o zamandan beri 1 veya true kullanmalısınız.) Mesa'ya normal doğrudan görüntülemeyi ya da dahili yazılım oluşturucuyu yoksaymasını ve eskisi gibi dolaylı görüntülemeyi kullanmasını söyler.
Dolaylı görüntülemeyi ya da doğrudan yazılım görüntülemeyi seçmek iki şeyi etkiler:
OpenGL Sürümü
- Dolaylı görüntü oluşturma genellikle OpenGL 1.4 ile sınırlıdır.
- Doğrudan yazılım oluşturma, Mesa yazılımı rasterizerinin desteklediği her neyse, muhtemelen OpenGL 2.1+ ürününü destekleyecektir.
performans
- Uygulamanız dolaylı bağlantılar için tasarlandıysa (ekran listeleri kullanır, gidiş dönüş sorgularını en aza indirir) o zaman makul bir performans elde edebilirsiniz.
- Uygulamanız
glGetInteger()
çerçeve başına 100 kez gibi aptalca bir şey yaparsa, hızlı bir LAN'da bile bu sorguların her biri kolayca 1ms veya çerçeve başına toplam 100ms alabilir; bu da uygulamanızda asla 10 FPS'den fazlasını alamayacağınız anlamına gelir.
- Eğer oluşturma yükü çok ağır değilse, bu aynı uygulama doğrudan yazılım oluşturma ile çok iyi sonuç verebilir, çünkü tüm bu
glGetInteger()
çağrılar doğrudan bir mikro veya nanosaniye cinsinden cevaplanır.
- Uygulamanız milyonlarca köşe görüntüleme listesi oluşturuyorsa ve daha sonra çok fazla döndürme yapıyorsa, diğer ucunda gerçek bir GPU ile dolaylı işleme daha iyi performans verecektir.
- Bir uygulama ayrıca yalnızca OpenGL 1.4 vs 2.x kullanılabilir olduğunda performansı da etkileyebilecek farklı bir kod yoluna düşebilir.
Bu nedenle, uygulamanızın ve ağ özelliklerinin tam detayları olmadan, herhangi bir durum için doğrudan yazılım oluşturma veya dolaylı görüntülemenin daha iyi olup olmadığını söylemek mümkün değildir.
Sizin durumunuzda yerel bir kwin örneği çalıştırıyorsunuz gibi görünüyor, bu nedenle etkisi LIBGL_ALWAYS_INDIRECT
dolaylı görüntülemeyi yerel X sunucunuza zorlamaktır. Bu görünüşte ya kwin
davranışını değiştirir (sadece OpenGL 1.4) ya da başka hatalardan kaçınır.
Kesinlikle, temeldeki sorun çözüldüğünde bu bayrağı kaldırmak istiyorsunuz.