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


Метод ID3D11DeviceContext2::UpdateTileMappings (d3d11_2.h)

Обновления сопоставления расположений плиток в мозаичного ресурсах с расположениями памяти в пуле плиток.

Синтаксис

HRESULT UpdateTileMappings(
  [in]           ID3D11Resource                        *pTiledResource,
  [in]           UINT                                  NumTiledResourceRegions,
  [in, optional] const D3D11_TILED_RESOURCE_COORDINATE *pTiledResourceRegionStartCoordinates,
  [in, optional] const D3D11_TILE_REGION_SIZE          *pTiledResourceRegionSizes,
  [in, optional] ID3D11Buffer                          *pTilePool,
  [in]           UINT                                  NumRanges,
  [in, optional] const UINT                            *pRangeFlags,
  [in, optional] const UINT                            *pTilePoolStartOffsets,
  [in, optional] const UINT                            *pRangeTileCounts,
  [in]           UINT                                  Flags
);

Параметры

[in] pTiledResource

Тип: ID3D11Resource*

Указатель на ресурс с плиткой.

[in] NumTiledResourceRegions

Тип: UINT

Количество фрагментированных регионов ресурсов.

[in, optional] pTiledResourceRegionStartCoordinates

Тип: const D3D11_TILED_RESOURCE_COORDINATE*

Массив D3D11_TILED_RESOURCE_COORDINATE структур, описывающих начальные координаты областей ресурсов с плитками. Параметр NumTiledResourceRegions указывает количество D3D11_TILED_RESOURCE_COORDINATE структур в массиве.

[in, optional] pTiledResourceRegionSizes

Тип: const D3D11_TILE_REGION_SIZE*

Массив D3D11_TILE_REGION_SIZE структур, описывающих размеры областей ресурсов с плитками. Параметр NumTiledResourceRegions указывает количество D3D11_TILE_REGION_SIZE структур в массиве.

[in, optional] pTilePool

Тип: ID3D11Buffer*

Указатель на пул плиток.

[in] NumRanges

Тип: UINT

Количество диапазонов пула плиток.

[in, optional] pRangeFlags

Тип: const UINT*

Массив D3D11_TILE_RANGE_FLAG значений , описывающих каждый диапазон пула плиток. Параметр NumRanges указывает количество значений в массиве.

[in, optional] pTilePoolStartOffsets

Тип: const UINT*

Массив смещений в пуле плиток. Это смещения плиток на основе 0, которые учитываются в плитках (а не в байтах).

[in, optional] pRangeTileCounts

Тип: const UINT*

Массив плиток.

Массив значений, указывающих количество плиток в каждом диапазоне пула плиток. Параметр NumRanges указывает количество значений в массиве.

[in] Flags

Тип: UINT

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

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

Тип: HRESULT

Возвращает S_OK в случае успешного выполнения; в противном случае возвращает одно из следующих значений:

  • Возвращает E_INVALIDARG , если различные условия, такие как недопустимые флаги, приводят к отмене вызова. Уровень отладки выдаст ошибку.
  • Возвращает E_OUTOFMEMORY , если вызов приводит к тому, что драйверу приходится выделять место для новых сопоставлений таблиц страниц, но не хватает памяти. При нехватке памяти при вызове в командном списке и выполнении этого списка устройство будет удалено. Приложения могут избежать этой ситуации, выполняя только вызовы обновления, которые изменяют существующие сопоставления из плиток ресурсов в списках команд (поэтому драйверам не придется выделять память таблицы страниц, а только изменять сопоставление).
  • Возвращает DXGI_ERROR_DEVICE_REMOVED, если карта видео было физически удалено из системы или произошло обновление драйвера для карта видео.

