From 06d1f1daf55a97bddd2fdf2ce80ad4a01085fbb0 Mon Sep 17 00:00:00 2001 From: TEDERIs Date: Wed, 29 May 2024 20:46:56 +0700 Subject: [PATCH] Fix render states spillover (PR #3412) Fixes issue reported in comment: https://github.com/multitheftauto/mtasa-blue/pull/3402#issuecomment-2136843658 --- Client/core/CCore.cpp | 18 ++++++++++++++---- Client/core/Graphics/CGraphics.cpp | 10 ++++++++++ Client/core/Graphics/CGraphics.h | 2 ++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/Client/core/CCore.cpp b/Client/core/CCore.cpp index 3d32a3b7d4..4fbea21a47 100644 --- a/Client/core/CCore.cpp +++ b/Client/core/CCore.cpp @@ -2012,11 +2012,21 @@ void CCore::OnPreHUDRender() { IDirect3DDevice9* pDevice = CGraphics::GetSingleton().GetDevice(); - CGraphics::GetSingleton().EnteringMTARenderZone(); + if (CGraphics::GetSingleton().HasLine3DPostFXQueueItems() || CGraphics::GetSingleton().HasPrimitive3DPostFXQueueItems()) + { + /* + Although MTA render zones are expensive, we should use them twice in the bounds of the function + because some of render states from PostFX drain to the 2D part of the frame. + */ + CGraphics::GetSingleton().EnteringMTARenderZone(); + + CGraphics::GetSingleton().DrawPrimitive3DPostFXQueue(); + CGraphics::GetSingleton().DrawLine3DPostFXQueue(); + + CGraphics::GetSingleton().LeavingMTARenderZone(); + } - // Draw post-fx 3D primitives - CGraphics::GetSingleton().DrawPrimitive3DPostFXQueue(); - CGraphics::GetSingleton().DrawLine3DPostFXQueue(); + CGraphics::GetSingleton().EnteringMTARenderZone(); // Maybe capture screen and other stuff CGraphics::GetSingleton().GetRenderItemManager()->DoPulse(); diff --git a/Client/core/Graphics/CGraphics.cpp b/Client/core/Graphics/CGraphics.cpp index 274d0d13e4..284412415c 100644 --- a/Client/core/Graphics/CGraphics.cpp +++ b/Client/core/Graphics/CGraphics.cpp @@ -1651,6 +1651,11 @@ bool CGraphics::HasLine3DPreGUIQueueItems(void) return m_pLine3DBatcherPreGUI->HasItems() || m_pMaterialLine3DBatcherPreGUI->HasItems(); } +bool CGraphics::HasLine3DPostFXQueueItems() +{ + return m_pLine3DBatcherPostFX->HasItems() || m_pMaterialLine3DBatcherPostFX->HasItems(); +} + void CGraphics::DrawPrimitive3DPostFXQueue(void) { m_pPrimitive3DBatcherPostFX->Flush(); @@ -1662,6 +1667,11 @@ bool CGraphics::HasPrimitive3DPreGUIQueueItems(void) return m_pMaterialPrimitive3DBatcherPreGUI->HasItems() || m_pPrimitive3DBatcherPreGUI->HasItems(); } +bool CGraphics::HasPrimitive3DPostFXQueueItems() +{ + return m_pMaterialPrimitive3DBatcherPostFX->HasItems() || m_pPrimitive3DBatcherPostFX->HasItems(); +} + void CGraphics::DrawQueue(std::vector& Queue) { BeginDrawBatch(); diff --git a/Client/core/Graphics/CGraphics.h b/Client/core/Graphics/CGraphics.h index 44cd7c9a7f..05efb20241 100644 --- a/Client/core/Graphics/CGraphics.h +++ b/Client/core/Graphics/CGraphics.h @@ -190,9 +190,11 @@ class CGraphics : public CGraphicsInterface, public CSingleton void DrawLine3DPreGUIQueue(void); void DrawLine3DPostFXQueue(void); bool HasLine3DPreGUIQueueItems(void); + bool HasLine3DPostFXQueueItems(); void DrawPrimitive3DPostFXQueue(void); void DrawPrimitive3DPreGUIQueue(void); bool HasPrimitive3DPreGUIQueueItems(void); + bool HasPrimitive3DPostFXQueueItems(); void DidRenderScene(); void SetProgressMessage(const SString& strMessage);