Fix texture flush from CPU WaitSync regression on OpenGL (#4289)

This commit is contained in:
gdkchan 2023-01-14 11:23:57 -03:00 committed by GitHub
parent cd3a15aea5
commit 93df366b2c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 21 deletions

View File

@ -1431,10 +1431,21 @@ namespace Ryujinx.Graphics.Gpu.Image
return; 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(() => _context.Renderer.BackgroundContextAction(() =>
{ {
if (!isGpuThread)
{
handle.Sync(_context);
}
Storage.SignalModifiedDirty(); Storage.SignalModifiedDirty();
lock (handle.Overlaps) lock (handle.Overlaps)

View File

@ -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. /// 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 /// Retains a list of overlapping texture views, a modified flag, and tracking for each
/// CPU VA range that the views cover. /// 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. /// in sync with this one before use.
/// </summary> /// </summary>
class TextureGroupHandle : IDisposable class TextureGroupHandle : IDisposable
@ -232,32 +232,23 @@ namespace Ryujinx.Graphics.Gpu.Image
/// <param name="context">The GPU context used to wait for sync</param> /// <param name="context">The GPU context used to wait for sync</param>
public void Sync(GpuContext context) 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; context.Renderer.WaitSync(registeredSync);
long diff = (long)(context.SyncNumber - registeredSync);
if (diff > 0) if ((long)(_modifiedSync - registeredSync) > 0)
{ {
context.Renderer.WaitSync(registeredSync); // Flush the data in a previous state. Do not remove the modified flag - it will be removed to ignore following writes.
return;
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;
} }
// 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; 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> /// <summary>