ID3D12GraphicsCommandList::ResourceBarrier-Methode (d3d12.h)
Benachrichtigt den Treiber, dass er mehrere Zugriffe auf Ressourcen synchronisieren muss.
Syntax
void ResourceBarrier(
[in] UINT NumBarriers,
[in] const D3D12_RESOURCE_BARRIER *pBarriers
);
Parameter
[in] NumBarriers
Typ: UINT
Die Anzahl der eingereichten Barrierenbeschreibungen.
[in] pBarriers
Typ: const D3D12_RESOURCE_BARRIER*
Zeiger auf ein Array von Barrierebeschreibungen.
Rückgabewert
Keine
Bemerkungen
Hinweis
Eine Ressource, die für den D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE Zustand verwendet werden soll, muss in diesem Zustand erstellt werden, und sie muss dann nie aus ihr übergehen. Eine Ressource, die nicht in diesem Zustand erstellt wurde, darf auch nicht in sie übergehen. Weitere Informationen finden Sie unter Speichereinschränkungen der Beschleunigungsstruktur in der DirectX-Raytracing-Funktionsspezifikation (DXR) auf GitHub.
Es gibt drei Arten von Barrierebeschreibungen:
- D3D12_RESOURCE_TRANSITION_BARRIER : Übergangsbarrieren deuten darauf hin, dass eine Reihe von Unterressourcen zwischen verschiedenen Nutzungen wechselt. Der Aufrufer muss die Vor - und Nachnutzungen der Unterressourcen angeben. Das flag D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES wird verwendet, um alle Unterressourcen in einer Ressource gleichzeitig zu übergeben.
- D3D12_RESOURCE_ALIASING_BARRIER : Aliasing-Barrieren deuten auf einen Übergang zwischen der Verwendung von zwei verschiedenen Ressourcen hin, die Zuordnungen in denselben Heap aufweisen. Die Anwendung kann sowohl die Vor- als auch die Nachher-Ressource angeben. Beachten Sie, dass eine oder beide Ressourcen NULL sein können (was angibt, dass jede gekachelte Ressource Aliasing verursachen kann).
- D3D12_RESOURCE_UAV_BARRIER : Barrieren für ungeordnete Zugriffsansichten weisen darauf hin, dass alle UAV-Zugriffe (Lese- oder Schreibzugriffe) auf eine bestimmte Ressource abgeschlossen sein müssen, bevor alle zukünftigen UAV-Zugriffe (Lese- oder Schreibzugriff) beginnen können. Die angegebene Ressource kann NULL sein. Es ist nicht erforderlich, eine UAV-Barriere zwischen zwei Draw- oder Dispatch-Aufrufen einzufügen, die nur ein UAV lesen. Darüber hinaus ist es nicht erforderlich, eine UAV-Barriere zwischen zwei Zeichen- oder Aussendungsaufrufen einzufügen, die in dieselbe UAV schreiben, wenn die Anwendung weiß, dass die UAV-Zugriffe in beliebiger Reihenfolge sicher ausgeführt werden können. Die Ressource kann NULL sein (was angibt, dass für jeden UAV-Zugriff die Barriere erforderlich sein könnte).
Beschreibungen der Nutzungszustände, in die sich eine Unterquelle befinden kann, finden Sie im Abschnitt D3D12_RESOURCE_STATES Enumeration und Verwenden von Ressourcenbarrieren zum Synchronisieren von Ressourcenzuständen in Direct3D 12 .
Alle Unterressourcen in einer Ressource müssen sich für Renderziele bzw. Tiefenschablonenressourcen im zustand RENDER_TARGET oder DEPTH_WRITE befinden, wenn ID3D12GraphicsCommandList::D iscardResource aufgerufen wird.
Wenn ein Backpuffer angezeigt wird, muss er sich im D3D12_RESOURCE_STATE_PRESENT Zustand befinden. Wenn IDXGISwapChain1::P resent1 für eine Ressource aufgerufen wird, die sich nicht im ZUSTAND PRESENT befindet, wird eine Debugebenenwarnung ausgegeben.
Die Ressourcennutzungsbits werden in zwei Kategorien gruppiert: schreibgeschützt und Lese-/Schreibzugriff.
Die folgenden Verwendungsbits sind schreibgeschützt:
- 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
- D3D12_RESOURCE_STATE_UNORDERED_ACCESS
- D3D12_RESOURCE_STATE_DEPTH_WRITE
- D3D12_RESOURCE_STATE_COPY_DEST
- D3D12_RESOURCE_STATE_RENDER_TARGET
- D3D12_RESOURCE_STATE_STREAM_OUT
Eine Unterquelle befindet sich jederzeit in genau einem Zustand (bestimmt durch eine Reihe von Flags). Die Anwendung muss sicherstellen, dass die Zustände übereinstimmen, wenn eine Sequenz von ResourceBarrier-Aufrufen ausgeführt wird. Anders ausgedrückt: Die Vorher- und Nachher-Zustände in aufeinander folgenden Aufrufen von ResourceBarrier müssen zustimmen.
Zum Übergang aller Unterressourcen innerhalb einer Ressource kann die Anwendung den Unterressourcenindex auf D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES festlegen, was bedeutet, dass alle Unterressourcen geändert werden.
Um die Leistung zu verbessern, sollten Anwendungen geteilte Barrieren verwenden (siehe Synchronisierung mit mehreren Engines). Ihre Anwendung sollte außerdem nach Möglichkeit mehrere Übergänge in einen einzelnen Aufruf batchieren.
Laufzeitüberprüfung
Die Runtime überprüft, ob die Werte des Barrierentyps gültige Member der D3D12_RESOURCE_BARRIER_TYPE-Enumeration sind.Darüber hinaus überprüft die Runtime Folgendes:
- Der Ressourcenzeiger ist nicht NULL.
- Der Unterressourcenindex ist gültig.
- Die Vorher- und Nachher-Zustände werden von den D3D12_RESOURCE_BINDING_TIER - und D3D12_RESOURCE_FLAGS-Flags der Ressource unterstützt.
- Reservierte Bits in den Zustandsmasken sind nicht festgelegt.
- Die Vorher- und Nachher-Zustände unterscheiden sich.
- Der Satz von Bits im Vor- und Nachher-Status ist gültig.
- Wenn das D3D12_RESOURCE_STATE_RESOLVE_SOURCE Bit festgelegt ist, muss die Anzahl der Ressourcenbeispiele größer als 1 sein.
- Wenn das D3D12_RESOURCE_STATE_RESOLVE_DEST Bits festgelegt ist, muss die Anzahl der Ressourcenbeispiele gleich 1 sein.
Bei UAV-Barrieren überprüft die Runtime, dass die Ressource das D3D12_RESOURCE_STATE_UNORDERED_ACCESS Bindungsflag festgelegt hat, wenn die Ressource nicht NULL ist.
Überprüfungsfehler bewirkt , dass ID3D12GraphicsCommandList::Close E_INVALIDARG zurückgibt.
Debugebene
Die Debugebene gibt normalerweise Fehler aus, bei denen die Laufzeitüberprüfung fehlschlägt:- Wenn ein Unterressourcenübergang in einer Befehlsliste mit früheren Übergängen in derselben Befehlsliste inkonsistent ist.
- Wenn eine Ressource verwendet wird, ohne zuerst ResourceBarrier aufzurufen, um die Ressource in den richtigen Zustand zu versetzen.
- Wenn eine Ressource illegal gleichzeitig für Lese- und Schreibzugriff gebunden ist.
- Wenn die anden ResourceBarrier übergebenen before-Zustände nicht mit den Nachzuständen früherer Aufrufe von ResourceBarrier übereinstimmen, einschließlich der Aliasing-Großschreibung.
Die Debugebene gibt in den folgenden Fällen Warnungen aus:
- Alle Fälle, in denen die D3D12-Debugebene Warnungen für ID3D12GraphicsCommandList::ResourceBarrier ausgibt.
- Wenn ein Tiefenpuffer in einem nicht schreibgeschützten Modus verwendet wird, während für die Ressource das D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE Nutzungsbit festgelegt ist.
Beispiele
Das D3D12HelloTriangle-Beispiel verwendet ID3D12GraphicsCommandList::ResourceBarrier wie folgt:
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());
}
Siehe Beispielcode in der D3D12-Referenz.
Anforderungen
Zielplattform | Windows |
Kopfzeile | d3d12.h |
Bibliothek | D3d12.lib |
DLL | D3d12.dll |
Weitere Informationen
Verwenden von Ressourcenbarrieren zum Synchronisieren von Ressourcenzuständen in Direct3D 12