Вложенные ресурсы (графика Direct3D 12)

Описывается, как ресурс делится на подресурсы и как ссылаться на один, несколько или срез вложенных ресурсов.

Примеры вложенных ресурсов

Если ресурс содержит буфер, то он просто содержит один подресурс с индексом 0. Если ресурс содержит текстуру (или массив текстур), то ссылаться на подресурсы будет сложнее.

Некоторые API обращаются ко всему ресурсу (например, к методу ID3D12GraphicsCommandList::CopyResource ), другие — к части ресурса (например, к методу ID3D12Resource::ReadFromSubresource ). Методы, которые обращаются к части ресурса, обычно используют описание представления (например , структуру D3D12_TEX2D_ARRAY_SRV ), чтобы указать подресурсы для доступа. Полный список см. в разделе API subresource .

Индексирование подресурса

Для индексирования определенного подресурса сначала индексируются уровни MIP по мере индексации каждой записи массива.

Индексирование подресурса

Срез MIP

Срез MIP включает один уровень MIP-карты для каждой текстуры в массиве, как показано на следующем рисунке.

Срезы MIP подресурса

Срез массива

Учитывая массив текстур, каждая текстура с MIP-картами, срез массива включает одну текстуру и все ее уровни MIP, как показано на следующем рисунке.

срезы подресурса массива

Срез плоскости

Как правило, планарные форматы не используются для хранения данных RGBA, но в тех случаях, когда это данные RGB (возможно, 24bpp), одна плоскость может представлять красное изображение, одна — зеленая, а другая — синяя. Одна плоскость, хотя не обязательно один цвет, два или более цветов могут быть объединены в одну плоскость. Чаще планарные данные используются для вложенной выборки YCbCr и Depth-Stencil данных. Depth-Stencil — это единственный формат, который полностью поддерживает MIP-карты, массивы и несколько плоскостей (часто плоскость 0 для глубины и плоскость 1 для набора элементов).

Ниже показано индексирование подресурса для массива из двух Depth-Stencil изображений с тремя уровнями MIP.

индексирование трафаретов глубины

Вложенная выборка YCbCr поддерживает массивы и плоскости, но не поддерживает MIP-карты. Изображения YCbCr имеют две плоскости: одну для яркости (Y), к которой человеческий глаз наиболее чувствителен, и одна для хрома (как Cb, так и Cr, чередующиеся), к которой человеческий глаз менее чувствителен. Этот формат позволяет сжать значения хрома для сжатия изображения, не влияя на яркость, и по этой причине является распространенным форматом сжатия видео, хотя он используется для сжатия неподвижных изображений. На приведенном ниже рисунке показан формат NV12, в соответствии с тем, что хромэнт был сжат до одной четверти разрешения яркости. Это означает, что ширина каждой плоскости идентична, а плоскость хрома в два раза меньше высоты плоскости яркости. Плоскости будут индексироваться как подресурсы таким же образом, как в Depth-Stencil примере выше.

формат nv12

Плоские форматы существовали в Direct3D 11, но отдельные плоскости не могут быть рассмотрены по отдельности, например для операций копирования или сопоставления. Это было изменено в Direct3D 12, чтобы каждая плоскость получила свой собственный идентификатор подресурса. Сравните следующие два метода вычисления идентификатора подресурса.

Direct3D 11

inline UINT D3D11CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT MipLevels )
{
    return MipSlice + (ArraySlice * MipLevels); 
}

Direct3D 12

inline UINT D3D12CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize )
{ 
    return MipSlice + (ArraySlice * MipLevels) + (PlaneSlice * MipLevels * ArraySize); 
}

Большинство оборудования предполагает, что память для плоскости N всегда выделяется сразу после плоскости N-1.

Альтернативой использованию вложенных ресурсов является то, что приложение может выделить совершенно отдельный ресурс для каждой плоскости. В этом случае приложение понимает, что данные являются планарными и использует несколько ресурсов для их представления.

Несколько подресурсов

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

выбор нескольких подресурсов

Представление целевого объекта отрисовки может использовать только один срез подресурса или MIP и не может включать подресурсы из нескольких срезов MIP. То есть каждая текстура в целевом представлении отрисовки должна иметь одинаковый размер. Представление шейдер-ресурсов может выбрать любую прямоугольную область вложенных ресурсов, как показано на рисунке.

API-интерфейсы подресурса

Следующие API-интерфейсы ссылались на вложенные ресурсы и работали с ним:

Перечисления:

Следующие структуры содержат индексы PlaneSlice , большинство из них — индексы MipSlice .

Следующие структуры содержат индексы ArraySlice , большинство из них — индексы MipSlice .

Следующие структуры содержат индексы MipSlice , но ни ArraySlice , ни PlaneSlice .

Следующие структуры также ссылались на подресурсы:

Методы:

  • ID3D12Device::GetCopyableFootprints : получает сведения о ресурсе, чтобы разрешить создание копии.
  • ID3D12Device::GetResourceTiling : получает сведения о том, как ресурс с плиткой разбивается на плитки.
  • ID3D12GraphicsCommandList::ResolveSubresource : копирует подресурссерный ресурс с несколькими выборками в подресурс без нескольких выборок.
  • ID3D12Resource::Map : возвращает указатель на указанные данные в ресурсе и запрещает GPU доступ к подресурсам.
  • ID3D12Resource::ReadFromSubresource : копирует данные из подресурса или прямоугольной области подресурса.
  • ID3D12Resource::Unmap : отменяет сопоставление указанного диапазона памяти и делает недействительным указатель на ресурс. Восстанавливает доступ GPU к подресурсы.
  • ID3D12Resource::WriteToSubresource : копирует данные в подресурс или прямоугольную область подресурса.

Текстуры должны находиться в состоянии D3D12_RESOURCE_STATE_COMMON , чтобы доступ к ЦП через WriteToSubresource и ReadFromSubresource был законным; но буферы не делают. Доступ ЦП к ресурсу обычно осуществляется с помощью карты/Unmap.

Привязка ресурсов