Compartir a través de


API de recursos en mosaico

Las API descritas en esta sección funcionan con recursos en mosaico y grupo de iconos.

Asignación de iconos de un grupo de iconos a un recurso

Las API ID3D11DeviceContext2::UpdateTileMappings y ID3D11DeviceContext2::CopyTileMappings manipulan y consultan las asignaciones de iconos. Las llamadas de actualización solo afectan a los iconos identificados en la llamada y otros se dejan como se definió anteriormente.

Cualquier icono determinado de un grupo de iconos se puede asignar a varias ubicaciones de un recurso e incluso varios recursos. Esta asignación incluye iconos en un recurso que tienen un diseño elegido por la implementación (empaquetado mipmap) donde se empaquetan varios mapas mip juntos en un único icono. La captura es que si los datos se escriben en el icono a través de una asignación, pero leen a través de una asignación configurada de forma diferente, los resultados no están definidos. Sin embargo, el uso cuidadoso de esta flexibilidad puede ser útil para una aplicación, como compartir un icono entre recursos que no se usarán simultáneamente, donde el contenido del icono siempre se inicializa a través de la misma asignación de recursos que se leerá posteriormente. Del mismo modo, un icono asignado para contener los mapas mip empaquetados de varios recursos diferentes con las mismas dimensiones de superficie funcionará bien; los datos aparecerán iguales en ambas asignaciones.

Los cambios en las asignaciones de iconos de un recurso se pueden realizar en cualquier momento en un contexto inmediato o diferido.

Consulta de mosaicos y soporte técnico de recursos

Para consultar el mosaico de recursos, use ID3D11Device2::GetResourceTiling.

Para obtener compatibilidad con otros mosaicos de recursos, use ID3D11Device2::CheckMultisampleQualityLevels1.

Copiar datos en mosaico

Cualquier método de Direct3D para mover datos alrededor del trabajo con recursos en mosaico igual que si no están en mosaico, excepto que las escrituras en áreas no asignadas se quitan y las lecturas de áreas no asignadas producen 0. Si una operación de copia implica escribir en la misma ubicación de memoria varias veces porque varias ubicaciones del recurso de destino se asignan a la misma memoria de mosaico, las escrituras resultantes en mosaicos multiasignados son no deterministas y no repetibles. Es decir, los accesos se producen en cualquier orden en que se produzca el hardware para ejecutar la copia.

Direct3D 11.2 presenta métodos para estas formas adicionales de copiar:

  • Copiar entre iconos de un recurso en mosaico (en granularidad de mosaico de 64 KB) y (hacia y desde) un búfer en memoria de unidad de procesamiento gráfico (o recurso de almacenamiento provisional): ID3D11DeviceContext2::CopyTiles
  • Copia de la memoria proporcionada por la aplicación en iconos en un recurso en mosaico: ID3D11DeviceContext2::UpdateTiles

Estos métodos sonwizzle/deswizzle según sea necesario y permiten una marca de D3D11_TILE_COPY_NO_OVERWRITE cuando el autor de la llamada promete que no se hace referencia a la memoria de destino por el trabajo de GPU que está en curso.

Los iconos implicados en la copia no pueden incluir iconos que contengan mapas mip empaquetados o que tengan resultados que no estén definidos. Para transferir datos hacia y desde mapas mip a los que el hardware empaqueta en un icono, debe usar las API estándar (no específicas del icono) Copy/Update o ID3D11DeviceContext::GenerateMips para toda la cadena mip.

Nota sobre GenerateMips: El uso de ID3D11DeviceContext::GenerateMips en un recurso con iconos asignados parcialmente generará resultados que simplemente siguen las reglas para leer y escribir NULL aplicados al algoritmo que el hardware y el controlador de visualización usan para GenerateMips. Por lo tanto, no es especialmente útil que una aplicación se moleste en hacer esto a menos que de alguna manera las áreas con asignaciones NULL (y su efecto en otros mips durante la fase de generación) no tendrán ninguna consecuencia en las partes de la superficie que la aplicación le importa.

Copiar datos de mosaico desde una superficie de almacenamiento provisional o desde la memoria de la aplicación sería la manera de cargar iconos que pueden haberse transmitido fuera del disco, por ejemplo. Variación cuando el streaming fuera del disco carga algún tipo de datos comprimidos en la memoria de GPU y, a continuación, descodificación en la GPU. El destino de descodificación podría ser un recurso de búfer en la memoria de GPU, desde el que CopyTiles copia en el recurso en mosaico real. Este paso de copia permite que la GPU se deswizzle cuando no se conozca el patrón swizzle. No es necesario girar si el propio recurso en mosaico es un recurso de búfer (por ejemplo, en lugar de una textura).

El diseño de memoria de los iconos en el lado del recurso de búfer no en mosaico de la copia es simplemente lineal en memoria dentro de iconos de 64 KB, que el controlador de hardware y visualización se swizzle/deswizzle por icono según corresponda al transferir a o desde un recurso en mosaico. Para las superficies de suavizado multimuestra (MSAA), las muestras de cada píxel se recorren en orden de índice de muestra antes de pasar al siguiente píxel. En el caso de los iconos que se rellenan parcialmente en el lado derecho (para una superficie que tiene un ancho que no es un múltiplo de ancho de mosaico en píxeles), la inclinación o el paso para bajar una fila es el tamaño completo en bytes del número de píxeles que caben en el icono si el icono estaba lleno. Por lo tanto, puede haber un espacio entre cada fila de píxeles en memoria. Para simplificar las especificaciones, los mapas mip más pequeños que un icono no se empaquetan juntos en el diseño lineal. Esto parece ser un desperdicio de espacio de memoria, pero como se mencionó al copiar en mips que los paquetes de hardware juntos no se permiten a través de CopyTiles o UpdateTiles. La aplicación solo puede usar api genéricas UpdateSubresource*() o CopySubresource*() para copiar mips pequeñas individualmente, aunque en el caso de CopySubresource*() que significa que la memoria lineal tiene que ser la misma dimensión que el recurso en mosaico: CopySubresource*() no se puede copiar desde un recurso de búfer en un objeto Texture2D por ejemplo.

Si se define un swizzle estándar de hardware, las marcas se pueden agregar para indicar que los datos del búfer se interpretarán en ese formato (no es necesario realizar ninguna transferencia), aunque los enfoques alternativos para cargar datos también pueden tener sentido en ese caso, como permitir que las aplicaciones accedan directamente a la memoria del grupo de iconos.

Las operaciones de copia se pueden realizar en un contexto inmediato o diferido.

Cambio del tamaño del grupo de iconos

Para cambiar el tamaño de un grupo de iconos, use ID3D11DeviceContext2::ResizeTilePool.

Barrera de recursos en mosaico

Para especificar una restricción de ordenación del acceso a datos entre varios recursos en mosaico, use ID3D11DeviceContext2::TiledResourceBarrier.

Recursos en mosaico