Share via


Metodo ID3D12GraphicsCommandList::ResourceBarrier (d3d12.h)

Notifica al driver che deve sincronizzare più accessi alle risorse.

Sintassi

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

Parametri

[in] NumBarriers

Tipo: UINT

Numero di descrizioni delle barriere inviate.

[in] pBarriers

Tipo: const D3D12_RESOURCE_BARRIER*

Puntatore a una matrice di descrizioni delle barriere.

Valore restituito

nessuno

Osservazioni

Nota

Una risorsa da usare per lo stato D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE deve essere creata in tale stato e quindi non è mai stata eseguita la transizione. Né una risorsa creata non in tale stato può essere inserita in tale stato. Per altre informazioni, vedi Limitazioni della memoria della struttura di accelerazione nella specifica funzionale DXR (DirectX Raytracing) su GitHub.

Esistono tre tipi di descrizioni delle barriere:

  • D3D12_RESOURCE_TRANSITION_BARRIER - Barriere di transizione indicano che un set di sottorisorse passa tra utilizzi diversi. Il chiamante deve specificare l'oggetto prima e dopo l'utilizzo delle sottorisorse. Il flag D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES viene usato per eseguire la transizione di tutte le sottorisorse in una risorsa contemporaneamente.
  • D3D12_RESOURCE_ALIASING_BARRIER - Le barriere di aliasing indicano una transizione tra gli utilizzi di due risorse diverse con mapping nello stesso heap. L'applicazione può specificare sia prima che dopo. Si noti che una o entrambe le risorse possono essere NULL (a indicare che qualsiasi risorsa affiancata potrebbe causare l'aliasing).
  • D3D12_RESOURCE_UAV_BARRIER : le barriere di visualizzazione di accesso non ordinate indicano che tutti gli accessi UAV (lettura o scrittura) a una determinata risorsa devono essere completati prima che qualsiasi accesso UAV futuro (lettura o scrittura) possa iniziare. La risorsa specificata può essere NULL. Non è necessario inserire una barriera UAV tra due chiamate di disegno o dispatch che leggono solo un UAV. Inoltre, non è necessario inserire una barriera UAV tra due chiamate di disegno o dispatch che scrivono nello stesso UAV se l'applicazione sa che è sicuro eseguire gli accessi UAV in qualsiasi ordine. La risorsa può essere NULL (a indicare che qualsiasi accesso UAV potrebbe richiedere la barriera).
Quando ID3D12GraphicsCommandList::ResourceBarrier viene passata una matrice di descrizioni delle barriere di risorse, l'API si comporta come se fosse chiamata N volte (1 per ogni elemento di matrice), nell'ordine specificato. Le transizioni devono essere raggruppate in un'unica chiamata API, quando possibile, come ottimizzazione delle prestazioni.

Per le descrizioni degli stati di utilizzo in cui è possibile inserire una sottorisorsa, vedere la sezione D3D12_RESOURCE_STATES e la sezione Using Resource Barriers to Synchronize Resource States in Direct3D 12 (Uso delle barriere di risorse per sincronizzare gli stati delle risorse in Direct3D 12 ).

Tutte le sottorisorse in una risorsa devono trovarsi nello stato RENDER_TARGET o DEPTH_WRITE, rispettivamente per le risorse target/depth-stencil di rendering, quando viene chiamato ID3D12GraphicsCommandList::D iscardResource .

Quando viene presentato un buffer nascosto, deve trovarsi nello stato D3D12_RESOURCE_STATE_PRESENT. Se IDXGISwapChain1::P resent1 viene chiamato su una risorsa che non è nello stato PRESENT, verrà generato un avviso del livello di debug.

I bit di utilizzo delle risorse sono raggruppati in due categorie, di sola lettura e di lettura/scrittura.

I bit di utilizzo seguenti sono di sola lettura:

  • 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
I bit di utilizzo seguenti sono di lettura/scrittura:
  • D3D12_RESOURCE_STATE_UNORDERED_ACCESS
  • D3D12_RESOURCE_STATE_DEPTH_WRITE
I bit di utilizzo seguenti sono di sola scrittura:
  • D3D12_RESOURCE_STATE_COPY_DEST
  • D3D12_RESOURCE_STATE_RENDER_TARGET
  • D3D12_RESOURCE_STATE_STREAM_OUT
