Condividi tramite


Metodo ID3D12CommandQueue::ExecuteCommandLists (d3d12.h)

Invia una matrice di elenchi di comandi per l'esecuzione.

Sintassi

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

Parametri

[in] NumCommandLists

Numero di elenchi di comandi da eseguire.

[in] ppCommandLists

Matrice di elenchi di comandi ID3D12CommandList da eseguire.

Valore restituito

nessuno

Osservazioni

La chiamata a ExecuteCommandLists due volte in successione (dallo stesso thread o thread diversi) garantisce che il primo carico di lavoro (A) venga completato prima del secondo carico di lavoro (B). La chiamata a ExecuteCommandLists con due elenchi di comandi consente al driver di unire i due elenchi di comandi, in modo che il secondo elenco di comandi (D) possa iniziare a eseguire il lavoro prima che tutto il lavoro dal primo (C) sia terminato. In particolare, l'applicazione può inserire un segnale di recinzione o attendere tra A e B e il driver non ha visibilità in questo modo, quindi il driver deve assicurarsi che tutto in A sia completato prima dell'operazione di recinzione. Non esiste alcuna opportunità in una singola chiamata all'API, quindi il driver è in grado di ottimizzare tale scenario.

Il driver è libero di applicare patch agli elenchi di comandi inviati. È responsabilità dell'applicazione chiamante assicurarsi che l'unità di elaborazione grafica (GPU) non stia attualmente leggendo gli elenchi di comandi inviati da un'esecuzione precedente.

Le applicazioni sono incoraggiate a raggruppare le esecuzioni dell'elenco di comandi per ridurre i costi fissi associati ai comandi inviati alla GPU.

Convalida runtime

I bundle non possono essere inviati direttamente a una coda di comandi. Se un bundle viene passato a questo metodo, il runtime rilascia la chiamata. Il runtime rilascia anche la chiamata se la funzione Close non è stata chiamata in uno o più elenchi di comandi.

Il runtime rileverà se i allocatori di comando associati agli elenchi di comandi sono stati reimpostati dopo la chiamata a Close . Il runtime eliminerà la chiamata e rimuoverà il dispositivo in questa situazione.

Il runtime eliminerà la chiamata e rimuoverà il dispositivo se la recinzione della coda di comandi indica che un'esecuzione precedente di uno degli elenchi di comandi non è ancora stata completata.

Il runtime convalida gli stati "prima" e "after" delle barriere di transizione delle risorse all'interno di ExecuteCommandLists. Se lo stato "prima" di una transizione non corrisponde allo stato "dopo" di una transizione precedente, il runtime eliminerà la chiamata e rimuoverà il dispositivo.

Il runtime convalida gli stati "prima" e "dopo" delle query usate dagli elenchi di comandi. Se viene rilevato un errore, il runtime eliminerà la chiamata e rimuoverà il dispositivo.

Livello di debug

Il livello di debug genera errori per tutti i casi in cui il runtime rilascia la chiamata.

Il livello di debug genera un errore se rileva che qualsiasi risorsa a cui fa riferimento gli elenchi di comandi, incluse le query, è stata eliminata.

Esempio

Esegue il rendering di una scena.

// 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();
}

Fare riferimento al codice di esempio nel riferimento D3D12.

Requisiti

   
Piattaforma di destinazione Windows
Intestazione d3d12.h

Vedi anche

ID3D12CommandQueue