Compartilhar via


Método ID3D12GraphicsCommandList::SetDescriptorHeaps (d3d12.h)

Altera os heaps de descritor associados no momento associados a uma lista de comandos.

Sintaxe

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

Parâmetros

NumDescriptorHeaps

Tipo: [in] UINT

Número de heaps de descritor a serem associados.

ppDescriptorHeaps

Tipo: [in] ID3D12DescriptorHeap*

Um ponteiro para uma matriz de objetos ID3D12DescriptorHeap para os heaps a serem definidos na lista de comandos.

Você só pode associar heaps de descritor do tipo D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV e D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER.

Somente um heap de descritor de cada tipo pode ser definido de uma só vez, o que significa que um máximo de 2 heaps (um sampler, um CBV/SRV/UAV) pode ser definido ao mesmo tempo.

Retornar valor

Nenhum

Comentários

SetDescriptorHeaps pode ser chamado em um pacote, mas os heaps do descritor de pacote devem corresponder ao heap do descritor de lista de comandos de chamada. Para obter mais informações sobre restrições de pacote, consulte Criando e gravando Listas e pacotes de comando.

Todos os heaps definidos anteriormente não são definidos pela chamada. No máximo um heap de cada tipo visível de sombreador pode ser definido na chamada.

Alterar heaps de descritor pode incorrer em uma liberação de pipeline em algum hardware. Por isso, é recomendável usar um único heap visível de sombreador de cada tipo e defini-lo uma vez por quadro, em vez de alterar regularmente os heaps de descritor associados. Em vez disso, use ID3D12Device::CopyDescriptors e ID3D12Device::CopyDescriptorsSimple para copiar os descritores necessários de heaps opacos de sombreador para o heap visível do sombreador único, conforme necessário durante a renderização.

Exemplos

O exemplo D3D12Bundles usa ID3D12GraphicsCommandList::SetDescriptorHeaps da seguinte maneira:

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

Consulte Código de exemplo na referência D3D12.

Requisitos

Requisito Valor
Plataforma de Destino Windows
Cabeçalho d3d12.h
Biblioteca D3d12.lib
DLL D3d12.dll

Confira também

Heaps de descritores

ID3D12GraphicsCommandList