Al massimo un bit di scrittura può essere impostato. Se è impostato un bit di scrittura, non è possibile impostare alcun bit di lettura. Se non è impostato alcun bit di scrittura, è possibile impostare un numero qualsiasi di bit di lettura.

In qualsiasi momento, una sottorisorsa si trova esattamente in uno stato (determinato da un set di flag). L'applicazione deve garantire che gli stati vengano confrontati durante l'esecuzione di una sequenza di chiamate ResourceBarrier . In altre parole, gli stati prima e dopo nelle chiamate consecutive a ResourceBarrier devono accettare .

Per eseguire la transizione di tutte le sottorisorse all'interno di una risorsa, l'applicazione può impostare l'indice di sottorisorsa su D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES, il che implica che tutte le sottorisorse vengono modificate.

Per migliorare le prestazioni, le applicazioni devono usare barriere suddivise (vedere Sincronizzazione multi-motore). L'applicazione deve anche raggruppare più transizioni in una singola chiamata, quando possibile.

Convalida del runtime

Il runtime convaliderà che i valori del tipo di barriera siano membri validi dell'enumerazione D3D12_RESOURCE_BARRIER_TYPE .

Inoltre, il runtime verifica quanto segue:

  • Il puntatore alla risorsa non è NULL.
  • L'indice della sottorisorsa è valido
  • Gli stati prima e dopo sono supportati dai flag D3D12_RESOURCE_BINDING_TIER e D3D12_RESOURCE_FLAGS della risorsa.
  • I bit riservati nelle maschere di stato non sono impostati.
  • Gli stati prima e dopo sono diversi.
  • Il set di bit negli stati prima e dopo sono validi.
  • Se il bit D3D12_RESOURCE_STATE_RESOLVE_SOURCE è impostato, il numero di campioni di risorse deve essere maggiore di 1.
  • Se il bit D3D12_RESOURCE_STATE_RESOLVE_DEST è impostato, il numero di campioni di risorse deve essere uguale a 1.
Per le barriere di aliasing, il runtime convaliderà che, se uno dei due puntatori alla risorsa è diverso da NULL, fa riferimento a una risorsa affiancata.

Per le barriere UAV il runtime convaliderà che, se la risorsa non è NULL, la risorsa ha il flag di associazione D3D12_RESOURCE_STATE_UNORDERED_ACCESS impostato.

L'errore di convalida fa sì che ID3D12GraphicsCommandList::Close restituisca E_INVALIDARG.

Livello di debug

Il livello di debug genera in genere errori in cui la convalida del runtime ha esito negativo:
  • Se una transizione di sottorisorsa in un elenco di comandi non è coerente con le transizioni precedenti nello stesso elenco di comandi.
  • Se una risorsa viene usata senza prima chiamare ResourceBarrier per inserire la risorsa nello stato corretto.
  • Se una risorsa è associata illegalmente per la lettura e la scrittura contemporaneamente.
  • Se gli stati precedenti passati a ResourceBarrier non corrispondono agli stati successivi delle chiamate precedenti a ResourceBarrier, incluso il caso di aliasing.
Mentre il livello di debug tenta di convalidare le regole di runtime, funziona in modo conservativo in modo che gli errori del livello di debug siano errori reali e in alcuni casi errori reali potrebbero non generare errori del livello di debug.

Il livello di debug genera avvisi nei casi seguenti:

  • Tutti i casi in cui il livello di debug D3D12 genera avvisi per ID3D12GraphicsCommandList::ResourceBarrier.
  • Se un buffer di profondità viene usato in modalità non di sola lettura mentre la risorsa ha il bit di utilizzo D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE impostato.

Esempio

L'esempio D3D12HelloTriangle usa ID3D12GraphicsCommandList::ResourceBarrier come segue:

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

Vedere Codice di esempio nel riferimento D3D12.

Requisiti

   
Piattaforma di destinazione Windows
Intestazione d3d12.h
Libreria D3d12.lib
DLL D3d12.dll

Vedi anche

ID3D12GraphicsCommandList

Uso delle barriere delle risorse per sincronizzare gli stati delle risorse in Direct3D 12