Compartir a través de


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 inicial de la canalización para 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 general de registrar 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, es posible que tenga más sentido intentar establecer el parámetro de estado inicial, ya que es probable que las agrupaciones sean más pequeñas 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 siguientes valores:

  • E_FAIL si la lista de comandos no estaba en estado "cerrado" cuando se realizó la llamada Restablecer 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.
Consulte códigos de retorno de Direct3D 12 para ver otros valores devueltos posibles.

Observaciones

Mediante Restablecer, puede volver a usar estructuras de seguimiento de listas de comandos sin asignaciones. A diferencia de ID3D12CommandAllocator::Reset, puede llamar a Reset mientras se ejecuta la lista de comandos.

Puede usar restablecer para listas de comandos directos y agrupaciones.

El asignador de comandos pasado a Reset no se puede asociar a ninguna otra lista de comandos actualmente de grabación. El tipo de asignador, lista directa de comandos o agrupación, debe coincidir con el tipo de lista de comandos que se está creando.

Si una agrupación no especifica un montón de recursos, no puede realizar cambios en qué tablas de descriptores están enlazadas. En cualquier caso, los conjuntos 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 que llama a "parent".

validación en tiempo de ejecución de

Antes de que una aplicación llame a Restablecer, la lista de comandos debe estar en estado "cerrado". Restablecer producirá un error si la lista de comandos no está en estado "cerrado".
Nota Si se produce un error en una llamada a ID3D12GraphicsCommandList::Close, nunca se puede restablecer la lista de comandos. Al llamar a Reset se devolverá el mismo error que id3D12GraphicsCommandList::Close devuelto.
 
Después de restablecer se realiza correctamente, la lista de comandos se deja en estado de "grabación". restablecer producirá un error si provocaría que se superara el límite máximo de lista de comandos de grabación simultánea, que se especifica en la creación del dispositivo.

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.

restablecer produce un error en los conjuntos a los que hace referencia una lista de comandos aún no enviada.

capa de depuración de

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 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 Valor
de la plataforma de destino de Windows
encabezado de d3d12.h
biblioteca de D3d12.lib
DLL de D3d12.dll

Consulte también

ID3D12CommandAllocator::Reset

id3D12Device::CreateCommandList

ID3D12GraphicsCommandList