Bagikan melalui


METODE ID3D12GraphicsCommandList::ResourceBarrier (d3d12.h)

Memberi tahu driver bahwa ia perlu menyinkronkan beberapa akses ke sumber daya.

Sintaks

void ResourceBarrier(
  [in] UINT                         NumBarriers,
  [in] const D3D12_RESOURCE_BARRIER *pBarriers
);

Parameter

[in] NumBarriers

Jenis: UINT

Jumlah deskripsi pembatas yang dikirimkan.

[in] pBarriers

Jenis: const D3D12_RESOURCE_BARRIER*

Penunjuk ke array deskripsi pembatas.

Nilai kembali

Tidak ada

Keterangan

Catatan

Sumber daya yang akan digunakan untuk status D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE harus dibuat dalam status tersebut, dan kemudian tidak pernah bertransisi darinya. Atau mungkin sumber daya yang dibuat tidak dalam status tersebut akan ditransisikan ke dalamnya. Untuk informasi selengkapnya, lihat Pembatasan memori struktur akselerasi dalam spesifikasi fungsional DirectX raytracing (DXR) di GitHub.

Ada tiga jenis deskripsi pembatas:

  • D3D12_RESOURCE_TRANSITION_BARRIER - Hambatan transisi menunjukkan bahwa serangkaian transisi sub sumber daya antara penggunaan yang berbeda. Pemanggil harus menentukan sebelum dan sesudah penggunaan subsumber daya. Bendera D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES digunakan untuk mentransisikan semua subsumber daya dalam sumber daya secara bersamaan.
  • D3D12_RESOURCE_ALIASING_BARRIER - Hambatan alias menunjukkan transisi antara penggunaan dua sumber daya berbeda yang memiliki pemetaan ke dalam tumpukan yang sama. Aplikasi dapat menentukan sumber daya sebelum dan sesudah. Perhatikan bahwa satu atau kedua sumber daya dapat berupa NULL (menunjukkan bahwa sumber daya ubin apa pun dapat menyebabkan alias).
  • D3D12_RESOURCE_UAV_BARRIER - Hambatan tampilan akses yang tidak diurutkan menunjukkan semua akses UAV (baca atau tulis) ke sumber daya tertentu harus diselesaikan sebelum akses UAV di masa mendatang (baca atau tulis) dapat dimulai. Sumber daya yang ditentukan mungkin NULL. Tidak perlu memasukkan hambatan UAV antara dua panggilan gambar atau pengiriman yang hanya membaca UAV. Selain itu, tidak perlu memasukkan penghambat UAV antara dua panggilan gambar atau pengiriman yang menulis ke UAV yang sama jika aplikasi tahu bahwa aman untuk menjalankan akses UAV dalam urutan apa pun. Sumber daya dapat berupa NULL (menunjukkan bahwa akses UAV apa pun dapat memerlukan hambatan).
Ketika ID3D12GraphicsCommandList::ResourceBarrier dilewatkan array deskripsi penghalang sumber daya, API berperilaku seolah-olah disebut N kali (1 untuk setiap elemen array), dalam urutan yang ditentukan. Transisi harus di-batch bersama-sama ke dalam satu panggilan API jika memungkinkan, sebagai pengoptimalan performa.

Untuk deskripsi status penggunaan, subsumber daya dapat berada di, lihat enumerasi D3D12_RESOURCE_STATES dan bagian Menggunakan Penghalang Sumber Daya untuk Menyinkronkan Status Sumber Daya di Direct3D 12 .

Semua subsumber daya dalam sumber daya harus dalam status RENDER_TARGET, atau status DEPTH_WRITE, untuk merender target/sumber daya stensil kedalaman masing-masing, ketika ID3D12GraphicsCommandList::D iscardResource dipanggil.

Ketika buffer belakang disajikan, buffer harus dalam status D3D12_RESOURCE_STATE_PRESENT. Jika IDXGISwapChain1::P resent1 dipanggil pada sumber daya yang tidak dalam status SEKARANG, peringatan lapisan debug akan dipancarkan.

Bit penggunaan sumber daya dikelompokkan ke dalam dua kategori, baca-saja dan baca/tulis.

Bit penggunaan berikut bersifat baca-saja:

  • D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER
  • D3D12_RESOURCE_STATE_INDEX_BUFFER
  • D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE
  • D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE
  • D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT
  • D3D12_RESOURCE_STATE_COPY_SOURCE
  • D3D12_RESOURCE_STATE_DEPTH_READ
Bit penggunaan berikut adalah baca/tulis:
  • D3D12_RESOURCE_STATE_UNORDERED_ACCESS
  • D3D12_RESOURCE_STATE_DEPTH_WRITE
Bit penggunaan berikut hanya untuk penulisan:
  • D3D12_RESOURCE_STATE_COPY_DEST
  • D3D12_RESOURCE_STATE_RENDER_TARGET
  • D3D12_RESOURCE_STATE_STREAM_OUT
Paling banyak satu bit tulis dapat diatur. Jika ada bit tulis yang diatur, maka tidak ada bit baca yang dapat diatur. Jika tidak ada bit tulis yang diatur, maka sejumlah bit baca dapat diatur.

Pada waktu tertentu, subresource berada dalam satu status (ditentukan oleh serangkaian bendera). Aplikasi harus memastikan bahwa status dicocokkan saat melakukan urutan panggilan ResourceBarrier . Dengan kata lain, status sebelum dan sesudah dalam panggilan berturut-turut ke ResourceBarrier harus setuju.

