Поделиться через


Метод ID3D12GraphicsCommandList::SetDescriptorHeaps (d3d12.h)

Изменяет текущие привязанные кучи дескриптора, связанные со списком команд.

Синтаксис

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

Параметры

NumDescriptorHeaps

Тип: [in] UINT

Количество привязываемых кучи дескриптора.

ppDescriptorHeaps

Тип: [in] ID3D12DescriptorHeap*

Указатель на массив объектов ID3D12DescriptorHeap для кучи, которые необходимо задать в списке команд.

Можно привязать только кучи дескрипторов типа D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV и D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER.

Одновременно можно задать только одну кучу дескрипторов каждого типа. Это означает, что одновременно можно задать не более 2 кучи (один дискретизатор, один CBV/SRV/UAV).

Возвращаемое значение

None

Remarks

SetDescriptorHeaps можно вызывать в пакете, но кучи дескриптора пакета должны соответствовать куче дескриптора списка вызывающих команд. Дополнительные сведения об ограничениях пакетов см. в статье Создание и запись команд Списки и пакетов.

Все ранее заданные кучи не задаются вызовом. В вызове можно задать не более одной кучи каждого типа, видимого шейдером.

Изменение кучи дескриптора может повлечь за собой очистку конвейера на некотором оборудовании. По этой причине рекомендуется использовать одну видимую для шейдера кучу каждого типа и устанавливать ее один раз для каждого кадра, а не регулярно изменять кучи привязанного дескриптора. Вместо этого используйте ID3D12Device::CopyDescriptors и ID3D12Device::CopyDescriptorsSimple , чтобы скопировать необходимые дескрипторы из непрозрачных кучи шейдера в одну видимую шейдером кучу, как это требуется во время отрисовки.

Примеры

В примере D3D12Bundles используется ID3D12GraphicsCommandList::SetDescriptorHeaps следующим образом:

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

См . пример кода в справочнике по D3D12.

Требования

Требование Значение
Целевая платформа Windows
Header d3d12.h
Библиотека D3d12.lib
DLL D3d12.dll

См. также раздел

Кучи дескрипторов

ID3D12GraphicsCommandList