Saltar al contenido principal
Notifica al controlador que necesita sincronizar varios accesos a los recursos.

Sintaxis

Parámetros

NumBarriers [in]
Tipo: UINT
El número de descripciones de barrera enviadas. pBarriers [in]
Tipo: const D3D12_RESOURCE_BARRIER *
Puntero a una matriz de descripciones de barrera.

Valor devuelto

Tipo: void Ninguno.

Comentarios

Un recurso que se vaya a usar para el estado D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE debe crearse en ese estado y no debe salir nunca de él mediante una transición. Tampoco se puede hacer la transición a ese estado de un recurso que no se creó en él. Para obtener más información, consulte Acceleration structure memory restrictions en la especificación funcional de DirectX Raytracing (DXR) en GitHub.
Hay tres tipos de descripciones de barrera:
  • D3D12_RESOURCE_TRANSITION_BARRIER: las barreras de transición indican que un conjunto de subrecursos realiza la transición entre distintos usos. El autor de la llamada debe especificar los usos anterior y posterior de los subrecursos. La marca D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES se usa para realizar la transición de todos los subrecursos de un recurso al mismo tiempo.
  • D3D12_RESOURCE_ALIASING_BARRIER: las barreras de alias indican una transición entre los usos de dos recursos diferentes que tienen asignaciones en el mismo montón. La aplicación puede especificar tanto el recurso anterior como el posterior. Tenga en cuenta que uno o ambos recursos pueden ser NULL (lo que indica que cualquier recurso en mosaico podría provocar alias).
  • D3D12_RESOURCE_UAV_BARRIER: las barreras de vista de acceso desordenado indican que todos los accesos de UAV (de lectura o escritura) a un recurso concreto deben completarse antes de que pueda comenzar cualquier acceso de UAV futuro (de lectura o escritura). El recurso especificado puede ser NULL. No es necesario insertar una barrera de UAV entre dos llamadas de dibujo o distribución que solo lean un UAV. Además, no es necesario insertar una barrera de UAV entre dos llamadas de dibujo o distribución que escriban en el mismo UAV si la aplicación sabe que es seguro ejecutar los accesos de UAV en cualquier orden. El recurso puede ser NULL (lo que indica que cualquier acceso de UAV podría requerir la barrera).
Cuando a ID3D12GraphicsCommandList::ResourceBarrier se le pasa una matriz de descripciones de barrera de recursos, la API se comporta como si se hubiera llamado N veces (1 por cada elemento de la matriz), en el orden especificado. Cuando sea posible, las transiciones deben agruparse en una sola llamada a la API, como optimización del rendimiento. Para obtener descripciones de los estados de uso en los que puede estar un subrecurso, consulte la enumeración D3D12_RESOURCE_STATES y la sección Uso de barreras de recursos para sincronizar los estados de los recursos en Direct3D 12. Todos los subrecursos de un recurso deben estar en el estado RENDER_TARGET, o en el estado DEPTH_WRITE, para los destinos de representación y los recursos de galería de símbolos de profundidad respectivamente, cuando se llama a ID3D12GraphicsCommandList::DiscardResource. Cuando se presenta un búfer de reserva, debe estar en el estado D3D12_RESOURCE_STATE_PRESENT. Si se llama a IDXGISwapChain1::Present1 en un recurso que no está en el estado PRESENT, se emitirá una advertencia de la capa de depuración. Los bits de uso de recursos se agrupan en dos categorías: de solo lectura y de lectura y escritura. Los siguientes bits de uso son de solo lectura:
  • D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER
  • D3D12_RESOURCE_STATE_INDEX_BUFFER
  • D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE
  • D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE
  • D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT
  • D3D12_RESOURCE_STATE_COPY_SOURCE
  • D3D12_RESOURCE_STATE_DEPTH_READ
Los siguientes bits de uso son de lectura y escritura:
  • D3D12_RESOURCE_STATE_UNORDERED_ACCESS
  • D3D12_RESOURCE_STATE_DEPTH_WRITE
Los siguientes bits de uso son de solo escritura:
  • D3D12_RESOURCE_STATE_COPY_DEST
  • D3D12_RESOURCE_STATE_RENDER_TARGET
  • D3D12_RESOURCE_STATE_STREAM_OUT
