OpenGL自体は単なるフロントエンドAPIであるため、この質問に答えることはほとんど不可能です。実装が仕様に準拠し、結果がこれに準拠している限り、任意の方法で実行できます。
問題は、OpenGLドライバーが最低レベルでどのように機能するかということだったかもしれません。ドライバーはハードウェアの一部に密接に関連しているため、これも一般的に答えることは不可能です。ハードウェアは、開発者が設計したものの、再び何かを行う可能性があります。
したがって、質問は「OpenGLとグラフィックシステムの舞台裏で平均してどのように見えるか」ということでした。これを下から上に見てみましょう:
最下位レベルには、いくつかのグラフィックデバイスがあります。現在、これらは、動作を制御するレジスタのセット(正確にはデバイスに依存するレジスタ)を提供するGPUであり、シェーダー用のプログラムメモリ、入力データ(頂点、テクスチャなど)用のバルクメモリ、および残りのI / Oチャネルを備えています。データとコマンドストリームを受信/送信するシステムの
グラフィックドライバは、GPUの状態とGPUを利用するすべてのリソースアプリケーションプログラムを追跡します。また、アプリケーションによって送信されたデータの変換またはその他の処理を担当します(テクスチャをGPUでサポートされているピクセル形式に変換し、GPUのマシンコードでシェーダーをコンパイルします)。さらに、アプリケーションプログラムへの抽象的なドライバ依存インターフェイスを提供します。
次に、ドライバーに依存するOpenGLクライアントライブラリ/ドライバーがあります。Windowsでは、これはopengl32.dllを介してプロキシによってロードされますが、Unixシステムでは、これは2つの場所にあります。
- X11GLXモジュールとドライバー依存のGLXドライバー
- および/usr/lib/libGL.soには、直接レンダリング用のドライバー依存のものが含まれている場合があります
MacOS Xでは、これはたまたま「OpenGLフレームワーク」です。
OpenGL呼び出しを、(2)で説明されているドライバーの部分のドライバー固有の関数への呼び出しに変換するのはこの部分です。
最後に、実際のOpenGL APIライブラリ、WindowsおよびUnixのopengl32.dll / usr / lib / libGL.so。これはほとんどの場合、コマンドをOpenGL実装に適切に渡すだけです。
実際のコミュニケーションがどのように行われるかを一般化することはできません。
Unixでは、3 <-> 4接続は、ソケット(はい、必要に応じてネットワーク経由)または共有メモリ経由で発生する可能性があります。Windowsでは、インターフェイスライブラリとドライバクライアントの両方がプロセスのアドレス空間に読み込まれるため、通信はそれほど多くありませんが、単純な関数呼び出しと変数/ポインタの受け渡しが行われます。MacOS XではこれはWindowsに似ていますが、OpenGLインターフェイスとドライバクライアントの間に分離がない点が異なります(MacOS Xが新しいOpenGLバージョンに追いつくのが非常に遅い理由であり、新しいバージョンを提供するには常に完全なオペレーティングシステムのアップグレードが必要ですフレームワーク)。
3 <-> 2間の通信は、ioctl、読み取り/書き込み、または一部のメモリをプロセスアドレス空間にマッピングし、そのメモリに変更が加えられるたびに一部のドライバコードをトリガーするようにMMUを構成することによって行われます。これは、常にカーネルとユーザーランドの境界を越える必要があるため、どのオペレーティングシステムでも非常によく似ています。最終的には、システムコールを実行します。
システムとGPU間の通信は、ペリフィアルバスとそれが定義するアクセス方法を介して行われるため、PCI、AGP、PCI-Eなどは、ポートI / O、メモリマップドI / O、DMA、IRQを介して機能します。