Apa hubungan antara OpenGL, GLX, DRI, dan Mesa3D?

17

Saya mulai melakukan pemrograman 3D tingkat rendah di Linux. Saya memiliki banyak pengalaman menggunakan grafik OpenInventor API tingkat tinggi.

Saya tahu tidak sepenuhnya perlu menyadari bagaimana semua hal ini cocok satu sama lain, tetapi saya hanya ingin tahu. Saya tahu OpenGL hanyalah standar untuk aplikasi grafis. Mesa3D tampaknya menjadi implementasi open source dari standar ini.

Jadi di manakah GLX dan DRI cocok? Menggali di Wikipedia dan semua situs web ini, saya belum menemukan penjelasan bagaimana semuanya berjalan bersama. Di mana akselerasi perangkat keras terjadi? Apa hubungan driver eksklusif dengan ini?

ttb
sumber

Jawaban:

15

Kecuali OpenGL, saya tidak pernah menggunakan perpustakaan itu, tapi saya akan mencoba menebak, dengan membaca halaman wikipedia, seperti yang Anda lakukan.

Anda tampaknya benar tentang Mesa. Ini adalah info tambahan yang kami miliki:

"Sistem X Window adalah sistem perangkat lunak komputer dan protokol jaringan yang menyediakan GUI dasar untuk komputer jaringan. Ini menciptakan lapisan abstraksi perangkat keras."

"GLX memungkinkan program yang ingin menggunakan OpenGL untuk melakukannya dalam jendela yang disediakan oleh X Window System.
GLX terdiri dari tiga bagian:
- Sebuah API yang menyediakan OpenGL fungsi.
- Sebuah perpanjangan dari protokol X, yang memungkinkan klien untuk mengirim 3D perintah rendering - Perpanjangan server X yang menerima perintah rendering dari klien dan meneruskannya ke pustaka OpenGL yang terinstal
Jika klien dan server menjalankan pada komputer yang sama dan kartu grafis 3D yang dipercepat tersedia, dua komponen sebelumnya dapat dilewati oleh DRI. Program klien kemudian diizinkan untuk secara langsung mengakses perangkat keras grafis. "

"Infrastruktur Direct Rendering (DRI) adalah antarmuka yang digunakan dalam Sistem X Window untuk memungkinkan aplikasi pengguna untuk mengakses perangkat keras video tanpa memerlukan data untuk dilewatkan melalui server X."

"Open Inventor adalah API grafik C ++ 3D yang dirancang untuk menyediakan lapisan pemrograman yang lebih tinggi untuk OpenGL"

Untuk mempermudah, mari bayangkan aliran data (dan perintah) yang disederhanakan yang terjadi pada entri dan keluar dari masing-masing API tersebut. Pada awalnya kami memiliki program aplikasi Anda (kode terkompilasi), yang Anda jalankan dari komputer Anda. Pada akhirnya kami memiliki gambar yang ditampilkan di layar Anda.

Ada beberapa kasus yang saya akan menahan jawaban atas pertanyaan-pertanyaan ini:
-Apakah komputer Anda memiliki kartu grafis (GPU), atau hanya CPU, untuk memproses fungsi grafis?
-Apakah aplikasi Anda tertanam di jendela sistem x-window?
-Jika Anda menggunakan sistem x window, apakah "x server" berjalan di komputer Anda atau di komputer lain di jaringan?
Saya akan menganggap Anda memiliki driver untuk GPU Anda jika Anda memilikinya, dan Anda memiliki Mesa untuk rendering perangkat lunak).

Skenario pertama: Anda menjalankan aplikasi grafis yang ditulis dengan OpenInventor, tanpa menggunakan Sistem X Window, dan Anda tidak memiliki kartu grafis. Alur program akan sangat mirip dengan:

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

Apa yang terjadi di sini disebut "render perangkat lunak": perintah grafis tidak ditangani oleh perangkat keras grafis apa pun, melainkan oleh CPU Anda yang biasa, prosesor yang biasanya menjalankan perangkat lunak.

