Mối quan hệ giữa OpenGL, GLX, DRI và Mesa3D là gì?


17

Tôi đang bắt đầu thực hiện một số chương trình 3D cấp thấp trong Linux. Tôi có nhiều kinh nghiệm sử dụng API đồ họa cấp cao OpenInventor.

Tôi biết không nhất thiết phải nhận thức được làm thế nào tất cả những điều này phù hợp với nhau nhưng tôi chỉ tò mò. Tôi biết OpenGL chỉ là một tiêu chuẩn cho các ứng dụng đồ họa. Mesa3D dường như là một triển khai nguồn mở của tiêu chuẩn này.

Vậy GLX và DRI phù hợp ở đâu? Tìm hiểu kỹ về Wikipedia và tất cả các trang web này, tôi vẫn chưa tìm thấy lời giải thích về việc tất cả mọi thứ kết hợp với nhau như thế nào. Trường hợp tăng tốc phần cứng xảy ra ở đâu? Trình điều khiển độc quyền phải làm gì với điều này?

Câu trả lời:


15

Ngoại trừ OpenGL, tôi chưa bao giờ sử dụng các thư viện đó, nhưng tôi sẽ cố gắng đoán, bằng cách đọc các trang wikipedia, giống như bạn đã làm.

Bạn có vẻ đúng về Mesa. Dưới đây là thông tin bổ sung mà chúng tôi có:

"Hệ thống cửa sổ X là một hệ thống phần mềm máy tính và giao thức mạng cung cấp GUI cơ bản cho các máy tính nối mạng. Nó tạo ra một lớp trừu tượng phần cứng."

"GLX cho phép các chương trình muốn sử dụng OpenGL để thực hiện điều đó trong một cửa sổ được cung cấp bởi Hệ thống X Window.
GLX bao gồm ba phần:
- API cung cấp các chức năng OpenGL.
- Một phần mở rộng của giao thức X, cho phép máy khách gửi 3D lệnh kết xuất - Một phần mở rộng của máy chủ X nhận lệnh kết xuất từ ​​máy khách và chuyển chúng đến thư viện OpenGL đã cài đặt
Nếu máy khách và máy chủ đang chạy trên cùng một máy tính và có sẵn thẻ đồ họa 3D, hai thành phần trước có thể được bỏ qua bởi DRI. Chương trình máy khách sau đó được phép truy cập trực tiếp vào phần cứng đồ họa. "

"Cơ sở hạ tầng kết xuất trực tiếp (DRI) là một giao diện được sử dụng trong Hệ thống cửa sổ X để cho phép các ứng dụng người dùng truy cập vào phần cứng video mà không yêu cầu dữ liệu được truyền qua máy chủ X."

"Open Inventor là API đồ họa 3D C ++ được thiết kế để cung cấp lớp lập trình cao hơn cho OpenGL"

Để làm cho mọi thứ đơn giản hơn, hãy tưởng tượng một luồng dữ liệu (và lệnh) được đơn giản hóa xảy ra tại các mục nhập và thoát của từng API đó. Lúc đầu, chúng tôi có chương trình ứng dụng của bạn (mã được biên dịch), mà bạn chạy từ máy tính của mình. Cuối cùng, chúng tôi có hình ảnh được hiển thị trên màn hình của bạn.

Có một số trường hợp tôi sẽ hạn chế trả lời cho những câu hỏi sau: -
máy tính của bạn có card đồ họa (GPU) hay chỉ CPU, để xử lý các chức năng đồ họa?
-Là ứng dụng của bạn được nhúng trong một cửa sổ của hệ thống x-window?
-Nếu bạn sử dụng hệ thống cửa sổ x, "máy chủ x" đang chạy trên máy tính của bạn hay trên một máy tính khác trên mạng?
Tôi sẽ cho rằng bạn có trình điều khiển cho GPU của mình nếu có, và bạn có Mesa để kết xuất phần mềm).

Kịch bản đầu tiên: bạn chạy một ứng dụng đồ họa được viết bằng OpenInventor mà không sử dụng Hệ thống X Window và bạn không có thẻ đồ họa. Luồng chương trình sẽ khá giống với:

Your application
  ↓ (uses functions of)
OpenInventor
  ↓ (calls functions declared by)
OpenGL
  ↓ (redirects function calls to implementation defined by)
Mesa
  ↓ (implemented OpenGL functions to be run on the CPU)
[Probably] Operating System rendering API
  ↓
3D Images on your screen

Điều xảy ra ở đây được gọi là "kết xuất phần mềm": lệnh đồ họa không được xử lý bởi bất kỳ phần cứng đồ họa nào, mà thay vào đó là CPU thông thường của bạn, bộ xử lý thường chạy phần mềm.

Kịch bản thứ hai: bây giờ hãy tưởng tượng rằng với cùng điều kiện như trên, bạn có một card đồ họa. Dòng chảy sẽ trông giống như thế này:

