Asignación de textura predeterminada
El uso de la asignación de texturas predeterminada reduce el uso de copia y memoria al compartir datos de imagen entre la GPU y la CPU. Sin embargo, solo se debe usar en situaciones específicas. El diseño estándar de swizzle evita copiar o girar datos en varios diseños.
Información general
La asignación de texturas predeterminadas no debe ser la primera opción para los desarrolladores. Los desarrolladores deben codificar de una manera discreta y fácil de usar (es decir, no tienen acceso de CPU para la mayoría de texturas y cargar con CopySubresourceRegion1). Sin embargo, en determinados casos, la CPU y la GPU pueden interactuar con tanta frecuencia en los mismos datos, que la asignación de texturas predeterminadas resulta útil para ahorrar energía o acelerar un diseño determinado en adaptadores o arquitecturas concretos. Las aplicaciones deben detectar estos casos y optimizar las copias innecesarias.
En D3D11.3, las texturas creadas con D3D11_TEXTURE_LAYOUT_UNDEFINED (un miembro de la enumeración de D3D11_TEXTURE_LAYOUT ) y ningún acceso de CPU es el más eficaz para la representación y el muestreo frecuentes de GPU. Al realizar pruebas de rendimiento, esas texturas deben compararse con D3D11_TEXTURE_LAYOUT_UNDEFINED con acceso de CPU y D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE con acceso de CPU y D3D11_TEXTURE_LAYOUT_ROW_MAJOR para la compatibilidad entre adaptadores.
El uso de D3D11_TEXTURE_LAYOUT_UNDEFINED con acceso de CPU permite los métodos WriteToSubresource, ReadFromSubresource, Map (excluyendo el acceso de la aplicación al puntero) y Unmap; pero puede sacrificar la eficacia del acceso a GPU. El uso de D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE con acceso de CPU habilita WriteToSubresource, ReadFromSubresource, Map (que devuelve un puntero válido a la aplicación) y Unmap. También puede sacrificar la eficacia del acceso a GPU más de D3D11_TEXTURE_LAYOUT_UNDEFINED con acceso de CPU.
En general, las aplicaciones deben crear la mayoría de texturas como accesibles solo para GPU y con D3D11_TEXTURE_LAYOUT_UNDEFINED.
Antes de la característica de texturas predeterminadas de asignación, solo había un diseño estandarizado para los datos multidimensionales: "lineal", también conocido como "fila-principal". Las aplicaciones deben evitar USAGE_STAGING y USAGE_DYNAMIC texturas cuando el valor predeterminado del mapa está disponible. Las texturas USAGE_STAGING y USAGE_DYNAMIC usan el diseño lineal.
D3D11.3 (y D3D12) presentan un diseño de datos multidimensional estándar. Esto se hace para permitir que varias unidades de procesamiento funcionen en los mismos datos sin copiar los datos ni girar los datos entre varios diseños. Un diseño estandarizado permite aumentar la eficacia a través de efectos de red y permite a los algoritmos hacer recortes cortos suponiendo un patrón determinado.
Tenga en cuenta que este swizzle estándar es una característica de hardware y es posible que no sea compatible con todas las GPU.
API de D3D11.3
A diferencia de D3D12, D3D11.3 no admite la asignación de texturas de forma predeterminada, por lo que debe consultar D3D11_FEATURE_DATA_D3D11_OPTIONS2. El swizzle estándar también tendrá que consultarse con una llamada a ID3D11Device::CheckFeatureSupport y comprobar el StandardSwizzle64KBSupported
campo de D3D11_FEATURE_DATA_D3D11_OPTIONS2.
Las siguientes API hacen referencia a la asignación de texturas:
Enumeraciones
- D3D11_TEXTURE_LAYOUT : controla el patrón swizzle de texturas predeterminadas y habilita la compatibilidad con mapas en texturas predeterminadas.
- D3D11_FEATURE : hace referencia a D3D11_FEATURE_DATA_D3D11_OPTIONS2.
- D3D11_TILE_COPY_FLAG : contiene marcas para copiar recursos en mosaico en mosaico hacia y desde búferes lineales.
Estructuras
- D3D11_TEXTURE2D_DESC1 : describe una textura 2D. Anote la estructura del asistente de CD3D11_TEXTURE2D_DESC1.
- D3D11_TEXTURE3D_DESC1 : describe una textura 3D. Anote la estructura del asistente de CD3D11_TEXTURE3D_DESC1.
Métodos
- ID3D11Device3::CreateTexture2D1 : crea una matriz de texturas 2D.
- ID3D11Device3::CreateTexture3D1 : crea una única textura 3D.
- ID3D11Device3::WriteToSubresource : copia los datos en una textura de D3D11_USAGE_DEFAULT que se asignó mediante Map.
- ID3D11Device3::ReadFromSubresource : copia datos de una textura de D3D11_USAGE_DEFAULT que se asignó mediante Map.
- ID3D11DeviceContext::Map : obtiene un puntero a los datos contenidos en un subrecurso y deniega el acceso de GPU a ese subrecurso.
- ID3D11DeviceContext::Unmap : invalida el puntero a un recurso y vuelve a habilitar el acceso de la GPU a ese recurso.
- ID3D11Texture2D1::GetDesc1 : obtiene las propiedades de un recurso de textura 2D.
- ID3D11Texture3D1::GetDesc1 : obtiene las propiedades de un recurso de textura 3D.
Temas relacionados