Câu hỏi này hầu như không thể trả lời vì bản thân OpenGL chỉ là một API giao diện người dùng và miễn là việc triển khai tuân thủ đặc điểm kỹ thuật và kết quả phù hợp với điều này, nó có thể được thực hiện theo bất kỳ cách nào bạn muốn.
Câu hỏi có thể là: Trình điều khiển OpenGL hoạt động như thế nào ở mức thấp nhất. Bây giờ điều này một lần nữa là không thể trả lời nói chung, vì trình điều khiển được gắn chặt với một số phần cứng, điều này có thể một lần nữa làm những việc theo cách nhà phát triển thiết kế.
Vì vậy, câu hỏi đáng lẽ phải là: "Nhìn trung bình đằng sau hậu trường của OpenGL và hệ thống đồ họa như thế nào?". Hãy xem xét điều này từ dưới lên:
Ở mức thấp nhất có một số thiết bị đồ họa. Ngày nay, đây là những GPU cung cấp một tập hợp các thanh ghi điều khiển hoạt động của chúng (chính xác là các thanh ghi này phụ thuộc vào thiết bị) có một số bộ nhớ chương trình cho trình tạo bóng, bộ nhớ lớn cho dữ liệu đầu vào (đỉnh, kết cấu, v.v.) và một kênh I / O cho phần còn lại của hệ thống mà nó nhận / gửi dữ liệu và các luồng lệnh.
Trình điều khiển đồ họa theo dõi trạng thái GPU và tất cả các chương trình ứng dụng tài nguyên sử dụng GPU. Ngoài ra, nó chịu trách nhiệm chuyển đổi hoặc bất kỳ xử lý nào khác đối với dữ liệu được gửi bởi các ứng dụng (chuyển đổi kết cấu thành pixelformat được hỗ trợ bởi GPU, biên dịch shader trong mã máy của GPU). Hơn nữa, nó cung cấp một số giao diện trừu tượng, phụ thuộc vào trình điều khiển cho các chương trình ứng dụng.
Sau đó, có thư viện / trình điều khiển máy khách OpenGL phụ thuộc vào trình điều khiển. Trên Windows, điều này được tải bằng proxy thông qua opengl32.dll, trên hệ thống Unix, điều này nằm ở hai nơi:
- Mô-đun X11 GLX và trình điều khiển GLX phụ thuộc vào trình điều khiển
- và /usr/lib/libGL.so có thể chứa một số nội dung phụ thuộc vào trình điều khiển để hiển thị trực tiếp
Trên MacOS X, đây là "OpenGL Framework".
Chính phần này sẽ dịch các cuộc gọi OpenGL theo cách bạn thực hiện thành các lệnh gọi tới các chức năng cụ thể của trình điều khiển trong phần của trình điều khiển được mô tả trong (2).
Cuối cùng là thư viện API OpenGL thực tế, opengl32.dll trong Windows và trên Unix /usr/lib/libGL.so; điều này chủ yếu chỉ chuyển các lệnh đến việc triển khai OpenGL thích hợp.
Không thể khái quát hóa cách giao tiếp thực tế xảy ra:
Trong Unix, kết nối 3 <-> 4 có thể xảy ra qua Sockets (có, nó có thể và thực hiện qua mạng nếu bạn muốn) hoặc thông qua Shared Memory. Trong Windows, thư viện giao diện và ứng dụng khách trình điều khiển đều được tải vào không gian địa chỉ tiến trình, vì vậy không có quá nhiều giao tiếp mà chỉ là các lệnh gọi hàm đơn giản và truyền biến / con trỏ. Trong MacOS X, điều này tương tự như Windows, chỉ có điều là không có sự tách biệt giữa giao diện OpenGL và ứng dụng khách trình điều khiển (đó là lý do tại sao MacOS X rất chậm để theo kịp các phiên bản OpenGL mới, nó luôn yêu cầu nâng cấp toàn bộ hệ điều hành để mang đến cái mới khuôn khổ).
Giao tiếp betwen 3 <-> 2 có thể đi qua ioctl, đọc / ghi hoặc thông qua ánh xạ một số bộ nhớ vào không gian địa chỉ quy trình và định cấu hình MMU để kích hoạt một số mã trình điều khiển bất cứ khi nào thay đổi bộ nhớ đó được thực hiện. Điều này khá giống với bất kỳ hệ điều hành nào vì bạn luôn phải vượt qua ranh giới kernel / userland: Cuối cùng thì bạn cũng phải trải qua một số syscall.
Giao tiếp giữa hệ thống và GPU diễn ra thông qua bus periphial và các phương thức truy cập mà nó xác định, vì vậy PCI, AGP, PCI-E, v.v., hoạt động thông qua Port-I / O, Memory Mapped I / O, DMA, IRQs.