METODE ID3D12GraphicsCommandList::SetDescriptorHeaps (d3d12.h)

Mengubah tumpukan deskriptor yang saat ini terikat yang terkait dengan daftar perintah.

Sintaks

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

Parameter

NumDescriptorHeaps

Ketik: [in] UINT

Jumlah tumpukan deskriptor yang akan diikat.

ppDescriptorHeaps

Jenis: [in] ID3D12DescriptorHeap*

Penunjuk ke array objek ID3D12DescriptorHeap untuk heap yang akan diatur pada daftar perintah.

Anda hanya dapat mengikat tumpukan deskriptor jenis D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV dan D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER.

Hanya satu timbunan deskriptor dari setiap jenis yang dapat diatur pada satu waktu, yang berarti maksimum 2 heap (satu sampler, satu CBV/SRV/UAV) dapat diatur pada satu waktu.

Nilai kembali

Tidak ada

Keterangan

SetDescriptorHeaps dapat dipanggil pada bundel, tetapi tumpukan deskriptor bundel harus cocok dengan tumpukan deskriptor daftar perintah panggilan. Untuk informasi selengkapnya tentang pembatasan bundel, lihat Membuat dan Merekam Perintah Lists dan Bundel.

Semua tumpukan yang ditetapkan sebelumnya tidak diatur oleh panggilan. Paling banyak satu tumpukan dari setiap jenis yang terlihat shader dapat diatur dalam panggilan.

Mengubah tumpukan deskriptor dapat menimbulkan flush alur pada beberapa perangkat keras. Karena itu, disarankan untuk menggunakan satu tumpukan yang terlihat shader dari setiap jenis, dan mengaturnya sekali per bingkai, daripada secara teratur mengubah tumpukan deskriptor terikat. Sebagai gantinya, gunakan ID3D12Device::CopyDescriptors dan ID3D12Device::CopyDescriptorsSimple untuk menyalin deskriptor yang diperlukan dari tumpukan shader-buram ke tumpukan yang terlihat bayangan tunggal seperti yang diperlukan selama penyajian.

Contoh

Sampel D3D12Bundles menggunakan ID3D12GraphicsCommandList::SetDescriptorHeaps sebagai berikut:

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

Lihat Contoh Kode di Referensi D3D12.

Persyaratan

Persyaratan Nilai
Target Platform Windows
Header d3d12.h
Pustaka D3d12.lib
DLL D3d12.dll

Lihat juga

Tumpuk Deskriptor

ID3D12GraphicsCommandList