diff --git a/Source/Engine/Graphics/Enums.h b/Source/Engine/Graphics/Enums.h index 6343b827b..f6af6c16b 100644 --- a/Source/Engine/Graphics/Enums.h +++ b/Source/Engine/Graphics/Enums.h @@ -340,8 +340,15 @@ API_ENUM(Attributes="Flags") enum class GPUResourceMapMode /// The resource is mapped for reading and writing. /// ReadWrite = Read | Write, + + /// + /// Flag that indicates mapping should fail with no data if the resource is still used by the GPU. Otherwise, CPU will wait for the GPU execution. + /// + NoWait = 0x04, }; +DECLARE_ENUM_OPERATORS(GPUResourceMapMode); + /// /// Primitives types. /// diff --git a/Source/Engine/GraphicsDevice/DirectX/DX11/GPUBufferDX11.cpp b/Source/Engine/GraphicsDevice/DirectX/DX11/GPUBufferDX11.cpp index 1ea5f1b75..f7575d0a5 100644 --- a/Source/Engine/GraphicsDevice/DirectX/DX11/GPUBufferDX11.cpp +++ b/Source/Engine/GraphicsDevice/DirectX/DX11/GPUBufferDX11.cpp @@ -29,12 +29,12 @@ void* GPUBufferDX11::Map(GPUResourceMapMode mode) map.pData = nullptr; D3D11_MAP mapType; UINT mapFlags = 0; - switch (mode) + switch (mode & GPUResourceMapMode::ReadWrite) { case GPUResourceMapMode::Read: mapType = D3D11_MAP_READ; - //if (_desc.Usage == GPUResourceUsage::StagingReadback && isMainThread) - // mapFlags = D3D11_MAP_FLAG_DO_NOT_WAIT; + if (EnumHasAnyFlags(mode, GPUResourceMapMode::NoWait)) + mapFlags = D3D11_MAP_FLAG_DO_NOT_WAIT; break; case GPUResourceMapMode::Write: mapType = D3D11_MAP_WRITE_DISCARD; diff --git a/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.cpp b/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.cpp index 3dc730aa0..782f15260 100644 --- a/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.cpp +++ b/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.cpp @@ -649,7 +649,7 @@ bool DynamicDiffuseGlobalIlluminationPass::RenderInner(RenderContext& renderCont // Update stats { StatsData stats; - if (void* mapped = ddgiData.StatsRead->Map(GPUResourceMapMode::Read)) + if (void* mapped = ddgiData.StatsRead->Map(GPUResourceMapMode::Read | GPUResourceMapMode::NoWait)) { Platform::MemoryCopy(&stats, mapped, sizeof(stats)); ddgiData.StatsRead->Unmap(); diff --git a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp index 1fbf94945..dad9a23e6 100644 --- a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp +++ b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp @@ -976,7 +976,7 @@ bool GlobalSurfaceAtlasPass::Render(RenderContext& renderContext, GPUContext* co { // Get the last counter value (accept staging readback delay or not available data yet) notReady = true; - auto data = (uint32*)_culledObjectsSizeBuffer->Map(GPUResourceMapMode::Read); + auto data = (uint32*)_culledObjectsSizeBuffer->Map(GPUResourceMapMode::Read | GPUResourceMapMode::NoWait); if (data) { uint32 counter = data[surfaceAtlasData.CulledObjectsCounterIndex];