diff --git a/src/d3d11/d3d11_context_ext.cpp b/src/d3d11/d3d11_context_ext.cpp index aac32b887c08..3d865940bf34 100644 --- a/src/d3d11/d3d11_context_ext.cpp +++ b/src/d3d11/d3d11_context_ext.cpp @@ -143,15 +143,30 @@ namespace dxvk { void STDMETHODCALLTYPE D3D11DeviceContextExt::SetBarrierControl( UINT ControlFlags) { D3D10DeviceLock lock = m_ctx->LockContext(); - D3D11Device* parent = static_cast(m_ctx->GetParentInterface()); - DxvkBarrierControlFlags flags = parent->GetOptionsBarrierControlFlags(); - if (ControlFlags & D3D11_VK_BARRIER_CONTROL_IGNORE_WRITE_AFTER_WRITE) - flags.set(DxvkBarrierControl::IgnoreComputeWriteAfterWrite, DxvkBarrierControl::IgnoreGraphicsWriteAfterWrite); + if (m_barrierControl != ControlFlags) { + D3D11Device* parent = static_cast(m_ctx->GetParentInterface()); - m_ctx->EmitCs([cFlags = flags] (DxvkContext* ctx) { - ctx->setBarrierControl(cFlags); - }); + DxvkBarrierControlFlags builtIn = parent->GetOptionsBarrierControlFlags(); + DxvkBarrierControlFlags flags = 0u; + + if (ControlFlags & D3D11_VK_BARRIER_CONTROL_IGNORE_WRITE_AFTER_WRITE) + flags.set(DxvkBarrierControl::IgnoreComputeWriteAfterWrite, DxvkBarrierControl::IgnoreGraphicsWriteAfterWrite); + + m_ctx->EmitCs([ + cFlags = flags, + cBuiltIn = builtIn + ] (DxvkContext* ctx) { + ctx->setBarrierControl(cFlags | cBuiltIn); + + if (!cFlags.isClear()) + ctx->beginDebugLabel(vk::makeLabel(0x9bded9, "UAV Overlap")); + else + ctx->endDebugLabel(); + }); + } + + m_barrierControl = ControlFlags; } diff --git a/src/d3d11/d3d11_context_ext.h b/src/d3d11/d3d11_context_ext.h index 6b95dcf95d0d..6e78d4004255 100644 --- a/src/d3d11/d3d11_context_ext.h +++ b/src/d3d11/d3d11_context_ext.h @@ -72,9 +72,11 @@ namespace dxvk { uint32_t NumWriteResources); private: - + ContextType* m_ctx; + UINT m_barrierControl = 0u; + }; }