Комментарии

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

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

  • Ресурс с плиткой, сопоставления которого обновляются. Это ресурс, созданный с флагом D3D11_RESOURCE_MISC_TILED . Сопоставления начинаются со значения NULL при первоначальном создании ресурса.
  • Набор регионов плиток в ресурсе с плитками, сопоставления которых обновляются. Вы можете выполнить один вызов UpdateTileMappings , чтобы обновить множество сопоставлений или нескольких вызовов с немного большими затратами на вызовы API, если это удобнее. NumTiledResourceRegions указывает количество регионов, pTiledResourceRegionStartCoordinates и pTiledResourceRegionSizes — это массивы , которые определяют начальную точку и расширение каждого региона. Если numTiledResourceRegions имеет значение 1, для удобства любой или оба массива, описывающие регионы, могут иметь значение NULL. Значение NULL для pTiledResourceRegionStartCoordinates означает, что начальная координата — 0s, а null для pTiledResourceRegionSizes определяет регион по умолчанию, который является полным набором плиток для всего мозаичного ресурса, включая все MIP-карты, срезы массива или и то, и другое. Если pTiledResourceRegionStartCoordinates не равно NULL, а pTiledResourceRegionSizes — NULL, размер региона по умолчанию равен 1 плитке для всех регионов. Это упрощает определение сопоставлений для набора отдельных плиток в разрозненных расположениях, предоставляя массив расположений в pTiledResourceRegionStartCoordinates без необходимости отправлять массив pTiledResourceRegionSizes , для которых задано значение 1.

    Обновления применяются от первого региона к последнему; Таким образом, если регионы перекрываются в одном вызове, обновления позже в списке перезаписывают области, которые перекрываются с предыдущими обновлениями.

  • Пул плиток, предоставляющий память, в которую могут идти сопоставления плиток. Ресурс с плитками может одновременно указывать на один пул плиток. Если указан новый пул плиток (в первый раз или отличается от последнего указания пула плиток), все существующие сопоставления плиток для ресурса с плитками очищаются, а новый набор сопоставлений в текущем вызове UpdateTileMappings применяется к новому пулу плиток. Если пул плиток не указан (NULL) или указан тот же пул плиток, что и при предыдущем вызове UpdateTileMappings , вызов UpdateTileMappings просто добавляет новые сопоставления к существующим (перезапись при перекрытии). Если UpdateTileMappings определяет только сопоставления NULL, указывать пул плиток не нужно, так как он не имеет значения. Но если указать пул плиток в любом случае, при предоставлении пула плиток будет выполняться то же поведение, что и ранее.
  • Набор диапазонов плиток, в которых будут происходить сопоставления. Каждый заданный диапазон плиток может указать один из нескольких типов диапазонов: диапазон плиток в пуле плиток (по умолчанию), количество плиток в ресурсе с плитками для сопоставления с одной плиткой в пуле плиток (совместное использование плитки), количество сопоставлений плиток в ресурсе плитки, которые нужно пропустить и оставить без изменений. или количество плиток в пуле плиток для сопоставления со значением NULL. NumRanges указывает количество диапазонов плиток, где общее количество плиток, определенных во всех диапазонах, должно совпадать с общим числом плиток в регионах плиток из ранее описанного ресурса с плитками. Сопоставления определяются путем перебирания плиток в регионах плиток в последовательном порядке ( x затем y, а затем z для областей полей ) при последовательном просмотре набора диапазонов плиток. Разбивка областей плиток не должна совпадать с разбивкой диапазонов плиток, но общее количество плиток с обеих сторон должно быть одинаковым, чтобы для каждой указанной плитки ресурса было задано сопоставление.

    pRangeFlags, pTilePoolStartOffsets и pRangeTileCounts — это массивы размера NumRanges, описывающие диапазоны плиток. Если pRangeFlags имеет значение NULL, все диапазоны являются последовательными плитками в пуле плиток; В противном случае для каждого диапазона i pRangeFlags[i] определяет, как работают сопоставления в этом диапазоне плиток:

    • Если pRangeFlags[i] равно 0, этот диапазон определяет последовательные плитки в пуле плиток с числом плиток pRangeTileCounts[i] и начальным расположением pTilePoolStartOffsets[i]. Если numRanges имеет значение 1, pRangeTileCounts может иметь значение NULL и по умолчанию соответствует общему количеству плиток, заданному всеми областями плитки.
    • Если pRangeFlags[i] D3D11_TILE_RANGE_REUSE_SINGLE_TILE, pTilePoolStartOffsets[i] определяет одну плитку в пуле плиток для сопоставления, а pRangeTileCounts[i] указывает, сколько плиток из областей плиток необходимо сопоставить с расположением пула плиток. Если numRanges имеет значение 1, pRangeTileCounts может иметь значение NULL и по умолчанию соответствует общему количеству плиток, заданному всеми областями плитки.
    • Если pRangeFlags[i] D3D11_TILE_RANGE_NULL, pRangeTileCounts[i] указывает, сколько плиток из областей плиток сопоставляется со значением NULL. Если numRanges имеет значение 1, pRangeTileCounts может иметь значение NULL и по умолчанию соответствует общему количеству плиток, заданному всеми областями плитки. PTilePoolStartOffsets[i] игнорируется для сопоставлений NULL.
    • Если pRangeFlags[i] D3D11_TILE_RANGE_SKIP, pRangeTileCounts[i] указывает, сколько плиток из областей плиток следует пропустить и оставить существующие сопоставления без изменений. Это может быть полезно, если область плитки удобно ограничивает область сопоставлений плиток для обновления, за исключением некоторых исключений, которые необходимо оставить так же, как и те, с которыми они были сопоставлены ранее. PTilePoolStartOffsets[i] игнорируется для сопоставлений SKIP.
  • Параметр Flags для общих параметров.D3D11_TILE_MAPPING_NO_OVERWRITE означает, что вызывающий объект обещает, что ранее отправленные на устройство команды, которые могут по-прежнему выполняться, не ссылаются ни на одну из обновляемых областей плитки. Это позволяет устройству избежать необходимости сбрасывать ранее отправленные работы, чтобы выполнить обновление сопоставления плиток. Если приложение нарушает это обещание путем обновления сопоставлений плиток для расположений в мозаичного ресурсах, на которые по-прежнему ссылаются невыполненные команды, результаты поведения отрисовки неопределенные, что включает в себя возможность значительного замедления некоторых архитектур. Это похоже на концепцию "нет перезаписи", которая существует в других местах API Direct3D, за исключением самой структуры данных сопоставления плиток, которая в аппаратном обеспечении является таблицей страниц. Отсутствие этого флага требует, чтобы обновления сопоставления плиток, указанные в этом вызове UpdateTileMappings , должны быть завершены перед выполнением любой последующей команды Direct3D.
