Share via


Método ID3D12CommandQueue::ExecuteCommandLists (d3d12.h)

Envia uma matriz de listas de comandos para execução.

Sintaxe

void ExecuteCommandLists(
  [in] UINT              NumCommandLists,
  [in] ID3D12CommandList * const *ppCommandLists
);

Parâmetros

[in] NumCommandLists

O número de listas de comandos a serem executadas.

[in] ppCommandLists

A matriz de comandos ID3D12CommandList a ser executada.

Valor retornado

Nenhum

Comentários

Chamar ExecuteCommandLists duas vezes seguidas (do mesmo thread ou threads diferentes) garante que a primeira carga de trabalho (A) seja concluída antes da segunda carga de trabalho (B). Chamar ExecuteCommandLists com duas listas de comandos permite que o driver mescle as duas listas de comandos de modo que a segunda lista de comandos (D) possa começar a executar o trabalho antes que todo o trabalho do primeiro (C) seja concluído. Especificamente, seu aplicativo tem permissão para inserir um sinal de cerca ou aguardar entre A e B, e o driver não tem visibilidade disso, portanto, o driver deve garantir que tudo em A esteja concluído antes da operação de cerca. Não há essa oportunidade em uma única chamada para a API, portanto, o driver é capaz de otimizar esse cenário.

O driver é livre para corrigir as listas de comandos enviadas. É responsabilidade do aplicativo de chamada garantir que a GPU (unidade de processamento gráfico) não esteja lendo nenhuma das listas de comandos enviadas de uma execução anterior.

Os aplicativos são incentivados a agrupar em lote execuções de lista de comandos para reduzir os custos fixos associados aos comandos enviados à GPU.

Validação de runtime

Os pacotes não podem ser enviados diretamente para uma fila de comandos. Se um pacote for passado para esse método, o runtime removerá a chamada. O runtime também removerá a chamada se a função Fechar não tiver sido chamada em uma ou mais listas de comandos.

O runtime detectará se os alocadores de comando associados às listas de comandos foram redefinidos depois que Close foi chamado. O runtime removerá a chamada e removerá o dispositivo nessa situação.

O runtime removerá a chamada e removerá o dispositivo se a cerca da fila de comandos indicar que uma execução anterior de qualquer uma das listas de comandos ainda não foi concluída.

O runtime validará os estados "antes" e "depois" das barreiras de transição de recursos dentro de ExecuteCommandLists. Se o estado "antes" de uma transição não corresponder ao estado "depois" de uma transição anterior, o runtime removerá a chamada e removerá o dispositivo.

O runtime validará os estados "antes" e "depois" das consultas usadas pelas listas de comandos. Se um erro for detectado, o runtime removerá a chamada e removerá o dispositivo.

Camada de depuração

A camada de depuração emite erros para todos os casos em que o runtime removeria a chamada.

A camada de depuração emitirá um erro se detectar que qualquer recurso referenciado pelas listas de comandos, incluindo consultas, foi destruído.

Exemplos

Renderiza uma cena.

// Pipeline objects.
D3D12_VIEWPORT m_viewport;
ComPtr<IDXGISwapChain3> m_swapChain;
ComPtr<ID3D11DeviceContext> m_d3d11DeviceContext;
ComPtr<ID3D11On12Device> m_d3d11On12Device;
ComPtr<ID3D12Device> m_d3d12Device;
ComPtr<IDWriteFactory> m_dWriteFactory;
ComPtr<ID2D1Factory3> m_d2dFactory;
ComPtr<ID2D1Device2> m_d2dDevice;
ComPtr<ID2D1DeviceContext2> m_d2dDeviceContext;
ComPtr<ID3D12Resource> m_renderTargets[FrameCount];
ComPtr<ID3D11Resource> m_wrappedBackBuffers[FrameCount];
ComPtr<ID2D1Bitmap1> m_d2dRenderTargets[FrameCount];
ComPtr<ID3D12CommandAllocator> m_commandAllocators[FrameCount];
ComPtr<ID3D12CommandQueue> m_commandQueue;
ComPtr<ID3D12RootSignature> m_rootSignature;
ComPtr<ID3D12DescriptorHeap> m_rtvHeap;
ComPtr<ID3D12PipelineState> m_pipelineState;
ComPtr<ID3D12GraphicsCommandList> m_commandList;
D3D12_RECT m_scissorRect;
// Render the scene.
void D3D1211on12::OnRender()
{
    // Record all the commands we need to render the scene into the command list.
    PopulateCommandList();

    // Execute the command list.
    ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() };
    m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists);

    RenderUI();

    // Present the frame.
    ThrowIfFailed(m_swapChain->Present(1, 0));

    MoveToNextFrame();
}

Consulte o código de exemplo na referência D3D12.

Requisitos

   
Plataforma de Destino Windows
Cabeçalho d3d12.h

Confira também

ID3D12CommandQueue