Example #1
0
  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;
}