Subrecursos (gráficos Direct3D 12)
Describe cómo se divide un recurso en subrecursos y cómo hacer referencia a un único, múltiplo o segmento de subrecursos.
Subrecursos de ejemplo
Si un recurso contiene un búfer, simplemente contiene un subrecurso con un índice de 0. Si el recurso contiene una textura (o matriz de texturas), hacer referencia a los subrecursos es más complejo.
Algunas API acceden a un recurso completo (como el método ID3D12GraphicsCommandList::CopyResource ), otros acceden a una parte de un recurso (por ejemplo, el método ID3D12Resource::ReadFromSubresource ). Los métodos que acceden a una parte de un recurso suelen usar una descripción de vista (como la estructura D3D12_TEX2D_ARRAY_SRV ) para especificar los subrecursos a los que se va a acceder. Consulte la sección Api de subrecursos para obtener una lista completa.
Indexación de subrecursos
Para indexar un subrecurso determinado, los niveles mip se indexan primero a medida que se indexa cada entrada de matriz.
Segmento mip
Un segmento mip incluye un nivel de mapa MIP para cada textura de una matriz, como se muestra en la siguiente imagen.
Segmento de matriz
Dada una matriz de texturas, cada textura con mapas MIP, un segmento de matriz incluye una textura y todos sus niveles mip, como se muestra en la siguiente imagen.
Segmento de plano
Normalmente, los formatos planar no se usan para almacenar datos RGBA, pero en los casos en los que es (quizás 24bpp datos RGB), un plano podría representar la imagen roja, una verde y otra la imagen azul. Sin embargo, un plano no es necesariamente un color, dos o más colores se pueden combinar en un plano. Normalmente, los datos planar se usan para los datos YCbCr y Depth-Stencil de muestras secundarias. Depth-Stencil es el único formato que admite totalmente mapas MIP, matrices y varios planos (a menudo plano 0 para Profundidad y plano 1 para galería de símbolos).
A continuación se muestra la indexación de subrecursos para una matriz de dos imágenes de Depth-Stencil, cada una con tres niveles mip.
YCbCr con muestras secundarias admite matrices y tiene planos, pero no admite mapas MIP. Las imágenes de YCbCr tienen dos planos, uno para la luminancia (Y) al que el ojo humano es más sensible, y uno para la cromoncia (cb, y cr, intercalado) al que el ojo humano es menos sensible. Este formato permite la compresión de los valores de cromo para comprimir una imagen sin afectar a la luminancia, y es un formato de compresión de vídeo común por esa razón, aunque se usa para comprimir imágenes fijas. En la imagen siguiente se muestra el formato NV12, teniendo en cuenta que la crominancia se ha comprimido a un cuarto de la resolución de la luminancia, lo que significa que el ancho de cada plano es idéntico y el plano de crominancia es la mitad del alto del plano de luminancia. Los planos se indexarían como subrecursos de una manera idéntica al ejemplo de Depth-Stencil anterior.
Los formatos planar existían en Direct3D 11, pero los planos individuales no se podían abordar individualmente, por ejemplo, para las operaciones de copia o asignación. Esto se cambió en Direct3D 12 para que cada plano recibiera su propio identificador de subrecurso. Compare los dos métodos siguientes para calcular el identificador del subrecurso.
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);
}
La mayoría del hardware supone que la memoria del plano N siempre se asigna inmediatamente después del plano N-1.
Una alternativa al uso de subrecursos es que una aplicación podría asignar un recurso completamente independiente por plano. En este caso, la aplicación entiende que los datos son planos y usan varios recursos para representarlos.
Varios subrecursos
Una vista de recursos de sombreador puede seleccionar cualquier región rectangular de subrecursos, mediante uno de los segmentos descritos anteriormente y un uso prudente de campos en las estructuras de vista (como D3D12_TEX2D_ARRAY_SRV), como se muestra en la imagen.
Una vista de destino de representación solo puede usar un solo subrecurso o segmento mip y no puede incluir subrecursos de más de un segmento mip. Es decir, todas las texturas de una vista de destino de representación deben tener el mismo tamaño. Una vista sombreador-recurso puede seleccionar cualquier región rectangular de subrecursos, como se muestra en la imagen.
API de subrecurso
Las siguientes API hacen referencia y funcionan con subrecursos:
Enumeraciones:
Las estructuras siguientes contienen índices PlaneSlice , la mayoría contienen índices MipSlice .
- D3D12_TEX2D_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2D_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2D_UAV
- D3D12_TEX2D_ARRAY_UAV
Las estructuras siguientes contienen índices ArraySlice , la mayoría contienen índices MipSlice .
- D3D12_TEX1D_ARRAY_DSV
- D3D12_TEX2D_ARRAY_DSV
- D3D12_TEX2DMS_ARRAY_DSV
- D3D12_TEX1D_ARRAY_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2DMS_ARRAY_RTV
- D3D12_TEX1D_ARRAY_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2DMS_ARRAY_SRV
- D3D12_TEX1D_ARRAY_UAV
- D3D12_TEX2D_ARRAY_UAV
Las estructuras siguientes contienen índices MipSlice , pero no los índices ArraySlice ni PlaneSlice .
Las estructuras siguientes también hacen referencia a subrecursos:
- D3D12_DISCARD_REGION : una estructura usada como preparación para descartar un recurso.
- D3D12_PLACED_SUBRESOURCE_FOOTPRINT : agrega un desplazamiento a un recurso a la superficie básica.
- D3D12_RESOURCE_TRANSITION_BARRIER : describe la transición de subrecursos entre distintos usos (recurso de sombreador, destino de representación, etc.).
- D3D12_SUBRESOURCE_DATA : los datos de subrecursos incluyen los propios datos y el tono de fila y segmento.
- D3D12_SUBRESOURCE_FOOTPRINT : una superficie incluye el formato, el ancho, el alto, la profundidad y el tono de fila del subrecurso.
- D3D12_SUBRESOURCE_INFO : contiene el desplazamiento, el tono de fila y el tono de profundidad del subrecurso.
- D3D12_SUBRESOURCE_TILING : describe un volumen de subrecurso en mosaico (consulte Recursos en mosaico de volumen).
- D3D12_TEXTURE_COPY_LOCATION : describe una parte de una textura con el fin de copiar.
- D3D12_TILED_RESOURCE_COORDINATE : describe las coordenadas de un recurso en mosaico.
Métodos:
- ID3D12Device::GetCopyableFootprints : obtiene información sobre un recurso para permitir que se realice una copia.
- ID3D12Device::GetResourceTiling : obtiene información sobre cómo se divide un recurso en mosaico.
- ID3D12GraphicsCommandList::ResolveSubresource : copia un subrecurso de muestra múltiple en un subrecurso no muestreado.
- ID3D12Resource::Map : devuelve un puntero a los datos especificados en el recurso y deniega el acceso de GPU al subrecurso.
- ID3D12Resource::ReadFromSubresource : copia datos de un subrecurso o una región rectangular de un subrecurso.
- ID3D12Resource::Unmap: desasignación del intervalo de memoria especificado e invalida el puntero al recurso. Restablece el acceso de GPU al subrecurso.
- ID3D12Resource::WriteToSubresource : copia los datos en un subrecurso o en una región rectangular de un subrecurso.
Las texturas deben estar en el estado D3D12_RESOURCE_STATE_COMMON para el acceso a la CPU a través de WriteToSubresource y ReadFromSubresource para que sea legal; pero los búferes no lo hacen. Normalmente, el acceso de CPU a un recurso se realiza mediante asignar/ unmapa.
Temas relacionados