diff --git a/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs b/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs
index a6e0616cc3..c167dc0d31 100644
--- a/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs
+++ b/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs
@@ -1431,10 +1431,21 @@ namespace Ryujinx.Graphics.Gpu.Image
                 return;
             }
 
-            handle.Sync(_context);
+            bool isGpuThread = _context.IsGpuThread();
+
+            if (isGpuThread)
+            {
+                // No need to wait if we're on the GPU thread, we can just clear the modified flag immediately.
+                handle.Modified = false;
+            }
 
             _context.Renderer.BackgroundContextAction(() =>
             {
+                if (!isGpuThread)
+                {
+                    handle.Sync(_context);
+                }
+
                 Storage.SignalModifiedDirty();
 
                 lock (handle.Overlaps)
diff --git a/Ryujinx.Graphics.Gpu/Image/TextureGroupHandle.cs b/Ryujinx.Graphics.Gpu/Image/TextureGroupHandle.cs
index 34b59cffe4..1b83cb5589 100644
--- a/Ryujinx.Graphics.Gpu/Image/TextureGroupHandle.cs
+++ b/Ryujinx.Graphics.Gpu/Image/TextureGroupHandle.cs
@@ -10,7 +10,7 @@ namespace Ryujinx.Graphics.Gpu.Image
     /// A tracking handle for a texture group, which represents a range of views in a storage texture.
     /// Retains a list of overlapping texture views, a modified flag, and tracking for each
     /// CPU VA range that the views cover.
-    /// Also tracks copy dependencies for the handle - references to other handles that must be kept 
+    /// Also tracks copy dependencies for the handle - references to other handles that must be kept
     /// in sync with this one before use.
     /// </summary>
     class TextureGroupHandle : IDisposable
@@ -232,32 +232,23 @@ namespace Ryujinx.Graphics.Gpu.Image
         /// <param name="context">The GPU context used to wait for sync</param>
         public void Sync(GpuContext context)
         {
-            bool needsSync = !context.IsGpuThread();
+            ulong registeredSync = _registeredSync;
+            long diff = (long)(context.SyncNumber - registeredSync);
 
-            if (needsSync)
+            if (diff > 0)
             {
-                ulong registeredSync = _registeredSync;
-                long diff = (long)(context.SyncNumber - registeredSync);
+                context.Renderer.WaitSync(registeredSync);
 
-                if (diff > 0)
+                if ((long)(_modifiedSync - registeredSync) > 0)
                 {
-                    context.Renderer.WaitSync(registeredSync);
-
-                    if ((long)(_modifiedSync - registeredSync) > 0)
-                    {
-                        // Flush the data in a previous state. Do not remove the modified flag - it will be removed to ignore following writes.
-                        return;
-                    }
-
-                    Modified = false;
+                    // Flush the data in a previous state. Do not remove the modified flag - it will be removed to ignore following writes.
+                    return;
                 }
-                
-                // If the difference is <= 0, no data is not ready yet. Flush any data we can without waiting or removing modified flag.
-            }
-            else
-            {
+
                 Modified = false;
             }
+
+            // If the difference is <= 0, no data is not ready yet. Flush any data we can without waiting or removing modified flag.
         }
 
         /// <summary>