Your application
  ↓ (uses functions of)
OpenInventor
  ↓ (calls functions declared by)
OpenGL
  ↓ (redirects function calls to implementation defined by)
Proprietary Drivers
  ↓ (converts OpenGL commands to GPU commands)
Graphic Card
  ↓
3D Images on your screen

Điều xảy ra bây giờ được gọi là "tăng tốc phần cứng", thường nhanh hơn kịch bản đầu tiên.

Kịch bản thứ ba: bây giờ hãy giới thiệu dòng X Window System, hoặc ít nhất là tôi nghĩ nó như thế nào, dựa trên vài dòng Wikipedia tôi đọc.
Hãy quên đi phần cứng đồ họa và API trong một thời gian. Dòng chảy sẽ trông như:

Your application (X Window System sees it as an "X Client")
  ↓ (sends requests defined by the X Window System Core Protocol)
X Server
  ↓ (convert your request to graphic commands)
[Probably] Operating System rendering API
  ↓
Windows or 2D images on your screen

Lưu ý rằng khi sử dụng Hệ thống Cửa sổ X, màn hình của bạn và máy tính mà bạn chạy ứng dụng của bạn có thể không được kết nối "trực tiếp", nhưng có thể được kết nối qua mạng.

Kịch bản thứ tư: giả sử bạn muốn thêm kết xuất đồ họa 3D ưa thích vào ứng dụng X Client của mình từ ví dụ trước. Đối với tôi, dường như hệ thống X Window ban đầu không thể thực hiện được điều này hoặc ít nhất nó sẽ cần nhiều mã phức tạp để thực hiện tương đương với chức năng API OpenGL.
May mắn thay, bạn có thể sử dụng GLX để thêm hỗ trợ cho các lệnh OpenGL cho hệ thống. Bây giờ bạn có:

Your application
  ↓ (sends graphic requests defined by the "GLX extension to the X Protocol")
X Server with the GLX extension
  ↓ (convert your request to OpenGL commands)
OpenGL
  ↓ (redirects function calls to implementation defined by)
 ...

Bây giờ bạn có thể kết nối lại mũi tên cuối cùng đó với mũi tên sau "OpenGL" trong kịch bản đầu tiên: bạn có thể nhận được hình ảnh 3D trên màn hình của mình!

Cuối cùng về những gì tôi nghĩ là hiểu về DRI:
Dường như cho phép Mesa có quyền truy cập vào GPU, do đó sẽ sửa đổi luồng kịch bản đầu tiên của chúng tôi thành:

...
  ↓
Mesa
  ↓ (forwards OpenGL commands)
DRI
  ↓ (converts OpenGL commands to GPU commands)
Graphic Card
  ↓
3D Images on your screen

Và nó dường như cũng làm chập mạch khi sử dụng GLX, với điều kiện máy chủ và máy khách của nó ở trên cùng một máy tính và bạn có GPU. Trong trường hợp đó, đồ thị của kịch bản thứ tư của chúng tôi sẽ trở thành:

Your application
  ↓ (sends graphic requests defined by the "GLX extension to the X Protocol")
DRI
  ↓ ("catches" OpenGL commands and converts them to GPU commands)
Graphic Card
  ↓
3D Images on your screen

Đó là nó !
Bây giờ hãy nhớ rằng tôi không phải là chuyên gia trong môi trường Unix, vì vậy lời khuyên tốt nhất của tôi là nghiên cứu tài liệu của từng API đó để biết chính xác những gì chúng có thể làm.
Kết hợp biểu đồ trước đó vào một biểu đồ duy nhất có thể giúp mọi thứ dễ hiểu hơn. Tôi để điều này như một bài tập cho bạn!


1
nó chỉ là một lý thuyết dựa trên suy luận từ vài câu. nó không phải là sự thật
KawaiKx

8

OpenGL là nền tảng bất khả tri; điều đó có nghĩa là API OpenGL độc lập với nền tảng.

Các trạng thái và bộ đệm OpenGL được thu thập bởi một đối tượng trừu tượng, thường được gọi là bối cảnh.

Nền tảng lưu trữ có trách nhiệm cung cấp một số API để tạo bối cảnh OpenGL cho nền tảng cơ bản. Trên Windows có các thường trình wgl * (Windows cho GL), trên Unix có các thường trình glX * (GL cho X).

Thật vậy, GLX không là gì ngoài một API cho phép ứng dụng tạo bối cảnh OpenGL, để sử dụng API OpenGL.

Các hoạt động WGL / GLX phổ biến là tạo cửa sổ, tạo bộ đệm ngoài màn hình, tạo bối cảnh OpenGL trên luồng, trao đổi bộ đệm vẽ ...

Thay vào đó, DRI là lớp nhân cho phép giao tiếp trực tiếp với card đồ họa, bằng cách vượt qua XServer, thực sự tăng tốc ứng dụng bằng cách sử dụng các thường trình OpenGL.


3

