Método ID3D12GraphicsCommandList::ResourceBarrier (d3d12.h)
Notifica al controlador que necesita sincronizar varios accesos a los recursos.
Sintaxis
void ResourceBarrier(
[in] UINT NumBarriers,
[in] const D3D12_RESOURCE_BARRIER *pBarriers
);
Parámetros
[in] NumBarriers
Tipo: UINT
Número de descripciones de barrera enviadas.
[in] pBarriers
Tipo: const D3D12_RESOURCE_BARRIER*
Puntero a una matriz de descripciones de barreras.
Valor devuelto
Ninguno
Observaciones
Nota
Se debe crear un recurso para el estado de D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE en ese estado y, a continuación, nunca se ha pasado de él. Tampoco es posible que un recurso que se haya creado no en ese estado se realice la transición a él. Para obtener más información, consulte Restricciones de memoria de la estructura de aceleración en la especificación funcional de Raytracing (DXR) de DirectX en GitHub.
Hay tres tipos de descripciones de barreras:
- D3D12_RESOURCE_TRANSITION_BARRIER : las barreras de transición indican que un conjunto de subrecursos realiza una transición entre distintos usos. El autor de la llamada debe especificar los usos antes y después 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 después. 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 UAV (lectura o escritura) a un recurso determinado deben completarse antes de que puedan comenzar los futuros accesos UAV (lectura o escritura). El recurso especificado puede ser NULL. No es necesario insertar una barrera UAV entre dos llamadas de dibujo o envío que solo leen un UAV. Además, no es necesario insertar una barrera UAV entre dos llamadas de dibujo o envío que escriben en el mismo UAV si la aplicación sabe que es seguro ejecutar los accesos UAV en cualquier orden. El recurso puede ser NULL (lo que indica que cualquier acceso UAV podría requerir la barrera).
Para obtener descripciones de los estados de uso en los que puede encontrarse un subrecurso, consulte la enumeración D3D12_RESOURCE_STATES y la sección Using Resource Barriers to Synchronize Resource States in Direct3D 12 (Usar barreras de recursos para sincronizar estados de recursos en Direct3D 12 ).
Todos los subrecursos de un recurso deben estar en estado de RENDER_TARGET o DEPTH_WRITE estado, para los recursos de galería de símbolos de profundidad o destinos de representación, respectivamente, cuando se llama a ID3D12GraphicsCommandList::D iscardResource .
Cuando se presenta un búfer de reserva, debe estar en el estado D3D12_RESOURCE_STATE_PRESENT. Si se llama a IDXGISwapChain1::P resent1 en un recurso que no está en el estado PRESENT, se emitirá una advertencia de 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
- D3D12_RESOURCE_STATE_UNORDERED_ACCESS
- D3D12_RESOURCE_STATE_DEPTH_WRITE
- D3D12_RESOURCE_STATE_COPY_DEST
- D3D12_RESOURCE_STATE_RENDER_TARGET
- D3D12_RESOURCE_STATE_STREAM_OUT
En un momento dado, un subrecurso se encuentra exactamente en un estado (determinado por un conjunto de marcas). La aplicación debe asegurarse de que los estados coinciden al realizar una secuencia de llamadas a ResourceBarrier . En otras palabras, los estados antes y después de las llamadas consecutivas a ResourceBarrier deben aceptar.
Para realizar la transición de todos los subrecursos dentro de un recurso, la aplicación puede establecer el índice de subrecursos 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 procesar por lotes varias transiciones en una sola llamada siempre que sea posible.
Validación en tiempo de ejecución
El tiempo de ejecución validará que los valores de tipo de barrera son miembros válidos de la enumeración D3D12_RESOURCE_BARRIER_TYPE .Además, el tiempo de ejecución comprueba lo siguiente:
- El puntero de recurso no es NULL.
- El índice de subrecursos es válido
- Los estados antes y después son compatibles con las marcas D3D12_RESOURCE_BINDING_TIER y D3D12_RESOURCE_FLAGS del recurso.
- No se establecen bits reservados en las máscaras de estado.
- Los estados antes y después son diferentes.
- El conjunto de bits de los estados antes y después son válidos.
- Si se establece el bit de D3D12_RESOURCE_STATE_RESOLVE_SOURCE, el recuento de muestras de recursos debe ser mayor que 1.
- Si se establece el bit de D3D12_RESOURCE_STATE_RESOLVE_DEST, el recuento de muestras de recursos debe ser igual a 1.
En el caso de las barreras UAV, el tiempo de ejecución validará que, si el recurso no es NULL, el recurso tiene establecida la marca de enlace D3D12_RESOURCE_STATE_UNORDERED_ACCESS.
El error de validación provoca que ID3D12GraphicsCommandList::Close devuelva E_INVALIDARG.
Capa de depuración
Normalmente, la capa de depuración emite errores en los que se produce un error en la validación en tiempo de ejecución:- Si una transición de subrecurso en una lista de comandos es incoherente con las transiciones anteriores en la misma lista de comandos.
- Si se usa un recurso sin llamar primero a ResourceBarrier para colocar el recurso en el estado correcto.
- Si un recurso está enlazado ilegalmente para lectura y escritura al mismo tiempo.
- Si los estados anteriores pasados al ResourceBarrier no coinciden con los estados posteriores de las llamadas anteriores a ResourceBarrier, incluido el caso de alias.
La capa de depuración emitirá advertencias en los casos siguientes:
- Todos los casos en los que la capa de depuración D3D12 emite 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:
D3D12_VIEWPORT m_viewport;
D3D12_RECT m_scissorRect;
ComPtr<IDXGISwapChain3> m_swapChain;
ComPtr<ID3D12Device> m_device;
ComPtr<ID3D12Resource> m_renderTargets[FrameCount];
ComPtr<ID3D12CommandAllocator> m_commandAllocator;
ComPtr<ID3D12CommandQueue> m_commandQueue;
ComPtr<ID3D12RootSignature> m_rootSignature;
ComPtr<ID3D12DescriptorHeap> m_rtvHeap;
ComPtr<ID3D12PipelineState> m_pipelineState;
ComPtr<ID3D12GraphicsCommandList> m_commandList;
UINT m_rtvDescriptorSize;
void D3D12HelloTriangle::PopulateCommandList()
{
// Command list allocators can only be reset when the associated
// command lists have finished execution on the GPU; apps should use
// fences to determine GPU execution progress.
ThrowIfFailed(m_commandAllocator->Reset());
// However, when ExecuteCommandList() is called on a particular command
// list, that command list can then be reset at any time and must be before
// re-recording.
ThrowIfFailed(m_commandList->Reset(m_commandAllocator.Get(), m_pipelineState.Get()));
// Set necessary state.
m_commandList->SetGraphicsRootSignature(m_rootSignature.Get());
m_commandList->RSSetViewports(1, &m_viewport);
m_commandList->RSSetScissorRects(1, &m_scissorRect);
// Indicate that the back buffer will be used as a render target.
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET));
CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart(), m_frameIndex, m_rtvDescriptorSize);
m_commandList->OMSetRenderTargets(1, &rtvHandle, FALSE, nullptr);
// Record commands.
const float clearColor[] = { 0.0f, 0.2f, 0.4f, 1.0f };
m_commandList->ClearRenderTargetView(rtvHandle, clearColor, 0, nullptr);
m_commandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
m_commandList->IASetVertexBuffers(0, 1, &m_vertexBufferView);
m_commandList->DrawInstanced(3, 1, 0, 0);
// Indicate that the back buffer will now be used to present.
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT));
ThrowIfFailed(m_commandList->Close());
}
Vea Código de ejemplo en la referencia de D3D12.
Requisitos
Plataforma de destino | Windows |
Encabezado | d3d12.h |
Library | D3d12.lib |
Archivo DLL | D3d12.dll |
Consulte también
Uso de barreras de recursos para sincronizar los estados de los recursos en Direct3D 12