다음을 통해 공유


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 는 지역 수를 지정합니다.
    • pResourceRegionStartCoordinatespResourceRegionSizes 는 각 지역의 시작 위치를 식별하고 확장하는 각 배열입니다. 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, pHeapRangeStartOffsetspRangeTileCounts 는 타일 범위를 설명하는 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 매핑에 대해 무시됩니다.
예약된 리소스는 배치된 리소스와 동일한 타일 별칭 지정, 초기화 및 데이터 상속 규칙을 따라야 합니다. 자세한 내용은 CreatePlacedResource 를 참조하세요.

다음은 일반적인 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

추가 정보

CopyTileMappings

ID3D12CommandQueue

볼륨 타일식 리소스