Если сопоставления плиток изменились в ресурсе с плиткой, который приложение будет отображать с помощью RenderTargetView или DepthStencilView, приложение должно очистить с помощью API-интерфейсов фиксированной функции Clear плитки, которые были изменены в отрисовываемой области (сопоставленной или нет). Если приложение не выполняет очистку в таких ситуациях, оно получает неопределенные значения при чтении из мозаичного ресурса.
Примечание В Direct3D 11.2 оборудование теперь может поддерживать ClearView в форматах только глубины. Дополнительные сведения см. в разделе D3D11_FEATURE_DATA_D3D11_OPTIONS1.
 
Если приложению необходимо сохранить существующее содержимое памяти областей в ресурсе с плитками, где сопоставления были изменены, приложение может сначала сохранить содержимое, в котором были изменены сопоставления плиток, скопировав его на временную поверхность, например с помощью CopyTiles, выдав требуемую очистку, а затем скопировав содержимое обратно.

Предположим, что плитка сопоставлена с несколькими мозаичными ресурсами одновременно, а ее содержимое обрабатывается любым способом (отрисовка, копирование и т. д.) с помощью одного из ресурсов с плиткой. Затем, если та же плитка должна быть отрисована через любой другой ресурс с плиткой, сначала ее необходимо очистить, как описано выше.

Дополнительные сведения о мозаичного ресурсах см. в разделе Плитки ресурсов.

Ниже приведены некоторые примеры распространенных вариантов UpdateTileMappings :

Примеры

Очистка сопоставлений всей поверхности со значением NULL:

// - No-overwrite is specified, assuming it is known nothing else the GPU could be doing is referencing the previous mappings
// - NULL for pTiledResourceRegionStatCoordinates and pTiledResourceRegionSizes defaults to the entire resource
// - NULL for pTilePoolStartOffsets 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 tiled resource region (which is
//   the entire surface in this case)
//
// UINT RangeFlags = D3D11_TILE_MAPPING_NULL;
// pDeviceContext2->UpdateTileMappings(pTiledResource,1,NULL,NULL,NULL,1,&RangeFlags,NULL,NULL,D3D11_TILE_MAPPING_NO_OVERWRITE);

Сопоставление области плиток с одной плиткой:

// - This maps a 2x3 tile region at tile offset (1,1) in a Tiled Resource to tile [12] in a Tile Pool
// 
// D3D11_TILED_RESOURCE_COORDINATE TRC;
// TRC.X = 1;
// TRC.Y = 1;
// TRC.Z = 0;
// TRC.Subresource = 0;
//
// D3D11_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 = D3D11_TILE_MAPPING_REUSE_SINGLE_TILE;
// UINT StartOffset = 12;
// pDeviceContext2->UpdateTileMappings(pTiledResource,1,&TRC,&TRS,pTilePool,1,&RangeFlags,&StartOffset,
//                                     NULL,D3D11_TILE_MAPPING_NO_OVERWRITE);

Определение сопоставлений для набора несвязанных отдельных плиток:

