HRESULT STDMETHODCALLTYPE CD3DX12AffinityFence::WaitOnFenceCompletion( UINT64 Value) { std::vector<HANDLE> Events; UINT EventCount = 0; for (UINT i = 0; i < D3DX12_MAX_ACTIVE_NODES;i++) { if (((1 << i) & mAffinityMask) != 0) { ID3D12Fence* Fence = mFences[i]; Events.push_back(0); Events[EventCount] = CreateEventEx(nullptr, FALSE, FALSE, EVENT_ALL_ACCESS); HRESULT const hr = Fence->SetEventOnCompletion(Value, Events[EventCount]); if (hr != S_OK) { return hr; } ++EventCount; } } WaitForMultipleObjects((DWORD)EventCount, &(Events[0]), TRUE, INFINITE); return S_OK; }
HRESULT STDMETHODCALLTYPE CD3DX12AffinityFence::SetEventOnCompletion( UINT64 Value, HANDLE hEvent) { UINT i = GetActiveNodeIndex(); ID3D12Fence* Fence = mFences[i]; return Fence->SetEventOnCompletion(Value, hEvent); }
void waitAtEndOfFrame() { uint64_t local_fence_value = fence_value; WINCHECK( commandQueue->Signal( fence, local_fence_value ) ); ++fence_value; if( fence->GetCompletedValue() < local_fence_value ) { WINCHECK( fence->SetEventOnCompletion( local_fence_value, fence_event ) ); WaitForSingleObject( fence_event, INFINITE ); } }
HRESULT STDMETHODCALLTYPE CD3DX12AffinityFence::Signal( UINT64 Value) { for (UINT i = 0; i < D3DX12_MAX_ACTIVE_NODES;i++) { if (((1 << i) & mAffinityMask) != 0) { ID3D12Fence* Fence = mFences[i]; HRESULT const hr = Fence->Signal(Value); if (hr != S_OK) { return hr; } } } return S_OK; }
void* RenderAPI_D3D12::BeginModifyTexture(void* textureHandle, int textureWidth, int textureHeight, int* outRowPitch) { ID3D12Fence* fence = s_D3D12->GetFrameFence(); // Wait on the previous job (example only - simplifies resource management) if (fence->GetCompletedValue() < s_D3D12FenceValue) { fence->SetEventOnCompletion(s_D3D12FenceValue, s_D3D12Event); WaitForSingleObject(s_D3D12Event, INFINITE); } // Begin a command list s_D3D12CmdAlloc->Reset(); s_D3D12CmdList->Reset(s_D3D12CmdAlloc, nullptr); // Fill data const UINT64 kDataSize = textureWidth * textureHeight * 4; ID3D12Resource* upload = GetUploadResource(kDataSize); void* mapped = NULL; upload->Map(0, NULL, &mapped); *outRowPitch = textureWidth * 4; return mapped; }