Skenario kedua: sekarang bayangkan bahwa dengan kondisi yang sama seperti di atas, Anda memiliki kartu grafis. Alirannya akan terlihat seperti ini:

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

Apa yang terjadi sekarang disebut "akselerasi perangkat keras", biasanya lebih cepat dari skenario pertama.

Skenario ketiga: sekarang mari kita perkenalkan aliran Sistem X Window, atau setidaknya menurut saya, berdasarkan beberapa baris Wikipedia yang saya baca.
Mari kita lupakan tentang perangkat keras grafis dan API untuk sementara waktu. Alurnya harus seperti:

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

Perhatikan bahwa ketika menggunakan Sistem X Window, layar Anda dan komputer tempat Anda menjalankan aplikasi Anda mungkin tidak terhubung "langsung", tetapi dapat dihubungkan melalui jaringan.

Skenario keempat: misalkan Anda ingin menambahkan rendering grafis 3D mewah ke aplikasi X Client Anda dari contoh sebelumnya. Sepertinya saya bahwa Sistem X Window pada awalnya tidak dapat melakukan ini, atau setidaknya akan memerlukan banyak kode yang berbelit-belit untuk melakukan yang setara dengan fungsi OpenGL API.
Untungnya Anda dapat menggunakan GLX untuk menambahkan dukungan untuk perintah OpenGL ke sistem. Anda sekarang memiliki:

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)
 ...

Sekarang Anda dapat menyambungkan kembali panah terakhir ke yang setelah "OpenGL" dalam skenario pertama: Anda bisa mendapatkan gambar 3D di layar Anda!

Akhirnya tentang apa yang saya pikir mengerti tentang DRI:
Tampaknya memungkinkan Mesa memiliki akses ke GPU, sehingga akan mengubah alur skenario pertama kami ke:

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

Dan tampaknya juga arus pendek arus ketika menggunakan GLX, mengingat kondisi bahwa server dan kliennya berada di komputer yang sama, dan bahwa Anda memiliki GPU. Dalam hal itu grafik skenario keempat kita akan menjadi:

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

Itu dia !
Sekarang ingatlah bahwa saya bukan ahli dalam lingkungan Unix, jadi saran terbaik saya adalah mempelajari dokumentasi masing-masing API untuk mengetahui dengan tepat apa yang dapat mereka lakukan.
Menggabungkan grafik sebelumnya ke dalam satu grafik dapat membuat hal-hal lebih mudah untuk dipahami. Saya membiarkan ini sebagai latihan untuk Anda!

usap
sumber
1
itu hanya sebuah teori yang didasarkan pada deduksi dari beberapa kalimat. itu bukan kebenaran.
KawaiKx
8

OpenGL adalah platform agnostik; itu berarti bahwa OpenGL API adalah platform independen.

Status dan buffer OpenGL dikumpulkan oleh objek abstrak, yang biasa disebut konteks.

Platform hosting bertanggung jawab untuk menyediakan beberapa API untuk membuat konteks OpenGL untuk platform yang mendasarinya. Pada Windows ada rutinitas wgl * (Windows untuk GL), pada Unix ada rutinitas glX * (GL untuk X).

Memang GLX hanyalah API yang memungkinkan aplikasi untuk membuat konteks OpenGL, untuk menggunakan OpenGL API.

Operasi WGL / GLX yang umum adalah pembuatan jendela, pembuatan buffer di luar layar, membuat konteks OpenGL terkini di utas, menukar buffer draw ...

DRI sebaliknya adalah lapisan kernel yang memungkinkan komunikasi langsung dengan kartu grafis, dengan melewati XServer, memang mempercepat aplikasi menggunakan rutin OpenGL.

Luca
sumber
3

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

Infrastruktur Direct Rendering, juga dikenal sebagai DRI, adalah kerangka kerja untuk memungkinkan akses langsung ke perangkat keras grafis di bawah Sistem X Window dengan cara yang aman dan efisien. Ini termasuk perubahan ke server X, ke beberapa perpustakaan klien, dan ke kernel (DRM, Direct Rendering Manager). Penggunaan paling penting untuk DRI adalah untuk membuat implementasi OpenGL cepat yang menyediakan akselerasi perangkat keras untuk Mesa. Beberapa driver akselerasi 3D telah ditulis sesuai spesifikasi DRI, termasuk driver untuk chipset yang diproduksi oleh 3DFX, AMD (sebelumnya ATI), Intel dan Matrox.