http://www.bitwiz.org.uk/s/how-dri-and-drm-work.html

Cơ sở hạ tầng kết xuất trực tiếp, còn được gọi là DRI, là một khung cho phép truy cập trực tiếp vào phần cứng đồ họa trong Hệ thống X Window một cách an toàn và hiệu quả. Nó bao gồm các thay đổi đối với máy chủ X, tới một số thư viện máy khách và tới kernel (DRM, Trình quản lý kết xuất trực tiếp). Việc sử dụng quan trọng nhất đối với DRI là tạo ra các triển khai OpenGL nhanh cung cấp khả năng tăng tốc phần cứng cho Mesa. Một số trình điều khiển tăng tốc 3D đã được ghi vào đặc tả DRI, bao gồm trình điều khiển cho chipset được sản xuất bởi 3DFX, AMD (trước đây là ATI), Intel và Matrox.


2

Nói một cách đơn giản, OpenGL là loại và đặc tả thư viện đồ họa. Mesa là một cấy ghép cơ sở. DRI là một hệ thống giao diện phần cứng.

Mesa về cơ bản đề cập đến toàn bộ khuôn khổ. Tuy nhiên, tôi sẽ cho rằng bạn đang nói về trình điều khiển phần cứng Mesa.

DRI về cơ bản là giao diện kernel để xử lý phần cứng. Về mặt kỹ thuật nó có thể được sử dụng cho những thứ khác, nhưng nó được tạo ra cho Mesa và chủ yếu được sử dụng cho Mesa.

GLX là cách tất cả các giao diện với X !!

Để hiểu mỗi phần là gì, bạn phải biết làm thế nào nó phù hợp với nhau.

Một chương trình được thiết kế để giao tiếp với bất kỳ thư viện openGL nào.

GLX là phương tiện để giao diện OpenGL với hoặc thông qua X11. Tùy thuộc vào việc bạn có giao diện "Trực tiếp" hay giao diện "Gián tiếp" tùy thuộc vào việc chương trình của bạn sẽ lo lắng về điều này.

libGL khá nhiều là giao diện cho những điều này. Nó thường được cung cấp bởi Mesa nếu bạn đang sử dụng trình điều khiển Mesa.

Trong một thiết lập gián tiếp, nó diễn ra như sau: Khung ứng dụng (tức là ứng dụng viết cứng, API hoặc API trừu tượng) | LibGL | Trình điều khiển Mesa | DRI | Phần cứng

Trong cấu hình này, GLX chỉ được sử dụng ở bên cạnh để xử lý sự giao thoa giữa việc sử dụng GL của chương trình của bạn và các chương trình khác. Khác với các cuộc gọi cụ thể của GLX được sử dụng để thực hiện những việc yêu cầu liên lạc với ngăn xếp X11 và đó là các chương trình hỗ trợ (như Trình quản lý cửa sổ) GLX phần lớn không được xử lý. trong sự sắp xếp này

Hơn nữa, lệnh thông qua và bộ nhớ chia sẻ có thể được sử dụng để tiếp tục tối ưu hóa các lớp trong hệ thống này. Tất cả điều này làm giảm độ trễ và cải thiện tốc độ truy cập phần cứng. Đây là những gì bạn thường muốn.

Đối với một gián tiếp, đó là Khung ứng dụng của bạn | LibGL (Phía người dùng) | LibGLX | LibGL (Bên X11) | Trình điều khiển phần cứng Mesa | DRI | Phần cứng

Ưu điểm của việc này là bạn không cần bộ đệm chia sẻ trực tiếp với phần cứng để sử dụng thiết lập này. (Cho phép các máy khách mạng, cũng như mạnh mẽ hơn và thiết lập an toàn hơn.)

Thiết lập này có thể hoạt động trên nhiều máy ảo chia sẻ một thẻ video hoặc thậm chí truy cập trên một mạng vì điều này. Một số dạng bộ nhớ dùng chung hoặc bộ nhớ "nhân bản" được chia sẻ ảo có thể được sử dụng do các tiện ích mở rộng mới hơn, nhưng nó không phải là quyền truy cập bộ nhớ video trực tiếp được tìm thấy trong chế độ kết xuất trực tiếp.

Nhược điểm là việc sử dụng đường ống hoặc ổ cắm mạng để giao tiếp với X11 có thể bị chậm, ít nhất là độ trễ giới thiệu trên các chương trình được tối ưu hóa tốt, và ở mức tồi tệ nhất, tốc độ khung hình giảm mạnh trên các thiết bị được tối ưu hóa kém.

Đây là loại thiết lập tốt hơn cho các máy khách được nối mạng, các thiết lập yêu cầu bảo mật mạnh hơn và các thiết lập trong đó nhiều Hệ điều hành cần chia sẻ phần cứng bằng cách chạy qua cùng một ngăn xếp GL. Nó không phải là tối ưu nhưng nó mang lại cho bạn một mức độ tăng tốc phần cứng.

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.