aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2020-04-25 10:02:18 -0300
committerGitHub <noreply@github.com>2020-04-25 23:02:18 +1000
commit3cb1fa0e853efc04cc183d3ee75ec1bbe2c845a4 (patch)
treecf19d371b99cffdbff03e2f20271927cb7b08bf8 /Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs
parenta065dc1626d2fa4cb5c7300a1aa8713ffb4f5896 (diff)
Implement texture buffers (#1152)
* Implement texture buffers * Throw NotSupportedException where appropriate
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs')
-rw-r--r--Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs25
1 files changed, 15 insertions, 10 deletions
diff --git a/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs b/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs
index 7cc7f046..612ec5ca 100644
--- a/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs
+++ b/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs
@@ -69,7 +69,6 @@ namespace Ryujinx.Graphics.Gpu.Image
public void SetTextures(int stage, TextureBindingInfo[] bindings)
{
_textureBindings[stage] = bindings;
-
_textureState[stage] = new TextureStatePerStage[bindings.Length];
}
@@ -81,7 +80,6 @@ namespace Ryujinx.Graphics.Gpu.Image
public void SetImages(int stage, TextureBindingInfo[] bindings)
{
_imageBindings[stage] = bindings;
-
_imageState[stage] = new TextureStatePerStage[bindings.Length];
}
@@ -201,7 +199,7 @@ namespace Ryujinx.Graphics.Gpu.Image
}
else
{
- packedId = ReadPackedId(stageIndex, binding.Handle);
+ packedId = ReadPackedId(stageIndex, binding.Handle, _textureBufferIndex);
}
int textureId = UnpackTextureId(packedId);
@@ -227,6 +225,14 @@ namespace Ryujinx.Graphics.Gpu.Image
_context.Renderer.Pipeline.SetTexture(index, stage, hostTexture);
}
+ if (hostTexture != null && texture.Info.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.
+ _context.Methods.BufferManager.SetBufferTextureStorage(hostTexture, texture.Address, texture.Size, _isCompute);
+ }
+
Sampler sampler = _samplerPool.Get(samplerId);
ISampler hostSampler = sampler?.HostSampler;
@@ -258,8 +264,7 @@ namespace Ryujinx.Graphics.Gpu.Image
{
TextureBindingInfo binding = _imageBindings[stageIndex][index];
- int packedId = ReadPackedId(stageIndex, binding.Handle);
-
+ int packedId = ReadPackedId(stageIndex, binding.Handle, _textureBufferIndex);
int textureId = UnpackTextureId(packedId);
Texture texture = pool.Get(textureId);
@@ -284,8 +289,7 @@ namespace Ryujinx.Graphics.Gpu.Image
/// <returns>The texture descriptor for the specified texture</returns>
public TextureDescriptor GetTextureDescriptor(GpuState state, int stageIndex, int handle)
{
- int packedId = ReadPackedId(stageIndex, handle);
-
+ int packedId = ReadPackedId(stageIndex, handle, state.Get<int>(MethodOffset.TextureBufferIndex));
int textureId = UnpackTextureId(packedId);
var poolState = state.Get<PoolState>(MethodOffset.TexturePoolState);
@@ -303,8 +307,9 @@ namespace Ryujinx.Graphics.Gpu.Image
/// </summary>
/// <param name="stageIndex">The number of the shader stage where the texture is bound</param>
/// <param name="wordOffset">A word offset of the handle on the buffer (the "fake" shader handle)</param>
+ /// <param name="textureBufferIndex">Index of the constant buffer holding the texture handles</param>
/// <returns>The packed texture and sampler ID (the real texture handle)</returns>
- private int ReadPackedId(int stageIndex, int wordOffset)
+ private int ReadPackedId(int stageIndex, int wordOffset, int textureBufferIndex)
{
ulong address;
@@ -312,11 +317,11 @@ namespace Ryujinx.Graphics.Gpu.Image
if (_isCompute)
{
- address = bufferManager.GetComputeUniformBufferAddress(_textureBufferIndex);
+ address = bufferManager.GetComputeUniformBufferAddress(textureBufferIndex);
}
else
{
- address = bufferManager.GetGraphicsUniformBufferAddress(stageIndex, _textureBufferIndex);
+ address = bufferManager.GetGraphicsUniformBufferAddress(stageIndex, textureBufferIndex);
}
address += (uint)wordOffset * 4;