Como máximo se puede establecer un bit de escritura. Si hay algún bit de escritura establecido, no se puede establecer ningún bit de lectura. Si no hay ningún bit de escritura establecido, se puede establecer cualquier número de bits de lectura. En un momento dado, un subrecurso está exactamente en un estado (determinado por un conjunto de marcas). La aplicación debe garantizar que los estados coincidan al realizar una secuencia de llamadas a ResourceBarrier. En otras palabras, los estados anterior y posterior de las llamadas consecutivas a ResourceBarrier deben concordar. Para realizar la transición de todos los subrecursos dentro de un recurso, la aplicación puede establecer el índice de subrecurso en D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES, lo que implica que se cambian todos los subrecursos. Para mejorar el rendimiento, las aplicaciones deben usar barreras divididas (consulte Sincronización de varios motores). La aplicación también debe agrupar varias transiciones en una sola llamada siempre que sea posible.

Validación en tiempo de ejecución

El runtime validará que los valores del tipo de barrera sean miembros válidos de la enumeración D3D12_RESOURCE_BARRIER_TYPE.
Además, el runtime comprueba lo siguiente:
  • El puntero al recurso no es NULL.
  • El índice de subrecurso es válido
  • Los estados anterior y posterior son compatibles con las marcas D3D12_RESOURCE_BINDING_TIER y D3D12_RESOURCE_FLAGS del recurso.
  • Los bits reservados de las máscaras de estado no están establecidos.
  • Los estados anterior y posterior son diferentes.
  • El conjunto de bits de los estados anterior y posterior es válido.
  • Si el bit D3D12_RESOURCE_STATE_RESOLVE_SOURCE está establecido, el recuento de muestras del recurso debe ser mayor que 1.
  • Si el bit D3D12_RESOURCE_STATE_RESOLVE_DEST está establecido, el recuento de muestras del recurso debe ser igual a 1.
Para las barreras de alias, el runtime validará que, si alguno de los punteros a recursos no es NULL, haga referencia a un recurso en mosaico. Para las barreras de UAV, el runtime validará que, si el recurso no es NULL, el recurso tenga establecida la marca de enlace D3D12_RESOURCE_STATE_UNORDERED_ACCESS. Un error de validación hace que ID3D12GraphicsCommandList::Close devuelva E_INVALIDARG.

Capa de depuración

La capa de depuración normalmente emite errores cuando la validación en tiempo de ejecución produce un error:
  • Si una transición de subrecurso en una lista de comandos es incoherente con las transiciones anteriores de la misma lista de comandos.
  • Si se usa un recurso sin llamar primero a ResourceBarrier para poner el recurso en el estado correcto.
  • Si un recurso se enlaza de forma ilegal para lectura y escritura al mismo tiempo.
  • Si los estados anteriores pasados a ResourceBarrier no coinciden con los estados posteriores de las llamadas anteriores a ResourceBarrier, incluido el caso de los alias.
Aunque la capa de depuración intenta validar las reglas del runtime, funciona de manera conservadora, de modo que los errores de la capa de depuración son errores reales y, en algunos casos, los errores reales pueden no producir errores de la capa de depuración. La capa de depuración emitirá advertencias en los siguientes casos:
  • Todos los casos en los que la capa de depuración de D3D12 emitiría advertencias para ID3D12GraphicsCommandList::ResourceBarrier.
  • Si se usa un búfer de profundidad en un modo que no es de solo lectura mientras el recurso tiene establecido el bit de uso D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE.

Ejemplos

El ejemplo D3D12HelloTriangle usa ID3D12GraphicsCommandList::ResourceBarrier de la siguiente manera:
Consulte Código de ejemplo en la referencia de D3D12.

Requisitos

Encabezado: d3d12_xs.h o d3d12_x.h
Biblioteca: d3d12_xs.lib o d3d12_x.lib
Plataformas compatibles: consolas XBOX Series y familia XBOX One

Consulte también

ID3D12GraphicsCommandList Uso de barreras de recursos para sincronizar los estados de los recursos en Direct3D 12
Última modificación el 19 de octubre de 2026