From 3cb1fa0e853efc04cc183d3ee75ec1bbe2c845a4 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Sat, 25 Apr 2020 10:02:18 -0300 Subject: Implement texture buffers (#1152) * Implement texture buffers * Throw NotSupportedException where appropriate --- Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs | 71 ++++++++++++++---------------- 1 file changed, 32 insertions(+), 39 deletions(-) (limited to 'Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs') diff --git a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs index 6bbc3b11..d7144063 100644 --- a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs +++ b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs @@ -280,8 +280,12 @@ namespace Ryujinx.Graphics.Gpu.Shader => localMemorySize, QueryInfoName.ComputeSharedMemorySize => sharedMemorySize, + QueryInfoName.IsTextureBuffer + => Convert.ToInt32(QueryIsTextureBuffer(state, 0, index, compute: true)), + QueryInfoName.IsTextureRectangle + => Convert.ToInt32(QueryIsTextureRectangle(state, 0, index, compute: true)), QueryInfoName.TextureFormat - => (int)QueryComputeTextureFormat(state, index), + => (int)QueryTextureFormat(state, 0, index, compute: true), _ => QueryInfoCommon(info) }; @@ -331,13 +335,13 @@ namespace Ryujinx.Graphics.Gpu.Shader return info switch { QueryInfoName.IsTextureBuffer - => Convert.ToInt32(QueryIsTextureBuffer(state, (int)stage - 1, index)), + => Convert.ToInt32(QueryIsTextureBuffer(state, (int)stage - 1, index, compute: false)), QueryInfoName.IsTextureRectangle - => Convert.ToInt32(QueryIsTextureRectangle(state, (int)stage - 1, index)), + => Convert.ToInt32(QueryIsTextureRectangle(state, (int)stage - 1, index, compute: false)), QueryInfoName.PrimitiveTopology => (int)QueryPrimitiveTopology(), QueryInfoName.TextureFormat - => (int)QueryGraphicsTextureFormat(state, (int)stage - 1, index), + => (int)QueryTextureFormat(state, (int)stage - 1, index, compute: false), _ => QueryInfoCommon(info) }; @@ -429,11 +433,12 @@ namespace Ryujinx.Graphics.Gpu.Shader /// /// Current GPU state /// Index of the shader stage - /// Index of the texture (this is the shader "fake" handle) + /// Index of the texture (this is the shader "fake" handle) + /// Indicates whenever the texture descriptor is for the compute or graphics engine /// True if the texture is a buffer texture, false otherwise - private bool QueryIsTextureBuffer(GpuState state, int stageIndex, int index) + private bool QueryIsTextureBuffer(GpuState state, int stageIndex, int handle, bool compute) { - return GetGraphicsTextureDescriptor(state, stageIndex, index).UnpackTextureTarget() == TextureTarget.TextureBuffer; + return GetTextureDescriptor(state, stageIndex, handle, compute).UnpackTextureTarget() == TextureTarget.TextureBuffer; } /// @@ -443,11 +448,12 @@ namespace Ryujinx.Graphics.Gpu.Shader /// /// Current GPU state /// Index of the shader stage - /// Index of the texture (this is the shader "fake" handle) + /// Index of the texture (this is the shader "fake" handle) + /// Indicates whenever the texture descriptor is for the compute or graphics engine /// True if the texture is a rectangle texture, false otherwise - private bool QueryIsTextureRectangle(GpuState state, int stageIndex, int index) + private bool QueryIsTextureRectangle(GpuState state, int stageIndex, int handle, bool compute) { - var descriptor = GetGraphicsTextureDescriptor(state, stageIndex, index); + var descriptor = GetTextureDescriptor(state, stageIndex, handle, compute); TextureTarget target = descriptor.UnpackTextureTarget(); @@ -461,23 +467,13 @@ namespace Ryujinx.Graphics.Gpu.Shader /// Queries the format of a given texture. /// /// Current GPU state - /// Index of the texture (this is the shader "fake" handle) - /// The texture format - private TextureFormat QueryComputeTextureFormat(GpuState state, int index) - { - return QueryTextureFormat(GetComputeTextureDescriptor(state, index)); - } - - /// - /// Queries the format of a given texture. - /// - /// Current GPU state - /// Index of the shader stage - /// Index of the texture (this is the shader "fake" handle) + /// Index of the shader stage. This is ignored if is true + /// Index of the texture (this is the shader "fake" handle) + /// Indicates whenever the texture descriptor is for the compute or graphics engine /// The texture format - private TextureFormat QueryGraphicsTextureFormat(GpuState state, int stageIndex, int index) + private TextureFormat QueryTextureFormat(GpuState state, int stageIndex, int handle, bool compute) { - return QueryTextureFormat(GetGraphicsTextureDescriptor(state, stageIndex, index)); + return QueryTextureFormat(GetTextureDescriptor(state, stageIndex, handle, compute)); } /// @@ -541,23 +537,20 @@ namespace Ryujinx.Graphics.Gpu.Shader /// Gets the texture descriptor for a given texture on the pool. /// /// Current GPU state + /// Index of the shader stage. This is ignored if is true /// Index of the texture (this is the shader "fake" handle) + /// Indicates whenever the texture descriptor is for the compute or graphics engine /// Texture descriptor - private TextureDescriptor GetComputeTextureDescriptor(GpuState state, int handle) + private TextureDescriptor GetTextureDescriptor(GpuState state, int stageIndex, int handle, bool compute) { - return _context.Methods.TextureManager.GetComputeTextureDescriptor(state, handle); - } - - /// - /// Gets the texture descriptor for a given texture on the pool. - /// - /// Current GPU state - /// Index of the shader stage - /// Index of the texture (this is the shader "fake" handle) - /// Texture descriptor - private TextureDescriptor GetGraphicsTextureDescriptor(GpuState state, int stageIndex, int handle) - { - return _context.Methods.TextureManager.GetGraphicsTextureDescriptor(state, stageIndex, handle); + if (compute) + { + return _context.Methods.TextureManager.GetComputeTextureDescriptor(state, handle); + } + else + { + return _context.Methods.TextureManager.GetGraphicsTextureDescriptor(state, stageIndex, handle); + } } /// -- cgit v1.2.3