Đầu tiên, LIBGL_ALWAYS_INDIRECT
là một cờ liên quan đến việc triển khai OpenGL phía máy khách Mesa (libGL.so). Nó sẽ không hoạt động với trình điều khiển nhị phân từ các nhà cung cấp khác (ví dụ NVIDIA).
Thứ hai, để trả lời trực tiếp câu hỏi của bạn, cuối cùng tôi đã xem mã Mesa, cờ hoạt động như thế này:
Trước năm 2008 khi Mesa làm việc với máy chủ X gián tiếp (ví dụ: bạn đã ssh -X
hoặc đặt rõ ràng màn hình của mình thành máy chủ không cục bộ), nó sẽ cung cấp danh sách hình ảnh GLX được cung cấp bởi máy chủ X từ xa có sẵn cho ứng dụng GLX của bạn. Ứng dụng gọi ví dụ như glXChooseVisual () và Mesa sẽ tìm thấy thứ gì đó hợp lý để khớp và các glFoo()
cuộc gọi tiếp theo sẽ được gửi đến máy chủ X từ xa nơi chúng được thực thi bởi bất kỳ libGL nào mà máy chủ X từ xa được nối với (có thể là GPU của bạn).
Khoảng cuối năm 2008 Mesa đã được thay đổi để họ muốn sử dụng phần mềm kết xuất OpenGL ( trình điều khiển Xlib ) cho các kết nối X từ xa. (Một số bản phân phối như SuSE đặc biệt vá lỗi này để quay lại hành vi cũ.) Điều này sẽ chỉ khởi động nếu máy chủ X từ xa cung cấp hình ảnh GLX khớp chính xác với một trong các trình kết xuất phần mềm nội bộ. (Nếu không, bạn sẽ có điểm chung, " Lỗi: không thể có được hình ảnh RGB, Bộ đệm đôi ".) Nếu tìm thấy hình ảnh như vậy thì Mesa sẽ kết xuất tất cả glFoo()
các lệnh với CPU cục bộ (đến ứng dụng) và đẩy nút kết quả đến máy chủ X từ xa thông qua hình ảnh raster ( XPutImage()
); Cài đặt LIBGL_ALWAYS_INDIRECT=1
(trước Mesa 17.3, mọi giá trị sẽ hoạt động, kể từ đó bạn phải sử dụng 1 hoặc đúng) bảo Mesa bỏ qua kết xuất trực tiếp thông thường hoặc trình kết xuất phần mềm nội bộ và sử dụng kết xuất gián tiếp như trước đây.
Chọn kết xuất gián tiếp hoặc kết xuất phần mềm trực tiếp sẽ ảnh hưởng đến hai điều:
Phiên bản OpenGL
- Kết xuất gián tiếp thường bị hạn chế đối với OpenGL 1.4.
- Kết xuất phần mềm trực tiếp sẽ hỗ trợ bất cứ điều gì trình rasterizer phần mềm Mesa hỗ trợ, có thể là OpenGL 2.1+
Hiệu suất
- Nếu ứng dụng của bạn được thiết kế cho các kết nối gián tiếp (nó sử dụng danh sách hiển thị, giảm thiểu các truy vấn khứ hồi) thì bạn có thể có được hiệu suất hợp lý.
- Nếu ứng dụng của bạn làm điều gì đó ngu ngốc như
glGetInteger()
100 lần trên mỗi khung hình thì ngay cả trên mạng LAN nhanh, mỗi truy vấn đó sẽ dễ dàng chiếm 1ms hoặc tổng 100ms cho mỗi khung hình, nghĩa là bạn không bao giờ có thể nhận được nhiều hơn 10 FPS trong ứng dụng của mình.
- Ứng dụng tương tự, nếu tải kết xuất không quá nặng, có thể hoạt động rất tốt với kết xuất phần mềm trực tiếp, vì tất cả các
glGetInteger()
cuộc gọi đó được trả lời trực tiếp trong một vấn đề micro hoặc nano giây.
- Nếu ứng dụng của bạn tạo danh sách hiển thị hàng triệu đỉnh và sau đó thực hiện nhiều thao tác xoay thì kết xuất gián tiếp với GPU thực ở đầu bên kia sẽ cho hiệu suất tốt hơn nhiều.
- Một ứng dụng cũng có thể rơi trở lại một đường dẫn mã khác khi nó chỉ có sẵn OpenGL 1.4 so với 2.x, điều này cũng có thể ảnh hưởng đến hiệu suất.
Vì vậy, bạn có thể thấy mà không có chi tiết chính xác về ứng dụng và đặc điểm mạng của mình, không thể nói liệu kết xuất phần mềm trực tiếp hoặc kết xuất gián tiếp sẽ tốt hơn cho bất kỳ tình huống cụ thể nào.
Trong trường hợp của bạn, có vẻ như bạn đang chạy một cá thể kwin cục bộ, do đó, tác dụng của LIBGL_ALWAYS_INDIRECT
là buộc kết xuất gián tiếp đến máy chủ X cục bộ của bạn. Điều này rõ ràng là thay đổi kwin
hành vi (chỉ OpenGL 1.4) hoặc tránh một số lỗi khác.
Chắc chắn bạn muốn xóa cờ này khi vấn đề cơ bản được khắc phục.