KawaiKx
sumber
2

Sederhananya OpenGL adalah tipe dan spesifikasi pustaka grafis. Mesa adalah dasar penistaan. DRI adalah sistem antarmuka perangkat keras.

Mesa pada dasarnya mengacu pada keseluruhan kerangka kerja. Namun, saya akan menganggap Anda berbicara tentang driver perangkat keras Mesa.

DRI pada dasarnya adalah antarmuka kernel untuk menangani perangkat keras. Secara teknis dapat digunakan untuk hal-hal lain, tetapi dibuat untuk Mesa dan terutama digunakan untuk Mesa.

GLX adalah bagaimana semuanya terhubung ke X !!

Untuk memahami apa yang masing-masing bagian, Anda harus tahu bagaimana itu cocok

Suatu program dirancang untuk berinteraksi dengan pustaka openGL.

GLX adalah sarana untuk antarmuka OpenGL dengan atau melalui X11. Bergantung pada apakah Anda memiliki antarmuka "Langsung" atau antarmuka "Tidak Langsung" tergantung apakah program Anda akan mengkhawatirkan hal ini.

libGL cukup banyak antarmuka untuk ini. Biasanya disediakan oleh Mesa jika Anda menggunakan driver Mesa.

Dalam pengaturan tidak langsung, ia berjalan sebagai berikut: Kerangka Aplikasi (yaitu aplikasi yang ditulis dengan keras, Mesin, atau Abstraksi API) | LibGL | Mesa Driver | DRI | Perangkat keras

Dalam konfigurasi ini, GLX hanya digunakan di samping untuk menangani antarmuka antara penggunaan GL program Anda dan program lainnya. Selain panggilan khusus GLX yang digunakan untuk melakukan hal-hal yang memerlukan komunikasi tumpukan X11 dan program dukungannya (seperti Pengelola Jendela) GLX sebagian besar tidak tersentuh. dalam pengaturan ini.

Selain itu, perintah passthrough dan memori bersama dapat digunakan untuk lebih mengoptimalkan lapisan dalam sistem ini. Ini semua mengurangi latensi dan meningkatkan kecepatan untuk mengakses perangkat keras. Inilah yang biasanya Anda inginkan.

Untuk tidak langsung itu adalah Kerangka Aplikasi Anda | LibGL (Sisi pengguna) | LibGLX | LibGL (Sisi X11) | Mesa Hardware Driver | DRI | Perangkat keras

Keuntungan dari ini adalah bahwa Anda tidak memerlukan buffer memori bersama langsung dengan perangkat keras untuk menggunakan pengaturan ini. (Mengizinkan klien jaringan, serta ketahanan yang lebih besar, dan pengaturan yang lebih aman.)

Pengaturan ini dapat bekerja di beberapa VM yang berbagi kartu video tunggal atau bahkan mengakses melalui jaringan karena ini. Beberapa bentuk memori bersama atau memori "kloning" bersama virtual dapat digunakan karena ekstensi yang lebih baru, tetapi itu bukan akses memori video langsung yang ditemukan dalam mode render langsung.

Kerugiannya adalah penggunaan pipa atau soket jaringan untuk berinteraksi dengan X11 bisa lambat, paling tidak memperkenalkan latensi pada program yang dioptimalkan dengan baik, dan yang terburuk, secara drastis mengurangi frame-rate pada yang dioptimalkan dengan buruk.

Ini adalah jenis pengaturan yang lebih baik untuk klien jaringan, pengaturan yang memerlukan keamanan lebih kuat, dan pengaturan di mana beberapa Sistem Operasi perlu berbagi perangkat keras dengan menjalankan melalui tumpukan GL yang sama. Ini jauh dari optimal tetapi memberi Anda beberapa tingkat akselerasi perangkat keras.

Robert Wm Ruedisueli
sumber