タイル リソース API
このセクションで説明する API は、タイルリソースとタイル プールと連携します。
タイル プールからリソースへのタイルの割り当て
ID3D11DeviceContext2::UpdateTileMappings および ID3D11DeviceContext2::CopyTileMappings API は、タイル マッピングを操作およびクエリします。 更新呼び出しは、呼び出しで識別されたタイルにのみ影響し、他のタイルは前に定義したとおりに残されます。
タイル プールの特定のタイルは、リソース内の複数の場所、さらには複数のリソースにマップできます。 このマッピングには、複数のミップマップが 1 つのタイルにまとめられている、実装によって選択されたレイアウト (Mipmap パッキング) を持つリソース内のタイルが含まれます。 キャッチは、データが 1 つのマッピングを介してタイルに書き込まれ、別の構成のマッピングを介して読み取られた場合、結果は未定義になります。 ただし、この柔軟性を慎重に使用することは、同時に使用されないリソース間でタイルを共有するなど、アプリケーションでは引き続き役立ちます。タイルの内容は、その後読み取られるのと同じリソース マッピングを通じて常に初期化されます。 同様に、同じサーフェス ディメンションを持つ複数の異なるリソースのパックされたミップマップを保持するようにマップされたタイルは正常に機能します。データは両方のマッピングで同じように表示されます。
リソースのタイル割り当ての変更は、即時または遅延のコンテキストでいつでも行うことができます。
リソースのタイリングとサポートのクエリ
リソースタイリングのクエリを実行するには、 ID3D11Device2::GetResourceTiling を使用します。
その他のリソース タイリングのサポートについては、 ID3D11Device2::CheckMultisampleQualityLevels1 を使用します。
タイルデータのコピー
Direct3D でデータを移動するためのメソッドは、タイル化されていないリソースと同様に処理されます。ただし、マップされていない領域への書き込みが削除され、マップされていない領域からの読み取りでは 0 が生成されます。 コピー操作で、コピー先リソース内の複数の場所が同じタイル メモリにマップされるために、同じメモリ位置に複数回書き込む必要がある場合、複数マップされたタイルへの書き込みは非確定的で反復不可能になります。 つまり、アクセスは、ハードウェアがコピーを実行するために発生する順序に関係なく行われます。
Direct3D 11.2 では、次の追加のコピー方法のメソッドが導入されています。
- タイル リソース内のタイル (64 KB のタイル粒度) と (GPU) メモリ (またはステージング リソース) 内のバッファーとの間でコピーする - ID3D11DeviceContext2::CopyTiles
- アプリケーション提供のメモリからタイル リソース内のタイルへのコピー - ID3D11DeviceContext2::UpdateTiles
これらのメソッドは、必要に応じて swizzle/deswizzle を実行し、呼び出し元が宛先メモリが稼働中の GPU 作業によって参照されないことを約束したときに、D3D11_TILE_COPY_NO_OVERWRITE フラグを許可します。
コピーに関係するタイルには、パックされたミップマップを含むタイルや、未定義の結果を含むタイルを含めることはできません。 ハードウェアがパックするミップマップとの間でデータを 1 つのタイルに転送するには、mip チェーン全体に対して標準 (タイル固有ではない) コピー/更新 API または ID3D11DeviceContext::GenerateMips を使用する必要があります。
GenerateMips: 部分的にマップされたタイルを持つリソースで ID3D11DeviceContext::GenerateMips を使用すると、ハードウェアとディスプレイ ドライバーが GenerateMips に使用するアルゴリズムに適用される NULL の読み取りと書き込みの規則に従うだけの結果が生成されます。 そのため、 NULL マッピングを 持つ領域 (および生成フェーズ中の他のミップへの影響) が、アプリケーションが気にしているサーフェスの部分に影響を与えない限り、アプリケーションでこれを行うのに特に役立ちません。
たとえば、ステージング画面またはアプリケーション メモリからタイル データをコピーすると、ディスクからストリーミングされた可能性のあるタイルをアップロードできます。 ディスクをストリーミングオフするときのバリエーションは、何らかの圧縮データを GPU メモリにアップロードし、GPU でデコードすることです。 デコード ターゲットは GPU メモリ内のバッファー リソースであり、 そこから CopyTiles が実際のタイル リソースにコピーされます。 このコピー手順では、スワイズル パターンが不明な場合に GPU をスウィズルできます。 タイル化されたリソース自体がバッファー リソース (テクスチャではなくなど) である場合は、Swizzling は必要ありません。
コピーの非タイル バッファー リソース側のタイルのメモリ レイアウトは、単に 64 KB タイル内のメモリ内の線形です。これは、タイルリソースとの間で転送するときに、ハードウェアとディスプレイ ドライバーがタイルごとにスウィズル/デスワイズルを行います。 マルチサンプル アンチエイリアシング (MSAA) サーフェスの場合、各ピクセルのサンプルは、次のピクセルに移動する前にサンプル インデックス順に走査されます。 右側に部分的に塗りつぶされたタイルの場合 (幅がピクセル単位でタイル幅の倍数ではないサーフェスの場合)、行を下に移動するピッチ/ストライドは、タイルがいっぱいの場合にタイル全体に収まる数値ピクセルのバイト単位のフルサイズです。 そのため、メモリ内のピクセルの各行の間にギャップが存在する可能性があります。 仕様をわかりやすくするため、タイルよりも小さいミップマップは、線形レイアウトでは一緒にパックされません。 これはメモリ領域の無駄のように思われますが、前述のように、ハードウェア パックが CopyTiles または UpdateTiles を介して一緒に使用できないことを mips にコピーします。 アプリケーションでは、汎用 UpdateSubresource*() または CopySubresource*() API を使用して小さなミップを個別にコピーできます。ただし、CopySubresource*() の場合、線形メモリはタイル リソースと同じディメンションである必要があります。CopySubresource*() はバッファー リソースから Texture2D にコピーできません。
ハードウェア標準のスワイズルが定義されている場合は、バッファー内のデータがその形式で解釈されることを示すフラグを追加できます (転送時にスワイズルは必要ありません)。ただし、アプリケーションがタイル プール メモリに直接アクセスできるようにするなど、データをアップロードする別の方法も有効な場合があります。
コピー操作は、即時コンテキストまたは遅延コンテキストで実行できます。
タイル プールのサイズ変更
タイル プールのサイズを変更するには、 ID3D11DeviceContext2::ResizeTilePool を使用します。
タイル リソース バリア
複数のタイル リソース間でデータ アクセス順序の制約を指定するには、 ID3D11DeviceContext2::TiledResourceBarrier を使用します。
関連トピック