// - This can also be accomplished in multiple calls.  Using a single call to define multiple
//   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 pTiledResourceRegionSizes defaults to each region in the Tiled Resource
//   being a single tile.  So all that is needed are the coordinates of each one.
// - Passing NULL for Range Flags defaults to no flags (since none are needed in this case)
// - Passing NULL for pRangeTileCounts defaults to each range in the Tile Pool being size 1.
//   So all that is needed are the start offsets for each tile in the Tile Pool
//
// D3D11_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;
//
// pDeviceContext2->UpdateTileMappings(pTiledResource,NumSingleTiles,&TRC,NULL,pTilePool,NumSingleTiles,NULL,StartOffsets,
//                                     NULL,D3D11_TILE_MAPPING_NO_OVERWRITE);

Сложный пример. Определение сопоставлений для регионов с некоторыми пропусками и некоторыми сопоставлениями 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 Tiled 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 Tile Pool starting at
//   tile pool 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 (tile pool location [17]) and the remaining 
//   4 tiles to each map to to unique tile pool locations, [2], [9], [4] and [17]:
//
// D3D11_TILED_RESOURCE_COORDINATE TRC[3];
// D3D11_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 TilePoolStartOffsets[8];
// UINT RangeTileCounts[8];
//
// RangeFlags[0] = 0;
// TilePoolStartOffsets[0] = 9;
// RangeTileCounts[0] = 3;
//
// RangeFlags[1] = D3D11_TILE_MAPPING_SKIP;
// TilePoolStartOffsets[1] = 0; // offset is ignored for skip mappings
// RangeTileCounts[1] = 8;
//
// RangeFlags[2] = D3D11_TILE_MAPPING_NULL;
// TilePoolStartOffsets[2] = 0; // offset is ignored for NULL mappings
// RangeTileCounts[2] = 2;
//
// RangeFlags[3] = D3D11_TILE_MAPPING_REUSE_SINGLE_TILE;
// TilePoolStartOffsets[3] = 17; 
// RangeTileCounts[3] = 5;
//
// RangeFlags[4] = 0;
// TilePoolStartOffsets[4] = 2; 
// RangeTileCounts[4] = 1;
//
// RangeFlags[5] = 0;
// TilePoolStartOffsets[5] = 9; 
// RangeTileCounts[5] = 1;
//
// RangeFlags[6] = 0;
// TilePoolStartOffsets[6] = 4; 
// RangeTileCounts[6] = 1;
//
// RangeFlags[7] = 0;
// TilePoolStartOffsets[7] = 17; 
// RangeTileCounts[7] = 1;
//
// pDeviceContext2->UpdateTileMappings(pTiledResource,NumRegions,TRC,TRS,pTilePool,NumRanges,RangeFlags,
//                                     TilePoolStartOffsets,RangeTileCounts,D3D11_TILE_MAPPING_NO_OVERWRITE);

CopyTileMappings

// CopyTileMappings helps with tasks such as shifting mappings around within/across Tiled Resources, e.g. scrolling tiles.
// The source and dest region can overlap - the result of the copy in this case is as if the source was saved to a temp and then
// from there written to the dest, though the implementation may be able to do better. 
//
// The Flags field allows D3D11_TILE_MAPPING_NO_OVERWRITE to be specified, means the caller promises that previously 
//      submitted commands to the device that may still be executing do not reference any of the tile region being updated.
//      This allows the device to avoid having to flush previously submitted work in order to do the tile mapping 
//      update.  If the application violates this promise by updating tile mappings for locations in Tiled Resouces 
//      still being referenced by outstanding commands, undefined rendering behavior results, including the potential 
//      for significant slowdowns on some architectures.  This is like the "no overwrite" concept that exists 
//      elsewhere in the API, except applied to Tile Mapping data structure itself (which in hardware is a page table).
//      The absence of this flag requires that tile mapping updates specified by this call must be completed before any
//      subsequent D3D command can proceed.
//
// Return Values:
//
// Returns S_OK or E_INVALIDARG or E_OUTOFMEMORY.  The latter can happen if the call results in the driver having to 
// allocate space for new page table mappings but running out of memory.
//
// If out of memory occurs when this is called in a commandlist and the commandlist is being executed, the device will be removed.
// Applications can avoid this situation by only doing update calls that change existing mappings from Tiled Resources 
// within commandlists (so drivers will not have to allocate page table memory, only change the mapping).
//
// Various other basic conditions such as invalid flags or passing in non Tiled Resources result in call being dropped 
// with E_INVALIDARG.
// 
// Validation remarks:
//
// The dest and the source regions must each entirely fit in their resource or behavior is undefined 
// (debug layer will emit an error).

Требования

Требование Значение
Минимальная версия клиента Windows 8.1 [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2012 R2 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header d3d11_2.h
Библиотека D3D11.lib

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

ID3D11DeviceContext2