forked from Mirror/Ryujinx
Fix texture flush from CPU WaitSync regression on OpenGL (#4289)
This commit is contained in:
parent
cd3a15aea5
commit
93df366b2c
2 changed files with 23 additions and 21 deletions
|
@ -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)
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Reference in a new issue