1
0
Fork 0
mirror of https://github.com/Ryujinx/Ryujinx.git synced 2024-12-05 00:52:01 +00:00

Fix for texture pool not being updated when it should + buffer texture related fixes (#2911)

This commit is contained in:
gdkchan 2021-12-19 11:50:44 -03:00 committed by GitHub
parent 521a07e612
commit e7c2dc8ec3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 66 additions and 37 deletions

View file

@ -34,6 +34,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
{ nameof(ThreedClassState.LaunchDma), new RwCallback(LaunchDma, null) }, { nameof(ThreedClassState.LaunchDma), new RwCallback(LaunchDma, null) },
{ nameof(ThreedClassState.LoadInlineData), new RwCallback(LoadInlineData, null) }, { nameof(ThreedClassState.LoadInlineData), new RwCallback(LoadInlineData, null) },
{ nameof(ThreedClassState.SyncpointAction), new RwCallback(IncrementSyncpoint, null) }, { nameof(ThreedClassState.SyncpointAction), new RwCallback(IncrementSyncpoint, null) },
{ nameof(ThreedClassState.InvalidateSamplerCacheNoWfi), new RwCallback(InvalidateSamplerCacheNoWfi, null) },
{ nameof(ThreedClassState.InvalidateTextureHeaderCacheNoWfi), new RwCallback(InvalidateTextureHeaderCacheNoWfi, null) },
{ nameof(ThreedClassState.TextureBarrier), new RwCallback(TextureBarrier, null) }, { nameof(ThreedClassState.TextureBarrier), new RwCallback(TextureBarrier, null) },
{ nameof(ThreedClassState.TextureBarrierTiled), new RwCallback(TextureBarrierTiled, null) }, { nameof(ThreedClassState.TextureBarrierTiled), new RwCallback(TextureBarrierTiled, null) },
{ nameof(ThreedClassState.DrawTextureSrcY), new RwCallback(DrawTexture, null) }, { nameof(ThreedClassState.DrawTextureSrcY), new RwCallback(DrawTexture, null) },
@ -227,6 +229,24 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
_context.Synchronization.IncrementSyncpoint(syncpointId); _context.Synchronization.IncrementSyncpoint(syncpointId);
} }
/// <summary>
/// Invalidates the cache with the sampler descriptors from the sampler pool.
/// </summary>
/// <param name="argument">Method call argument (unused)</param>
private void InvalidateSamplerCacheNoWfi(int argument)
{
_context.AdvanceSequence();
}
/// <summary>
/// Invalidates the cache with the texture descriptors from the texture pool.
/// </summary>
/// <param name="argument">Method call argument (unused)</param>
private void InvalidateTextureHeaderCacheNoWfi(int argument)
{
_context.AdvanceSequence();
}
/// <summary> /// <summary>
/// Issues a texture barrier. /// Issues a texture barrier.
/// This waits until previous texture writes from the GPU to finish, before /// This waits until previous texture writes from the GPU to finish, before

View file

@ -784,7 +784,10 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
public YControl YControl; public YControl YControl;
public float LineWidthSmooth; public float LineWidthSmooth;
public float LineWidthAliased; public float LineWidthAliased;
public fixed uint Reserved13B8[31]; public fixed uint Reserved13B8[27];
public uint InvalidateSamplerCacheNoWfi;
public uint InvalidateTextureHeaderCacheNoWfi;
public fixed uint Reserved142C[2];
public uint FirstVertex; public uint FirstVertex;
public uint FirstInstance; public uint FirstInstance;
public fixed uint Reserved143C[53]; public fixed uint Reserved143C[53];

View file

@ -377,6 +377,15 @@ namespace Ryujinx.Graphics.Gpu.Image
ITexture hostTexture = texture?.GetTargetTexture(bindingInfo.Target); ITexture hostTexture = texture?.GetTargetTexture(bindingInfo.Target);
if (hostTexture != null && texture.Target == Target.TextureBuffer)
{
// Ensure that the buffer texture is using the correct buffer as storage.
// Buffers are frequently re-created to accomodate larger data, so we need to re-bind
// to ensure we're not using a old buffer that was already deleted.
_channel.BufferManager.SetBufferTextureStorage(hostTexture, texture.Range.GetSubRange(0).Address, texture.Size, bindingInfo, bindingInfo.Format, false);
}
else
{
if (_textureState[stageIndex][index].Texture != hostTexture || _rebind) if (_textureState[stageIndex][index].Texture != hostTexture || _rebind)
{ {
if (UpdateScale(texture, bindingInfo, index, stage)) if (UpdateScale(texture, bindingInfo, index, stage))
@ -389,14 +398,6 @@ namespace Ryujinx.Graphics.Gpu.Image
_context.Renderer.Pipeline.SetTexture(bindingInfo.Binding, hostTexture); _context.Renderer.Pipeline.SetTexture(bindingInfo.Binding, hostTexture);
} }
if (hostTexture != null && texture.Target == Target.TextureBuffer)
{
// Ensure that the buffer texture is using the correct buffer as storage.
// Buffers are frequently re-created to accomodate larger data, so we need to re-bind
// to ensure we're not using a old buffer that was already deleted.
_channel.BufferManager.SetBufferTextureStorage(hostTexture, texture.Range.GetSubRange(0).Address, texture.Size, bindingInfo, bindingInfo.Format, false);
}
Sampler sampler = samplerPool?.Get(samplerId); Sampler sampler = samplerPool?.Get(samplerId);
ISampler hostSampler = sampler?.GetHostSampler(texture); ISampler hostSampler = sampler?.GetHostSampler(texture);
@ -409,6 +410,7 @@ namespace Ryujinx.Graphics.Gpu.Image
} }
} }
} }
}
/// <summary> /// <summary>
/// Ensures that the image bindings are visible to the host GPU. /// Ensures that the image bindings are visible to the host GPU.
@ -464,7 +466,9 @@ namespace Ryujinx.Graphics.Gpu.Image
_channel.BufferManager.SetBufferTextureStorage(hostTexture, texture.Range.GetSubRange(0).Address, texture.Size, bindingInfo, format, true); _channel.BufferManager.SetBufferTextureStorage(hostTexture, texture.Range.GetSubRange(0).Address, texture.Size, bindingInfo, format, true);
} }
else if (isStore) else
{
if (isStore)
{ {
texture?.SignalModified(); texture?.SignalModified();
} }
@ -489,6 +493,7 @@ namespace Ryujinx.Graphics.Gpu.Image
} }
} }
} }
}
/// <summary> /// <summary>
/// Gets the texture descriptor for a given texture handle. /// Gets the texture descriptor for a given texture handle.

View file

@ -56,6 +56,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
public void SetStorage(BufferRange buffer) public void SetStorage(BufferRange buffer)
{ {
if (_buffer != BufferHandle.Null && if (_buffer != BufferHandle.Null &&
_buffer == buffer.Handle &&
buffer.Offset == _bufferOffset && buffer.Offset == _bufferOffset &&
buffer.Size == _bufferSize && buffer.Size == _bufferSize &&
_renderer.BufferCount == _bufferCount) _renderer.BufferCount == _bufferCount)