Partager via


ID3D12GraphicsCommandList ::ExecuteBundle, méthode (d3d12.h)

Exécute un bundle.

Syntaxe

void ExecuteBundle(
  [in] ID3D12GraphicsCommandList *pCommandList
);

Paramètres

[in] pCommandList

Type : ID3D12GraphicsCommandList*

Spécifie l’ID3D12GraphicsCommandList qui détermine le bundle à exécuter.

Valeur de retour

None

Remarques

Les bundles héritent de tout l’état de la liste de commandes parente sur laquelle ExecuteBundle est appelé, à l’exception de l’objet d’état du pipeline et de la topologie primitive. Tout l’état défini dans un bundle affecte l’état de la liste de commandes parente. Notez que ExecuteBundle n’est pas une opération prédicée.

Validation du runtime

Le runtime valide que le « appelé » est un bundle et que l'« appelant » est une liste de commandes directes. Le runtime valide également que le bundle a été fermé. Si le contrat est violé, le runtime supprime silencieusement l’appel. L’échec de validation entraîne la fermeture de E_INVALIDARG de retour.

Couche Debug

La couche de débogage émet un avertissement dans les mêmes cas où le runtime échoue. La couche de débogage émet un avertissement si un prédicat est défini lors de l’appel de ExecuteCommandList . En outre, la couche de débogage génère une erreur si elle détecte que toute référence de ressource par la liste de commandes a été détruite.

La couche de débogage vérifie également que l’allocateur de commande associé au bundle n’a pas été réinitialisé, car Close a été appelé dans la liste de commandes. Cette validation se produit au moment de ExecuteBundle et lorsque la liste de commandes parente est exécutée sur une file d’attente de commandes.

Exemples

L’exemple D3D12Bundles utilise ID3D12GraphicsCommandList ::ExecuteBundle comme suit :

void D3D12Bundles::PopulateCommandList(FrameResource* pFrameResource)
{
    // 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_pCurrentFrameResource->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_pCurrentFrameResource->m_commandAllocator.Get(), m_pipelineState1.Get()));

    // Set necessary state.
    m_commandList->SetGraphicsRootSignature(m_rootSignature.Get());

    ID3D12DescriptorHeap* ppHeaps[] = { m_cbvSrvHeap.Get(), m_samplerHeap.Get() };
    m_commandList->SetDescriptorHeaps(_countof(ppHeaps), ppHeaps);

    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);
    CD3DX12_CPU_DESCRIPTOR_HANDLE dsvHandle(m_dsvHeap->GetCPUDescriptorHandleForHeapStart());
    m_commandList->OMSetRenderTargets(1, &rtvHandle, FALSE, &dsvHandle);

    // Record commands.
    const float clearColor[] = { 0.0f, 0.2f, 0.4f, 1.0f };
    m_commandList->ClearRenderTargetView(rtvHandle, clearColor, 0, nullptr);
    m_commandList->ClearDepthStencilView(m_dsvHeap->GetCPUDescriptorHandleForHeapStart(), D3D12_CLEAR_FLAG_DEPTH, 1.0f, 0, 0, nullptr);

    if (UseBundles)
    {
        // Execute the prebuilt bundle.
        m_commandList->ExecuteBundle(pFrameResource->m_bundle.Get());
    }
    else
    {
        // Populate a new command list.
        pFrameResource->PopulateCommandList(m_commandList.Get(), m_pipelineState1.Get(), m_pipelineState2.Get(), m_currentFrameResourceIndex, m_numIndices, &m_indexBufferView,
            &m_vertexBufferView, m_cbvSrvHeap.Get(), m_cbvSrvDescriptorSize, m_samplerHeap.Get(), m_rootSignature.Get());
    }

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

Consultez l’exemple de code dans la référence D3D12.

Configuration requise

Condition requise Valeur
Plateforme cible Windows
En-tête d3d12.h
Bibliothèque D3d12.lib
DLL D3d12.dll

Voir aussi

ID3D12GraphicsCommandList