diff options
author | gdkchan <gab.dark.100@gmail.com> | 2020-04-25 10:02:18 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-25 23:02:18 +1000 |
commit | 3cb1fa0e853efc04cc183d3ee75ec1bbe2c845a4 (patch) | |
tree | cf19d371b99cffdbff03e2f20271927cb7b08bf8 /Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs | |
parent | a065dc1626d2fa4cb5c7300a1aa8713ffb4f5896 (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.cs | 25 |
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; |