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 |