Метод 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.
Ниже приведены некоторые примеры распространенных вариантов 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 |