ID3D12Fence interface
Represents a fence, an object used for synchronization of the CPU and one or more GPUs.
Members
The ID3D12Fence interface inherits from ID3D12Pageable. ID3D12Fence also has these types of members:
Methods
The ID3D12Fence interface has these methods.
| Method | Description |
|---|---|
| GetCompletedValue |
Gets the current value of the fence. |
| SetEventOnCompletion |
Specifies an event that should be fired when the fence reaches a certain value. |
| Signal |
Sets the fence to the specified value. |
Examples
The D3D12nBodyGravity sample uses ID3D12Fence as follows:
Header file declaration of synchronization objects.
// Synchronization objects.
UINT m_frameIndex;
HANDLE m_fenceEvent;
ComPtr<ID3D12Fence> m_fence;
UINT64 m_fenceValues[FrameCount];
Asynchronous compute thread.
DWORD D3D12nBodyGravity::AsyncComputeThreadProc(int threadIndex) { ID3D12CommandQueue* pCommandQueue = m_computeCommandQueue[threadIndex].Get(); ID3D12CommandAllocator* pCommandAllocator = m_computeAllocator[threadIndex].Get(); ID3D12GraphicsCommandList* pCommandList = m_computeCommandList[threadIndex].Get(); ID3D12Fence* pFence = m_threadFences[threadIndex].Get(); while (0 == InterlockedGetValue(&m_terminating)) { // Run the particle simulation. Simulate(threadIndex); // Close and execute the command list. ThrowIfFailed(pCommandList->Close()); ID3D12CommandList* ppCommandLists[] = { pCommandList }; pCommandQueue->ExecuteCommandLists(1, ppCommandLists); // Wait for the compute shader to complete the simulation. UINT64 threadFenceValue = InterlockedIncrement(&m_threadFenceValues[threadIndex]); ThrowIfFailed(pCommandQueue->Signal(pFence, threadFenceValue)); ThrowIfFailed(pFence->SetEventOnCompletion(threadFenceValue, m_threadFenceEvents[threadIndex])); WaitForSingleObject(m_threadFenceEvents[threadIndex], INFINITE); // Wait for the render thread to be done with the SRV so that // the next frame in the simulation can run. UINT64 renderContextFenceValue = InterlockedGetValue(&m_renderContextFenceValues[threadIndex]); if (m_renderContextFence->GetCompletedValue() < renderContextFenceValue) { ThrowIfFailed(pCommandQueue->Wait(m_renderContextFence.Get(), renderContextFenceValue)); InterlockedExchange(&m_renderContextFenceValues[threadIndex], 0); } // Swap the indices to the SRV and UAV. m_srvIndex[threadIndex] = 1 - m_srvIndex[threadIndex]; // Prepare for the next frame. ThrowIfFailed(pCommandAllocator->Reset()); ThrowIfFailed(pCommandList->Reset(pCommandAllocator, m_computeState.Get())); } return 0; }
Refer to the Example Code in the D3D12 Reference.
Requirements
|
Header |
|
|---|---|
|
Library |
|
|
DLL |
|
See also