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];