ディスプレイリストは、Direct3D 12ではコマンド リスト、 Vulkanではコマンド バッファとも呼ばれ、リストが実行されるときに実行される一連のグラフィックス コマンドまたは命令です。[ 1 ]ディスプレイ リスト機能を使用するシステムは保持モードシステムと呼ばれ、使用しないシステムは対照的に即時モードシステムと呼ばれます。OpenGL では、ディスプレイリストは同じジオメトリを再描画したり、一連の状態変更を複数回適用したりするのに役立ちます。[ 2 ] [ 3 ]この利点は、Direct3D 12 のバンドル コマンド リストでも使用されます。Direct3D 12 と Vulkan では、ディスプレイ リストはフレームごとの記録と実行によく使用されます。
1960年代と1970年代のベクターモニターまたはカリグラフィディスプレイは、電子ビーム偏向を使用して、線分、点、場合によっては曲線をCRTスクリーンに直接描画しました。画像はすぐに消えてしまうため、1秒間に何度も再描画する必要がありました(ストレージ管CRTは、画面が消えるまで画像を保持しましたが、インタラクティブグラフィックスには適していませんでした)。ディスプレイを更新するために、ディスプレイプロセッサまたはディスプレイ処理ユニット(DPU)と呼ばれる専用のCPUが使用され、線分座標やその他の情報を含む「ディスプレイリスト」、「ディスプレイファイル」、または「ディスプレイプログラム」用のメモリバッファを備えていました。高度なディスプレイプロセッサは、テキストなどの反復的なグラフィックを描画するのに役立つ制御フロー命令もサポートしており、3D投影などの座標変換を実行できるものもありました。[ 4 ] [ 5 ]
真のディスプレイ リストを備えた初期のシステムの 1 つは、Atari 8 ビット コンピュータでした。ディスプレイ リスト (Atari の用語では実際にそう呼ばれています) は、これらのマシンで使用されているビデオ コ プロセッサであるANTICの一連の命令です。コンピュータのメモリに格納され、ANTIC によってリアルタイムで実行されるこのプログラムは、空白行、6 つのテキスト モードと 8 つのグラフィック モードのいずれか、画面のどのセクションを水平または垂直に細かくスクロールできるか、およびディスプレイ リスト割り込み (他のシステムではラスタ割り込みまたはHBIと呼ばれます) をトリガーすることができます。[ 6 ]
Amstrad PCW ファミリーには、「ローラー RAM」と呼ばれるディスプレイ リスト機能があります。これは、720 × 256 ピクセルのディスプレイの各行に対応する 256 個の 16 ビット ポインタで構成される 512 バイトの RAM 領域です。各ポインタは、その行の 720 ピクセルの状態を保持する 90 バイトのモノクロ ピクセルの位置を識別します。8 ピクセルの状態からなる 90 バイトは 8 バイト間隔で配置されているため、各ピクセル データ バイトの間に 7 バイトの未使用領域があります。これは、テキスト指向の PCW が RAM 内に典型的なスクリーン バッファを構築する方法に適しています。最初の文字の 8 行は最初の 8 バイトに格納され、2 番目の文字の行は次の 8 バイトに格納される、といった具合です。ローラー RAM は、ディスプレイ スクロールを高速化するために実装されました。3.4 MHz の Z80 プロセッサでは、23 KB のディスプレイ バッファをソフトウェアで手動でスクロールするのは許容できないほど遅いためです。画面更新の開始時に使用されるローラーRAMの開始エントリは、Z80が書き込み可能なI/Oレジスタによって制御されます。したがって、このI/Oレジスタを変更するだけで画面をスクロールできます。
ハードウェアでディスプレイリストのような機能を使用するもう1つのシステムはAmigaです。偶然にも、AmigaもAtari 8ビットコンピュータ用のカスタムハードウェアを開発した人々の一部によって設計されました。ディスプレイモードを生成するように指示されると、後続のすべてのスキャンラインに対して自動的にそれを継続します。このコンピュータには、「Copper」と呼ばれる専用のコプロセッサも含まれており、ディスプレイと同期してハードウェアレジスタを変更することを目的とした単純なプログラム、つまり「Copperリスト」を実行しました。Copperリストの命令は、ディスプレイが画面上の特定の位置に達するまでCopperを待機させ、その後ハードウェアレジスタの内容を変更するように指示することができました。事実上、これはラスタ割り込みを処理するための専用プロセッサでした。CopperはWorkbenchによって複数のディスプレイモード(モニター上に複数の解像度とカラーパレットを同時に表示)をミックスするために使用され、また多くのプログラムによって画面上にレインボーやグラデーション効果を作成するために使用されました。Amiga Copperは、わずか1スキャンラインの遅延で、フレームの途中でスプライトエンジンを再構成することもできました。これにより、Amiga は 8 個のハードウェア スプライトを超えるスプライトを描画できるようになりました。ただし、追加のスプライトが 7 個以上の他のスプライトとスキャンライン (または 1 スキャンラインのギャップ) を共有しないことが条件でした。つまり、少なくとも 1 つのスプライトの描画が完了していれば、その下に別のスプライトを画面に追加できました。さらに、後期の 32 ビット AGA チップセットでは、同じ多重化を維持しながら、より大きなスプライト (行あたりのピクセル数が多い) を描画することができました。Amiga には、より大きなオブジェクトをフレーム バッファに描画できる専用のブロック シフター (「ブリッター」) ハードウェアもありました。これは、スプライトの代わりに、またはスプライトに加えてよく使用されました。
より原始的なシステムでは、表示リストの結果をシミュレートすることは可能ですが、その代償として、デバイスによって実行される一連のレンダリングコマンドではなく、ビデオデバイス内の特定の表示モード、カラーコントロール、またはその他の視覚効果レジスタへのCPU負荷の高い書き込みが発生します。したがって、CPU駆動の表示生成の実行前または実行中に、別のレンダリングプロセスを使用して表示画像を作成する必要があります。多くの場合、画像はフレーム間でも変更または再レンダリングされます。その後、画像はCPU駆動の表示コードの実装方法に応じて、さまざまな方法で表示されます。
CPU駆動のビデオを必要とするこれらの旧型マシンで実現可能な結果の例としては、Commodore 64/128のFLIモードや、ZX Spectrumのレインボー処理などのエフェクトが挙げられます。
表示リストを区切るには、関数glNewListとglEndList関数が使用され、リストを実行するにはglCallList関数が使用されます。関数呼び出しの間に発生するほとんどすべてのレンダリングコマンドは、表示リストに格納されます。クライアントの状態に影響を与えるコマンドは、表示リストには格納されません。[ 7 ]表示リストには整数値が付けられ、既に作成されているものと同じ名前の表示リストを作成すると、最初のものが上書きされます。[ 8 ]
このglNewList関数は、リストの名前を表す整数とコンパイルモードの列挙型の 2 つの引数を必要とします。 2 つのモードにはGL_COMPILE_AND_EXECUTE、コンパイルしてすぐに実行する と、GL_COMPILEリストのみをコンパイルする があります。[ 9 ]
ディスプレイリストを使用すると、保持モードレンダリングパターンを使用できます。これは、グラフィックコマンドを記録(保持)して後で連続して実行するシステムです。これは、グラフィックコマンドがクライアント呼び出し時にすぐに実行される即時モードとは対照的です。 [ 10 ]
コマンド リストは、関数を使用して作成されますID3D12Device::CreateCommandList。[ 11 ]コマンド リストは、ダイレクト、バンドル、コンピュート、コピー、ビデオ デコード、ビデオ プロセス、ビデオ エンコードなど、いくつかのタイプで作成できます。ダイレクト コマンド リストは、GPU が実行できるコマンド リストを指定し、GPU の状態を継承しません。[ 12 ]バンドルは、少数のコマンド セットを任意の回数保存および実行するのに最適です。これは、コマンド リストに格納されたコマンドが通常 1 回だけ実行される通常のコマンド リストとは異なります。[ 11 ]コンピュート コマンド リストは、一般的な計算に使用され、一般的な用途としてはミップ マップの計算があります。[ 13 ]コピー コマンド リストはコピー専用で、ビデオ デコード コマンド リストとビデオ プロセス コマンド リストは、それぞれビデオ デコードと処理に使用されます。[ 12 ]
コマンドリストは作成時に記録状態になります。コマンドリストは関数を呼び出すことで再利用できますID3D12GraphicsCommandList::Reset。コマンドを記録した後、関数を呼び出してコマンドリストを記録状態から移行させる必要がありますID3D12GraphicsCommandList::Close。その後、関数を呼び出してコマンドリストを実行しますID3D12CommandQueue::ExecuteCommandLists。[ 11 ]