aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu/Image
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2021-12-19 11:50:44 -0300
committerGitHub <noreply@github.com>2021-12-19 11:50:44 -0300
commite7c2dc8ec3329d50a52c36efeb31019850ce6015 (patch)
tree626476cc54fcf225261d6e26269a8c162284f3ec /Ryujinx.Graphics.Gpu/Image
parent521a07e6125d3a5d9781512639387a9be5f09107 (diff)
Fix for texture pool not being updated when it should + buffer texture related fixes (#2911)
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Image')
-rw-r--r--Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs71
1 files changed, 38 insertions, 33 deletions
diff --git a/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs b/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs
index e7561f7d..dea918cd 100644
--- a/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs
+++ b/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs
@@ -377,18 +377,6 @@ namespace Ryujinx.Graphics.Gpu.Image
ITexture hostTexture = texture?.GetTargetTexture(bindingInfo.Target);
- if (_textureState[stageIndex][index].Texture != hostTexture || _rebind)
- {
- if (UpdateScale(texture, bindingInfo, index, stage))
- {
- hostTexture = texture?.GetTargetTexture(bindingInfo.Target);
- }
-
- _textureState[stageIndex][index].Texture = 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.
@@ -396,16 +384,30 @@ namespace Ryujinx.Graphics.Gpu.Image
// 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 (UpdateScale(texture, bindingInfo, index, stage))
+ {
+ hostTexture = texture?.GetTargetTexture(bindingInfo.Target);
+ }
+
+ _textureState[stageIndex][index].Texture = hostTexture;
- Sampler sampler = samplerPool?.Get(samplerId);
+ _context.Renderer.Pipeline.SetTexture(bindingInfo.Binding, hostTexture);
+ }
- ISampler hostSampler = sampler?.GetHostSampler(texture);
+ Sampler sampler = samplerPool?.Get(samplerId);
- if (_textureState[stageIndex][index].Sampler != hostSampler || _rebind)
- {
- _textureState[stageIndex][index].Sampler = hostSampler;
+ ISampler hostSampler = sampler?.GetHostSampler(texture);
+
+ if (_textureState[stageIndex][index].Sampler != hostSampler || _rebind)
+ {
+ _textureState[stageIndex][index].Sampler = hostSampler;
- _context.Renderer.Pipeline.SetSampler(bindingInfo.Binding, hostSampler);
+ _context.Renderer.Pipeline.SetSampler(bindingInfo.Binding, hostSampler);
+ }
}
}
}
@@ -464,28 +466,31 @@ namespace Ryujinx.Graphics.Gpu.Image
_channel.BufferManager.SetBufferTextureStorage(hostTexture, texture.Range.GetSubRange(0).Address, texture.Size, bindingInfo, format, true);
}
- else if (isStore)
- {
- texture?.SignalModified();
- }
-
- if (_imageState[stageIndex][index].Texture != hostTexture || _rebind)
+ else
{
- if (UpdateScale(texture, bindingInfo, baseScaleIndex + index, stage))
+ if (isStore)
{
- hostTexture = texture?.GetTargetTexture(bindingInfo.Target);
+ texture?.SignalModified();
}
- _imageState[stageIndex][index].Texture = hostTexture;
+ if (_imageState[stageIndex][index].Texture != hostTexture || _rebind)
+ {
+ if (UpdateScale(texture, bindingInfo, baseScaleIndex + index, stage))
+ {
+ hostTexture = texture?.GetTargetTexture(bindingInfo.Target);
+ }
- Format format = bindingInfo.Format;
+ _imageState[stageIndex][index].Texture = hostTexture;
- if (format == 0 && texture != null)
- {
- format = texture.Format;
- }
+ Format format = bindingInfo.Format;
- _context.Renderer.Pipeline.SetImage(bindingInfo.Binding, hostTexture, format);
+ if (format == 0 && texture != null)
+ {
+ format = texture.Format;
+ }
+
+ _context.Renderer.Pipeline.SetImage(bindingInfo.Binding, hostTexture, format);
+ }
}
}
}