ID3D12CommandQueue::UpdateTileMappings メソッド (d3d12.h)
予約済みリソース内のタイルの場所とリソース ヒープ内のメモリの場所のマッピングを更新します。
構文
void UpdateTileMappings(
[in] ID3D12Resource *pResource,
UINT NumResourceRegions,
[in, optional] const D3D12_TILED_RESOURCE_COORDINATE *pResourceRegionStartCoordinates,
[in, optional] const D3D12_TILE_REGION_SIZE *pResourceRegionSizes,
[in, optional] ID3D12Heap *pHeap,
UINT NumRanges,
[in, optional] const D3D12_TILE_RANGE_FLAGS *pRangeFlags,
[in, optional] const UINT *pHeapRangeStartOffsets,
[in, optional] const UINT *pRangeTileCounts,
D3D12_TILE_MAPPING_FLAGS Flags
);
パラメーター
[in] pResource
予約済みリソースへのポインター。
NumResourceRegions
予約済みリソース リージョンの数。
[in, optional] pResourceRegionStartCoordinates
予約済みリソース領域の開始座標を記述する D3D12_TILED_RESOURCE_COORDINATE 構造体の配列。 NumResourceRegions パラメーターは、配列内のD3D12_TILED_RESOURCE_COORDINATE構造体の数を指定します。
[in, optional] pResourceRegionSizes
予約済みリソース領域のサイズを記述する D3D12_TILE_REGION_SIZE 構造体の配列。 NumResourceRegions パラメーターは、配列内のD3D12_TILE_REGION_SIZE構造体の数を指定します。
[in, optional] pHeap
リソース ヒープへのポインター。
NumRanges
タイル範囲の数。
[in, optional] pRangeFlags
各タイル範囲を記述 するD3D12_TILE_RANGE_FLAGS 値の配列へのポインター。 NumRanges パラメーターは、配列内の値の数を指定します。
[in, optional] pHeapRangeStartOffsets
リソース ヒープへのオフセットの配列。 これらは 0 から始まるタイル オフセットであり、タイル単位でカウントされます (バイト単位ではありません)。
[in, optional] pRangeTileCounts
タイルの配列。 各タイル範囲のタイルの数を指定する値の配列。 NumRanges パラメーターは、配列内の値の数を指定します。
Flags
ビットごとの OR 演算を使用して結合される D3D12_TILE_MAPPING_FLAGS 値の組み合わせ。
戻り値
なし
解説
UpdateTileMappings を使用して、予約済みリソースの仮想ページをヒープの物理ページにマップします。 マッピングを順番に行う必要はありません。 操作は ID3D11DeviceContext2::UpdateTileMappings に似ていますが、D3D12 では予約済みリソースに複数のヒープのタイルを含めるという 1 つの主な違いがあります。
UpdateTileMappings を 1 回呼び出すと、1 つ以上のリソース タイル範囲を 1 つ以上のヒープ タイルの範囲にマップできます。
UpdateTileMappings のパラメーターは、次の方法で整理して更新を実行できます。
- マッピングが更新される予約済みリソース。 マッピングは、リソースが最初に作成されたときに、すべての NULL から開始されます。
- マッピングが更新される予約済みリソース上のタイル 領域のセット。 1 つの UpdateTileMappings 呼び出しを行って、多くのマッピングまたは複数の呼び出しを、API 呼び出しのオーバーヘッドを少し増やして更新できます(便利な場合)。
- NumResourceRegions は、 領域の数を指定します。
- pResourceRegionStartCoordinates と pResourceRegionSizes は、各リージョンの開始位置と拡張を識別する各配列です。 NumResourceRegions が 1 の場合、便宜上、領域を記述する配列のいずれかまたは両方を NULL にすることができます。 pResourceRegionStartCoordinates の場合、NULL は開始座標がすべて 0s であることを意味し、pResourceRegionSizes の場合は NULL は、すべての mipmap、配列スライス、またはその両方を含む、予約済みリソース全体のタイルの完全なセットである既定の領域を識別します。
- pResourceRegionStartCoordinates が NULL ではなく、pResourceRegionSizes が NULL の場合、すべてのリージョンに対してリージョン サイズの既定値は 1 タイルになります。 これにより、 pResourceRegionStartCoordinates 内の場所の配列を指定することで、 pResourceRegionSizes の配列をすべて 1 に設定せずに、異なる場所にある個々のタイルのセットのマッピングを簡単に定義できます。
- タイル マッピングを実行できるメモリを提供するヒープ。 UpdateTileMappings で NULL マッピングのみが定義されている場合は、ヒープを指定する必要はありません。
- マッピングが行われるタイル範囲のセット。 指定された各タイル範囲では、いくつかの種類の範囲のいずれかを指定できます。ヒープ内のタイルの範囲 (既定値)、ヒープ内の 1 つのタイルにマップする予約済みリソース内のタイルの数 (タイルを共有する)、予約済みリソース内のタイル マッピングの数をスキップしてそのまま残します。 または、NULL にマップするヒープ内のタイルの数。NumRanges では、タイル範囲の数を指定します。すべての範囲で識別されるタイルの合計数は、前に説明した予約済みリソースのタイル領域のタイルの合計数と一致する必要があります。 マッピングは、タイル領域のタイルを順番に繰り返して定義します (x、y、ボックス領域の z オーダー)。 一連のタイル範囲を順番に進めます。 タイル領域の内訳はタイル範囲の内訳と一緒に並ぶ必要はありませんが、指定された各予約済みリソース タイルにマッピングが指定されるように、両側のタイルの合計数が等しい必要があります。
pRangeFlags、 pHeapRangeStartOffsets、 および pRangeTileCounts はすべて、タイルの範囲を表す NumRanges サイズの配列です。 pRangeFlags が NULL の場合、すべての範囲はヒープ内のシーケンシャル タイルです。それ以外の場合、範囲 i,pRangeFlags[i] ごとに、その範囲のタイルのマッピングがどのように機能するかを識別します。
- pRangeFlags[i] がD3D12_TILE_RANGE_FLAG_NONE場合、その範囲はヒープ内のシーケンシャル タイルを定義し、タイルの数は pRangeTileCounts[i] であり、開始位置は pHeapRangeStartOffsets[i]になります。 NumRanges が 1 の場合、pRangeTileCounts は NULL になり、すべてのタイル領域で指定されたタイルの合計数が既定値になります。
- pRangeFlags[i] がD3D12_TILE_RANGE_FLAG_REUSE_SINGLE_TILE場合、pHeapRangeStartOffsets[i] はマップ先のヒープ内の 1 つのタイルを識別し、pRangeTileCounts[i] は、そのヒープの場所にマップするタイル領域のタイルの数を指定します。 NumRanges が 1 の場合、pRangeTileCounts は NULL になり、すべてのタイル領域で指定されたタイルの合計数が既定値になります。
- pRangeFlags[i] がD3D12_TILE_RANGE_FLAG_NULL場合、pRangeTileCounts[i] は、NULL にマップするタイル領域のタイルの数を指定します。 NumRanges が 1 の場合、pRangeTileCounts は NULL になり、すべてのタイル領域で指定されたタイルの合計数が既定値になります。 pHeapRangeStartOffsets[i] は NULL マッピングでは無視されます。
- pRangeFlags[i] がD3D12_TILE_RANGE_FLAG_SKIP場合、pRangeTileCounts[i] は、スキップして既存のマッピングを変更せずに残すタイル領域のタイルの数を指定します。 これは、タイル領域がタイル マッピングの領域を適切にバインドして更新する場合に便利です。ただし、一部の例外を除き、以前にマップされたものと同じままにする必要があります。 SKIP マッピングでは pHeapRangeStartOffsets[i] は無視されます。
一般的な UpdateTileMappings ケースの例を次に示します。
例
この例では、次の構造体と列挙型を参照しています。
サーフェスのマッピング全体を NULL にクリアする// - NULL for pResourceRegionStartCoordinates and pResourceRegionSizes defaults to the entire resource
// - NULL for pHeapRangeStartOffsets since it isn't needed for mapping tiles to NULL
// - NULL for pRangeTileCounts when NumRanges is 1 defaults to the same number of tiles as the resource region (which is
// the entire surface in this case)
//
UINT RangeFlags = D3D12_TILE_RANGE_FLAG_NULL;
pCommandQueue->UpdateTileMappings(pResource, 1, NULL, NULL, NULL, 1, &RangeFlags, NULL, NULL, D3D12_TILE_MAPPING_FLAG_NONE);
タイルの領域を 1 つのタイルにマッピングする:
// - This maps a 2x3 tile region at tile offset (1,1) in a resource to tile [12] in a heap
//
D3D12_TILED_RESOURCE_COORDINATE TRC;
TRC.X = 1;
TRC.Y = 1;
TRC.Z = 0;
TRC.Subresource = 0;
D3D12_TILE_REGION_SIZE TRS;
TRS.bUseBox = TRUE;
TRS.Width = 2;
TRS.Height = 3;
TRS.Depth = 1;
TRS.NumTiles = TRS.Width * TRS.Height * TRS.Depth;
UINT RangeFlags = D3D12_TILE_RANGE_FLAG_REUSE_SINGLE_TILE;
UINT StartOffset = 12;
pCommandQueue->UpdateTileMappings(pResource,1,&TRC,&TRS,pHeap,1,&RangeFlags,&StartOffset,NULL,D3D12_TILE_MAPPING_FLAG_NONE);
一連の不整合な個々のタイルのマッピングの定義:
// - This can also be accomplished in multiple calls.
// A single call to define multiple mapping updates can reduce CPU call overhead slightly,
// at the cost of having to pass arrays as parameters.
// - Passing NULL for pResourceRegionSizes defaults to each region in the resource
// being a single tile. So all that is needed are the coordinates of each one.
// - Passing NULL for pRangeFlags defaults to no flags (since none are needed in this case)
// - Passing NULL for pRangeTileCounts defaults to each range in the heap being size 1.
// So all that is needed are the start offsets for each tile in the heap
//
D3D12_TILED_RESOURCE_COORDINATE TRC[3];
UINT StartOffsets[3];
UINT NumSingleTiles = 3;
TRC[0].X = 1;
TRC[0].Y = 1;
TRC[0].Subresource = 0;
StartOffsets[0] = 1;
TRC[1].X = 4;
TRC[1].Y = 7;
TRC[1].Subresource = 0;
StartOffsets[1] = 4;
TRC[2].X = 2;
TRC[2].Y = 3;
TRC[2].Subresource = 0;
StartOffsets[2] = 7;
pCommandQueue->UpdateTileMappings(pResource,NumSingleTiles,&TRC,NULL,pHeap,NumSingleTiles,NULL,StartOffsets,
NULL,D3D12_TILE_MAPPING_FLAG_NONE);
複雑な例 - 一部のスキップ、一部の NULL マッピングを含むリージョンのマッピングを定義します。
// - This complex example hard codes the parameter arrays, whereas in practice the
// application would likely configure the parameters programatically or in a data driven way.
// - Suppose we have 3 regions in a resource to configure mappings for, 2x3 at coordinate (1,1),
// 3x3 at coordinate (4,7), and 7x1 at coordinate (20,30)
// - The tiles in the regions are walked from first to last, in X then Y then Z order,
// while stepping forward through the specified Tile Ranges to determine each mapping.
// In this example, 22 tile mappings need to be defined.
// - Suppose we want the first 3 tiles to be mapped to a contiguous range in the heap starting at
// heap location [9], the next 8 to be skipped (left unchanged), the next 2 to map to NULL,
// the next 5 to share a single tile (heap location [17]) and the remaining
// 4 tiles to each map to to unique heap locations, [2], [9], [4] and [17]:
//
D3D12_TILED_RESOURCE_COORDINATE TRC[3];
D3D12_TILE_REGION_SIZE TRS[3];
UINT NumRegions = 3;
TRC[0].X = 1;
TRC[0].Y = 1;
TRC[0].Subresource = 0;
TRS[0].bUseBox = TRUE;
TRS[0].Width = 2;
TRS[0].Height = 3;
TRS[0].NumTiles = TRS[0].Width * TRS[0].Height;
TRC[1].X = 4;
TRC[1].Y = 7;
TRC[1].Subresource = 0;
TRS[1].bUseBox = TRUE;
TRS[1].Width = 3;
TRS[1].Height = 3;
TRS[1].NumTiles = TRS[1].Width * TRS[1].Height;
TRC[2].X = 20;
TRC[2].Y = 30;
TRC[2].Subresource = 0;
TRS[2].bUseBox = TRUE;
TRS[2].Width = 7;
TRS[2].Height = 1;
TRS[2].NumTiles = TRS[2].Width * TRS[2].Height;
UINT NumRanges = 8;
UINT RangeFlags[8];
UINT HeapRangeStartOffsets[8];
UINT RangeTileCounts[8];
RangeFlags[0] = 0;
HeapRangeStartOffsets[0] = 9;
RangeTileCounts[0] = 3;
RangeFlags[1] = D3D12_TILE_RANGE_FLAG_SKIP;
HeapRangeStartOffsets[1] = 0; // offset is ignored for skip mappings
RangeTileCounts[1] = 8;
RangeFlags[2] = D3D12_TILE_RANGE_FLAG_NULL;
HeapRangeStartOffsets[2] = 0; // offset is ignored for NULL mappings
RangeTileCounts[2] = 2;
RangeFlags[3] = D3D12_TILE_RANGE_FLAG_REUSE_SINGLE_TILE;
HeapRangeStartOffsets[3] = 17;
RangeTileCounts[3] = 5;
RangeFlags[4] = 0;
HeapRangeStartOffsets[4] = 2;
RangeTileCounts[4] = 1;
RangeFlags[5] = 0;
HeapRangeStartOffsets[5] = 9;
RangeTileCounts[5] = 1;
RangeFlags[6] = 0;
HeapRangeStartOffsets[6] = 4;
RangeTileCounts[6] = 1;
RangeFlags[7] = 0;
HeapRangeStartOffsets[7] = 17;
RangeTileCounts[7] = 1;
pCommandQueue->UpdateTileMappings(pResource,NumRegions,TRC,TRS,pHeap,NumRanges,RangeFlags,
HeapRangeStartOffsets,RangeTileCounts,D3D12_TILE_MAPPING_FLAG_NONE);
要件
対象プラットフォーム | Windows |
ヘッダー | d3d12.h |