mirror of
https://github.com/Ryujinx/Ryujinx.git
synced 2024-11-28 08:46:40 +00:00
Fix for texture pool not being updated when it should + buffer texture related fixes (#2911)
This commit is contained in:
parent
521a07e612
commit
e7c2dc8ec3
4 changed files with 66 additions and 37 deletions
|
@ -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
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue