Поделиться через


Метод 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

Сочетание D3D12_TILE_MAPPING_FLAGS значений , объединенных с помощью побитовой операции ИЛИ.

Возвращаемое значение

None

Remarks

Используйте UpdateTileMappings , чтобы сопоставить виртуальные страницы зарезервированного ресурса с физическими страницами кучи. Сопоставление не обязательно должно быть в порядке. Операция похожа на ID3D11DeviceContext2::UpdateTileMappings с одним ключевым отличием, что D3D12 позволяет зарезервированным ресурсам иметь плитки из нескольких куч.

В одном вызове UpdateTileMappings можно сопоставить один или несколько диапазонов плиток ресурсов с одним или несколькими диапазонами плиток кучи.

Параметры UpdateTileMappings можно упорядочить следующими способами для выполнения обновления:

  • Зарезервированный ресурс, сопоставления которого обновляются. Сопоставления начинаются со значения NULL при первоначальном создании ресурса.
  • Набор регионов плитки в зарезервированном ресурсе, сопоставления которых обновляются. Вы можете выполнить один вызов UpdateTileMappings для обновления множества сопоставлений или нескольких вызовов с немного большими затратами на вызовы API, если это удобнее.
    • NumResourceRegions указывает количество регионов.
    • pResourceRegionStartCoordinates и pResourceRegionSizes — это все массивы, которые определяют начальную точку и расширение каждого региона. Если NumResourceRegions равно 1, для удобства любой или оба массива, описывающие области, могут иметь значение NULL. Значение NULL для pResourceRegionStartCoordinates означает, что координата начала — все 0, а null для pResourceRegionSizes определяет регион по умолчанию, который является полным набором плиток для всего зарезервированного ресурса, включая все MIP-карты, срезы массива или и то, и другое.
    • Если pResourceRegionStartCoordinates не имеет значение NULL, а pResourceRegionSizes имеет значение NULL, размер региона по умолчанию равен 1 плитке для всех регионов. Это упрощает определение сопоставлений для набора отдельных плиток в разрозненных расположениях, предоставляя массив расположений в pResourceRegionStartCoordinates без необходимости отправлять массив pResourceRegionSizes , для которых задано значение 1.
    Обновления применяются от первого региона к последнему; Таким образом, если регионы перекрываются в одном вызове, обновления позже в списке перезаписывают области, которые перекрываются с предыдущими обновлениями.
  • Куча, которая предоставляет память, в которую могут идти сопоставления плиток. Если 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.
Зарезервированные ресурсы должны соответствовать тем же правилам для псевдонима, инициализации и наследования данных, что и размещенные ресурсы. Дополнительные сведения см. в разделе 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
Header d3d12.h

См. также раздел

CopyTileMappings

ID3D12CommandQueue

Объемные плиточные ресурсы