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