ID3D12Fence::GetCompletedValue method
Gets the current value of the fence.
Syntax
UINT64 GetCompletedValue();
Parameters
This method has no parameters.
Return value
Type: UINT64
Returns the current value of the fence.
Examples
The D3D12HelloTriangle sample uses ID3D12Fence::GetCompletedValue as follows:
void D3D12HelloTriangle::WaitForPreviousFrame() { // WAITING FOR THE FRAME TO COMPLETE BEFORE CONTINUING IS NOT BEST PRACTICE. // This is code implemented as such for simplicity. More advanced samples // illustrate how to use fences for efficient resource usage. // Signal and increment the fence value. const UINT64 fence = m_fenceValue; ThrowIfFailed(m_commandQueue->Signal(m_fence.Get(), fence)); m_fenceValue++; // Wait until the previous frame is finished. if (m_fence->GetCompletedValue() < fence) { ThrowIfFailed(m_fence->SetEventOnCompletion(fence, m_fenceEvent)); WaitForSingleObject(m_fenceEvent, INFINITE); } m_frameIndex = m_swapChain->GetCurrentBackBufferIndex(); }
The D3D12nBodyGravity sample uses ID3D12Fence::GetCompletedValue as follows:
Wait for the render thread to complete processing of a shader resource view (SRV).
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
Show: