Partager via


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

Modifie les tas de descripteurs actuellement liés qui sont associés à une liste de commandes.

Syntaxe

void SetDescriptorHeaps(
  UINT                 NumDescriptorHeaps,
  ID3D12DescriptorHeap * const *ppDescriptorHeaps
);

Paramètres

NumDescriptorHeaps

Type : [in] UINT

Nombre de tas de descripteurs à lier.

ppDescriptorHeaps

Type : [in] ID3D12DescriptorHeap*

Pointeur vers un tableau d’objets ID3D12DescriptorHeap pour les tas à définir dans la liste des commandes.

Vous ne pouvez lier que des tas de descripteurs de type D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV et D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER.

Un seul tas de descripteur de chaque type peut être défini à la fois, ce qui signifie qu’un maximum de 2 tas (un échantillonneur, un CBV/SRV/UAV) peuvent être définis à la fois.

Valeur de retour

None

Remarques

SetDescriptorHeaps peut être appelé sur un bundle, mais les tas de descripteurs de bundle doivent correspondre au tas de descripteur de liste de commandes appelant. Pour plus d’informations sur les restrictions d’offre groupée, consultez Création et enregistrement de commandes Listes et bundles.

Tous les tas définis précédemment sont non définis par l’appel. Au plus un tas de chaque type visible par nuanceur peut être défini dans l’appel.

La modification des tas de descripteurs peut entraîner un vidage de pipeline sur un certain matériel. Pour cette raison, il est recommandé d’utiliser un seul tas visible par nuanceur de chaque type et de le définir une fois par image, plutôt que de modifier régulièrement les tas de descripteurs liés. Au lieu de cela, utilisez ID3D12Device ::CopyDescriptors et ID3D12Device ::CopyDescriptorsSimple pour copier les descripteurs requis des tas opaques du nuanceur vers le tas visible par le nuanceur unique, comme requis lors du rendu.

Exemples

L’exemple D3D12Bundles utilise ID3D12GraphicsCommandList ::SetDescriptorHeaps 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

Tas de descripteurs

ID3D12GraphicsCommandList