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

Cambia los montones de descriptores enlazados actualmente asociados a una lista de comandos.

Sintaxis

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

Parámetros

NumDescriptorHeaps

Tipo: [in] UINT

Número de montones de descriptores que se van a enlazar.

ppDescriptorHeaps

Tipo: [in] ID3D12DescriptorHeap*

Puntero a una matriz de objetos ID3D12DescriptorHeap para los montones que se van a establecer en la lista de comandos.

Solo puede enlazar montones de descriptores de tipo D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV y D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER.

Solo se puede establecer un montón de descriptores de cada tipo a la vez, lo que significa que un máximo de 2 montones (un sampler, un CBV/SRV/UAV) se puede establecer al mismo tiempo.

Valor devuelto

None

Observaciones

Se puede llamar a SetDescriptorHeaps en una agrupación, pero los montones del descriptor de agrupación deben coincidir con el montón del descriptor de lista de comandos que realiza la llamada. Para obtener más información sobre las restricciones de agrupación, consulte Creación y grabación de comandos Listas y agrupaciones.

Todas las montones establecidas anteriormente no se establecen mediante la llamada. Como máximo, se puede establecer un montón de cada tipo visible para sombreador en la llamada.

El cambio de montones de descriptores puede generar un vaciado de canalización en algún hardware. Por este motivo, se recomienda usar un único montón visible para sombreador de cada tipo y establecerlo una vez por fotograma, en lugar de cambiar periódicamente los montones de descriptores enlazados. En su lugar, use ID3D12Device::CopyDescriptors y ID3D12Device::CopyDescriptorsSimple para copiar los descriptores necesarios de montones sombreadores opacos en el montón visible del sombreador único según sea necesario durante la representación.

Ejemplos

El ejemplo D3D12Bundles usa ID3D12GraphicsCommandList::SetDescriptorHeaps de la siguiente manera:

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

Vea Código de ejemplo en la referencia de D3D12.

Requisitos

Requisito Value
Plataforma de destino Windows
Encabezado d3d12.h
Library D3d12.lib
Archivo DLL D3d12.dll

Consulte también

Montones de descriptores

ID3D12GraphicsCommandList