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