LIBGL_ALWAYS_INDIRECT = 1 thực sự làm gì?


22

KDE SC 4.5.0 có một số vấn đề với một số thẻ video bao gồm cả thẻ của tôi. Khi phát hành Arch đề nghị một số cách giải quyết . Một trong số đó là

xuất "LIBGL_ALWAYS_INDIRECT = 1" trước khi bắt đầu KDE

Tôi quyết định rằng đó là phương pháp dễ nhất, tốt nhất. Nhưng tôi không biết nó làm gì hoặc nó ảnh hưởng đến hệ thống của tôi như thế nào. Có chậm hơn mặc định không? Tôi có nên nhớ để mắt đến vấn đề và vô hiệu hóa nó sau khi nó được sửa không?

Câu trả lời:


13

Kết xuất gián tiếp có nghĩa là giao thức GLX sẽ được sử dụng để truyền các lệnh OpenGL và X.org sẽ thực hiện bản vẽ thực.

Kết xuất trực tiếp có nghĩa là ứng dụng có thể truy cập phần cứng trực tiếp mà không cần liên lạc với X.org trước thông qua mesa.

Kết xuất trực tiếp nhanh hơn vì nó không yêu cầu thay đổi bối cảnh thành quy trình X.org.

Làm rõ: Trong cả hai trường hợp, việc kết xuất được thực hiện bởi GPU (hoặc về mặt kỹ thuật - có thể được thực hiện bằng GPU). Tuy nhiên, trong kết xuất gián tiếp quá trình này trông giống như:

  1. Chương trình gọi một lệnh
  2. Các lệnh được / được gửi đến X.org bằng giao thức GLX
  3. X.org gọi phần cứng (tức là GPU) để vẽ

Trong kết xuất trực tiếp

  1. Chương trình gọi một lệnh
  2. (Các) lệnh được / được gửi tới GPU

Xin lưu ý rằng vì OpenGL được thiết kế theo cách có thể hoạt động qua mạng, kết xuất gián tiếp nhanh hơn nên việc triển khai kiến ​​trúc ngây thơ tức là cho phép gửi một loạt lệnh trong một lần. Tuy nhiên, có một số chi phí về thời gian CPU dành cho chuyển đổi ngữ cảnh và giao thức xử lý.


Điều này có nghĩa là CPU của tôi đang thực hiện atm kết xuất thay vì chip video của tôi?
xenoterracide

3
Không. Trong cả hai trường hợp, GPU thực hiện bản vẽ nếu bạn có khả năng tăng tốc - tuy nhiên có thêm chi phí. Bản vẽ không được tăng tốc là cực kỳ chậm và không có hiệu ứng nào sẽ yêu cầu LIBGL_ALWAYS_INDIRECT=1hoạt động với nó (tức là cách khắc phục kết xuất gián tiếp thường là cần thiết để sử dụng OpenGL tiên tiến như composite wm).
Maciej Piechotka

14

Đầu tiên, LIBGL_ALWAYS_INDIRECTlà 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 -Xhoặ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_INDIRECTlà 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 kwinhà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.


Lưu ý: Những người dùng khác có thể thực hiện điều này với nVidia, với: __GL_ALLOW_UNOFFICIAL_PROTOCOL ... Tôi đang sử dụng điều này cho bằng chứng khái niệm ứng dụng từ xa gnome-session-wayland (3.18).
elika kohen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.