Método ID3D12GraphicsCommandList::Reset (d3d12.h)
Restablece una lista de comandos a su estado inicial como si se acaba de crear una nueva lista de comandos.
Sintaxis
HRESULT Reset(
[in] ID3D12CommandAllocator *pAllocator,
[in, optional] ID3D12PipelineState *pInitialState
);
Parámetros
[in] pAllocator
Tipo: ID3D12CommandAllocator*
Puntero al objeto ID3D12CommandAllocator desde el que el dispositivo crea listas de comandos.
[in, optional] pInitialState
Tipo: ID3D12PipelineState*
Puntero al objeto ID3D12PipelineState que contiene el estado de canalización inicial de la lista de comandos. Esto es opcional y puede ser NULL. Si es NULL, el tiempo de ejecución establece un estado de canalización inicial ficticio para que los controladores no tengan que tratar con el estado indefinido. La sobrecarga para esto es baja, especialmente para una lista de comandos, para la que el costo total de grabación de la lista de comandos probablemente enano el costo de una configuración de estado inicial. Por lo tanto, hay poco costo al no establecer el parámetro de estado de canalización inicial si no es cómodo.
Por otro lado, en el caso de los conjuntos, es posible que tenga más sentido intentar establecer el parámetro de estado inicial, ya que es probable que los conjuntos sean más pequeños en general y se puedan reutilizar con frecuencia.
Valor devuelto
Tipo: HRESULT
Devuelve S_OK si se ejecuta correctamente; de lo contrario, devuelve uno de los valores siguientes:
- E_FAIL si la lista de comandos no estaba en el estado "cerrado" cuando se realizó la llamada de restablecimiento o se habría superado el límite por dispositivo.
- E_OUTOFMEMORY si el sistema operativo se quedó sin memoria.
- E_INVALIDARG si el asignador se está usando actualmente con otra lista de comandos en el estado de "grabación" o si el asignador especificado se creó con el tipo incorrecto.
Comentarios
Con Reset, puede volver a usar estructuras de seguimiento de listas de comandos sin asignaciones. A diferencia de ID3D12CommandAllocator::Reset, puede llamar a Reset mientras se sigue ejecutando la lista de comandos. Un patrón típico es enviar una lista de comandos y, a continuación, restablecerla inmediatamente para reutilizar la memoria asignada para otra lista de comandos.
Puede usar Reset para listas de comandos directos y agrupaciones.
El asignador de comandos que Reset toma como entrada se puede asociar a no más de una lista de comandos de grabación a la vez. El tipo de asignador, lista de comandos directos o agrupación, debe coincidir con el tipo de lista de comandos que se está creando.
Si un lote no especifica un montón de recursos, no puede realizar cambios en las tablas de descriptor que están enlazadas. En cualquier caso, las agrupaciones no pueden cambiar el montón de recursos dentro de la agrupación. Si se especifica un montón para una agrupación, el montón debe coincidir con el montón de comandos "primario" que llama.
Validación en tiempo de ejecución
Antes de que una aplicación llame a Reset, la lista de comandos debe estar en estado "cerrado". Se producirá un error en el restablecimiento si la lista de comandos no está en estado "cerrado".Las aplicaciones deben especificar un asignador de lista de comandos. El tiempo de ejecución garantizará que un asignador nunca esté asociado a más de una lista de comandos de grabación al mismo tiempo.
Se produce un error en el restablecimiento de los conjuntos a los que hace referencia una lista de comandos aún no enviada.
Capa de depuración
La capa de depuración también realizará un seguimiento del progreso de la unidad de procesamiento de gráficos (GPU) y emitirá un error si no puede demostrar que no hay ejecuciones pendientes de la lista de comandos.Ejemplos
El ejemplo D3D12HelloTriangle usa ID3D12GraphicsCommandList::Reset 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 D3D12.
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Windows |
Encabezado | d3d12.h |
Library | D3d12.lib |
Archivo DLL | D3d12.dll |
Consulte también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de