Untuk melakukan transisi semua subsumber daya dalam sumber daya, aplikasi dapat mengatur indeks sub sumber daya ke D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES, yang menyiratkan bahwa semua subsumber daya diubah.

Untuk meningkatkan performa, aplikasi harus menggunakan penghalang terpisah (lihat Sinkronisasi multi-mesin). Aplikasi Anda juga harus mengumpulkan beberapa transisi ke dalam satu panggilan jika memungkinkan.

Validasi runtime

Runtime akan memvalidasi bahwa nilai jenis pembatas adalah anggota enumerasi D3D12_RESOURCE_BARRIER_TYPE yang valid.

Selain itu, runtime memeriksa hal berikut:

  • Penunjuk sumber daya non-NULL.
  • Indeks sub sumber daya valid
  • Status sebelum dan sesudah didukung oleh bendera sumber daya D3D12_RESOURCE_BINDING_TIER dan D3D12_RESOURCE_FLAGS .
  • Bit yang dipesan dalam masker status tidak diatur.
  • Status sebelum dan sesudah berbeda.
  • Kumpulan bit dalam status sebelum dan sesudah valid.
  • Jika bit D3D12_RESOURCE_STATE_RESOLVE_SOURCE diatur, jumlah sampel sumber daya harus lebih besar dari 1.
  • Jika bit D3D12_RESOURCE_STATE_RESOLVE_DEST diatur, jumlah sampel sumber daya harus sama dengan 1.
Untuk penghalang alias, runtime akan memvalidasi bahwa, jika salah satu penunjuk sumber daya bukan NULL, itu mengacu pada sumber daya ubin.

Untuk penghalang UAV, runtime akan memvalidasi bahwa, jika sumber daya bukan NULL, sumber daya memiliki bendera ikat D3D12_RESOURCE_STATE_UNORDERED_ACCESS yang ditetapkan.

Kegagalan validasi menyebabkan ID3D12GraphicsCommandList::Close untuk mengembalikan E_INVALIDARG.

Lapisan debug

Lapisan debug biasanya mengeluarkan kesalahan di mana validasi runtime gagal:
  • Jika transisi sub sumber daya dalam daftar perintah tidak konsisten dengan transisi sebelumnya dalam daftar perintah yang sama.
  • Jika sumber daya digunakan tanpa terlebih dahulu memanggil ResourceBarrier untuk menempatkan sumber daya ke status yang benar.
  • Jika sumber daya terikat secara ilegal untuk dibaca dan ditulis secara bersamaan.
  • Jika status sebelumnya diteruskan ke ResourceBarrier tidak cocok dengan status setelah panggilan sebelumnya ke ResourceBarrier, termasuk kasus alias.
Sedangkan lapisan debug mencoba memvalidasi aturan runtime, lapisan debug beroperasi secara konservatif sehingga kesalahan lapisan debug adalah kesalahan nyata, dan dalam beberapa kasus kesalahan nyata mungkin tidak menghasilkan kesalahan lapisan debug.

Lapisan debug akan mengeluarkan peringatan dalam kasus berikut:

  • Semua kasus di mana lapisan debug D3D12 akan mengeluarkan peringatan untuk ID3D12GraphicsCommandList::ResourceBarrier.
  • Jika buffer kedalaman digunakan dalam mode non-baca-saja saat sumber daya memiliki set bit penggunaan D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE.

Contoh

Sampel D3D12HelloTriangle menggunakan ID3D12GraphicsCommandList::ResourceBarrier sebagai berikut:

D3D12_VIEWPORT m_viewport;
D3D12_RECT m_scissorRect;
ComPtr<IDXGISwapChain3> m_swapChain;
ComPtr<ID3D12Device> m_device;
ComPtr<ID3D12Resource> m_renderTargets[FrameCount];
ComPtr<ID3D12CommandAllocator> m_commandAllocator;
ComPtr<ID3D12CommandQueue> m_commandQueue;
ComPtr<ID3D12RootSignature> m_rootSignature;
ComPtr<ID3D12DescriptorHeap> m_rtvHeap;
ComPtr<ID3D12PipelineState> m_pipelineState;
ComPtr<ID3D12GraphicsCommandList> m_commandList;
UINT m_rtvDescriptorSize;

void D3D12HelloTriangle::PopulateCommandList()
{
    // 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_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_commandAllocator.Get(), m_pipelineState.Get()));

    // Set necessary state.
    m_commandList->SetGraphicsRootSignature(m_rootSignature.Get());
    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);
    m_commandList->OMSetRenderTargets(1, &rtvHandle, FALSE, nullptr);

    // Record commands.
    const float clearColor[] = { 0.0f, 0.2f, 0.4f, 1.0f };
    m_commandList->ClearRenderTargetView(rtvHandle, clearColor, 0, nullptr);
    m_commandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
    m_commandList->IASetVertexBuffers(0, 1, &m_vertexBufferView);
    m_commandList->DrawInstanced(3, 1, 0, 0);

    // 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 dalam Referensi D3D12.

Persyaratan

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

Lihat juga

ID3D12GraphicsCommandList

Menggunakan Penghalang Sumber Daya untuk Menyinkronkan Status Sumber Daya di Direct3D 12