ID3D12GraphicsCommandList::SetDescriptorHeaps-Methode (d3d12.h)

Ändert die aktuell gebundenen Deskriptorheaps, die einer Befehlsliste zugeordnet sind.

Syntax

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

Parameter

NumDescriptorHeaps

Typ: [in] UINT

Anzahl der zu bindenden Deskriptorheaps.

ppDescriptorHeaps

Typ: [in] ID3D12DescriptorHeap*

Ein Zeiger auf ein Array von ID3D12DescriptorHeap-Objekten für die Heaps, die in der Befehlsliste festgelegt werden sollen.

Sie können nur Deskriptor heaps vom Typ D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV und D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER binden.

Es kann nur ein Deskriptorheap jedes Typs gleichzeitig festgelegt werden, was bedeutet, dass maximal 2 Heaps (ein Sampler, ein CBV/SRV/UAV) gleichzeitig festgelegt werden können.

Rückgabewert

Keine

Bemerkungen

SetDescriptorHeaps kann in einem Bündel aufgerufen werden, aber die Bundle-Deskriptor-Heaps müssen mit dem aufrufenden Befehlslistendeskriptor-Heap übereinstimmen. Weitere Informationen zu Bundleeinschränkungen finden Sie unter Erstellen und Aufzeichnen von Befehlen Listen und Bundles.

Alle zuvor festgelegten Heaps werden durch den Aufruf nicht festgelegt. Im Aufruf kann höchstens ein Heap jedes shader-sichtbaren Typs festgelegt werden.

Ändernde Deskriptorheaps können auf einer Hardware zu einer Pipelineleerung führen. Aus diesem Grund wird empfohlen, einen einzelnen Shader-sichtbaren Heap jedes Typs zu verwenden und ihn einmal pro Frame festzulegen, anstatt regelmäßig die gebundenen Deskriptorheaps zu ändern. Verwenden Sie stattdessen ID3D12Device::CopyDescriptors und ID3D12Device::CopyDescriptorsSimple , um die erforderlichen Deskriptoren aus Shader-undurchsichtigen Heaps nach Bedarf während des Renderings in den einzelnen Shader-Sichtbaren Heap zu kopieren.

Beispiele

Im D3D12Bundles-Beispiel wird ID3D12GraphicsCommandList::SetDescriptorHeaps wie folgt verwendet:

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

Siehe Beispielcode in der D3D12-Referenz.

Anforderungen

Anforderung Wert
Zielplattform Windows
Kopfzeile d3d12.h
Bibliothek D3d12.lib
DLL D3d12.dll

Weitere Informationen

Deskriptorheaps

ID3D12GraphicsCommandList