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에서 예약된 리소스에 여러 힙의 타일을 포함할 수 있다는 한 가지 주요 차이점이 있습니다.
UpdateTileMappings에 대한 단일 호출에서 하나 이상의 리소스 타일 범위를 하나 이상의 힙 타일 범위에 매핑할 수 있습니다.
다음과 같은 방법으로 UpdateTileMappings 의 매개 변수를 구성하여 업데이트를 수행할 수 있습니다.
- 매핑이 업데이트되는 예약된 리소스입니다. 매핑은 리소스를 처음 만들 때 모든 NULL에서 시작됩니다.
- 매핑이 업데이트되는 예약된 리소스의 타일 지역 집합입니다. 하나의 UpdateTileMappings 호출을 만들어 더 편리한 경우 더 많은 API 호출 오버헤드로 많은 매핑 또는 여러 호출을 업데이트할 수 있습니다.
- NumResourceRegions 는 지역 수를 지정합니다.
- pResourceRegionStartCoordinates 및 pResourceRegionSizes 는 각 지역의 시작 위치를 식별하고 확장하는 각 배열입니다. NumResourceRegions가 1이면 지역을 설명하는 배열 중 하나 또는 둘 다의 편의를 위해 NULL일 수 있습니다. pResourceRegionStartCoordinates에 대한 NULL은 시작 좌표가 모두 0이고 pResourceRegionSizes의 NULL은 모든 Mipmap, 배열 조각 또는 둘 다를 포함하여 전체 예약된 리소스에 대한 전체 타일 집합인 기본 영역을 식별합니다.
- pResourceRegionStartCoordinates가 NULL이 아니고 pResourceRegionSizes가 NULL인 경우 지역 크기는 모든 지역에 대해 기본적으로 1 타일로 설정됩니다. 이렇게 하면 pResourceRegionSize의 배열을 모두 1로 설정하지 않고도 pResourceRegionStartCoordinates의 위치 배열을 제공하여 서로 다른 위치에서 각각 개별 타일 집합에 대한 매핑을 쉽게 정의할 수 있습니다.
- 타일 매핑이 진행될 수 있는 메모리를 제공하는 힙입니다. UpdateTileMappings가 NULL 매핑만 정의하는 경우 힙을 지정할 필요가 없습니다.
- 매핑이 진행되는 타일 범위 집합입니다. 지정된 각 타일 범위는 힙의 타일 범위(기본값), 힙의 단일 타일에 매핑할 예약 리소스의 타일 수(타일 공유), 건너뛰고 그대로 둘 예약 리소스의 타일 매핑 수 등 몇 가지 범위 중 하나를 지정할 수 있습니다. 또는 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]는 매핑할 힙의 단일 타일을 식별하고 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]는 타일 영역에서 건너뛰고 기존 매핑을 변경하지 않고 유지할 타일 수를 지정합니다. 이는 타일 영역이 타일 매핑 영역을 업데이트하기 위해 편리하게 경계를 지정하는 경우에 유용할 수 있습니다. 단, 이전에 매핑된 것과 동일하게 유지해야 하는 몇 가지 예외가 있습니다. pHeapRangeStartOffsets[i] 는 SKIP 매핑에 대해 무시됩니다.
다음은 일반적인 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);
타일 영역을 단일 타일에 매핑:
// - 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 |