From 04bd87ed5a06d35f1e19d7af89e5d9d58a29f6ac Mon Sep 17 00:00:00 2001 From: gdkchan Date: Mon, 4 Apr 2022 14:43:58 -0300 Subject: [PATCH] Fix shader textureSize with multisample and buffer textures (#3240) * Fix shader textureSize with multisample and buffer textures * Replace out param with tuple return value --- .../CodeGen/Glsl/CodeGenContext.cs | 19 +++++++++++++ .../Glsl/Instructions/InstGenMemory.cs | 27 ++++++++++++------- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/Ryujinx.Graphics.Shader/CodeGen/Glsl/CodeGenContext.cs b/Ryujinx.Graphics.Shader/CodeGen/Glsl/CodeGenContext.cs index b482301999..825347497d 100644 --- a/Ryujinx.Graphics.Shader/CodeGen/Glsl/CodeGenContext.cs +++ b/Ryujinx.Graphics.Shader/CodeGen/Glsl/CodeGenContext.cs @@ -70,6 +70,25 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl AppendLine("}" + suffix); } + public (TextureDescriptor, int) FindTextureDescriptor(AstTextureOperation texOp) + { + TextureDescriptor[] descriptors = Config.GetTextureDescriptors(); + + for (int i = 0; i < descriptors.Length; i++) + { + var descriptor = descriptors[i]; + + if (descriptor.CbufSlot == texOp.CbufSlot && + descriptor.HandleIndex == texOp.Handle && + descriptor.Format == texOp.Format) + { + return (descriptor, i); + } + } + + return (default, -1); + } + private static int FindDescriptorIndex(TextureDescriptor[] array, AstTextureOperation texOp) { for (int i = 0; i < array.Length; i++) diff --git a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs index 164de7bbfd..6805f2faa4 100644 --- a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs +++ b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs @@ -756,27 +756,34 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions string samplerName = OperandManager.GetSamplerName(context.Config.Stage, texOp, indexExpr); - int lodSrcIndex = isBindless || isIndexed ? 1 : 0; - - IAstNode lod = operation.GetSource(lodSrcIndex); - - string lodExpr = GetSoureExpr(context, lod, GetSrcVarType(operation.Inst, lodSrcIndex)); - if (texOp.Index == 3) { return $"textureQueryLevels({samplerName})"; } else { - string texCall = $"textureSize({samplerName}, {lodExpr}){GetMask(texOp.Index)}"; + (TextureDescriptor descriptor, int descriptorIndex) = context.FindTextureDescriptor(texOp); + bool hasLod = !descriptor.Type.HasFlag(SamplerType.Multisample) && descriptor.Type != SamplerType.TextureBuffer; + string texCall; + + if (hasLod) + { + int lodSrcIndex = isBindless || isIndexed ? 1 : 0; + IAstNode lod = operation.GetSource(lodSrcIndex); + string lodExpr = GetSoureExpr(context, lod, GetSrcVarType(operation.Inst, lodSrcIndex)); + + texCall = $"textureSize({samplerName}, {lodExpr}){GetMask(texOp.Index)}"; + } + else + { + texCall = $"textureSize({samplerName}){GetMask(texOp.Index)}"; + } if (context.Config.Stage.SupportsRenderScale() && !isBindless && !isIndexed) { - int index = context.FindTextureDescriptorIndex(texOp); - - texCall = "Helper_TextureSizeUnscale(" + texCall + ", " + index + ")"; + texCall = $"Helper_TextureSizeUnscale({texCall}, {descriptorIndex})"; } return texCall;