diff options
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/Translation')
4 files changed, 50 insertions, 27 deletions
diff --git a/src/Ryujinx.Graphics.Shader/Translation/EmitterContextInsts.cs b/src/Ryujinx.Graphics.Shader/Translation/EmitterContextInsts.cs index afa830de..9e314c62 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/EmitterContextInsts.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/EmitterContextInsts.cs @@ -897,7 +897,21 @@ namespace Ryujinx.Graphics.Shader.Translation context.Add(new TextureOperation(Instruction.TextureSample, type, TextureFormat.Unknown, flags, binding, compMask, dests, sources)); } - public static Operand TextureSize( + public static Operand TextureQuerySamples( + this EmitterContext context, + SamplerType type, + TextureFlags flags, + int binding, + Operand[] sources) + { + Operand dest = Local(); + + context.Add(new TextureOperation(Instruction.TextureQuerySamples, type, TextureFormat.Unknown, flags, binding, 0, new[] { dest }, sources)); + + return dest; + } + + public static Operand TextureQuerySize( this EmitterContext context, SamplerType type, TextureFlags flags, @@ -907,7 +921,7 @@ namespace Ryujinx.Graphics.Shader.Translation { Operand dest = Local(); - context.Add(new TextureOperation(Instruction.TextureSize, type, TextureFormat.Unknown, flags, binding, compIndex, new[] { dest }, sources)); + context.Add(new TextureOperation(Instruction.TextureQuerySize, type, TextureFormat.Unknown, flags, binding, compIndex, new[] { dest }, sources)); return dest; } diff --git a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs index 43d98d3c..19b7999a 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs @@ -27,9 +27,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations continue; } - if (texOp.Inst == Instruction.Lod || - texOp.Inst == Instruction.TextureSample || - texOp.Inst == Instruction.TextureSize) + if (texOp.Inst == Instruction.TextureSample || texOp.Inst.IsTextureQuery()) { Operand bindlessHandle = Utils.FindLastOperation(texOp.GetSource(0), block); @@ -40,7 +38,8 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations // as long bindless elimination is successful and we know where the texture descriptor is located. bool rewriteSamplerType = texOp.Type == SamplerType.TextureBuffer || - texOp.Inst == Instruction.TextureSize; + texOp.Inst == Instruction.TextureQuerySamples || + texOp.Inst == Instruction.TextureQuerySize; if (bindlessHandle.Type == OperandType.ConstantBuffer) { diff --git a/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs b/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs index 9c487c46..83332711 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs @@ -232,8 +232,8 @@ namespace Ryujinx.Graphics.Shader.Translation inst &= Instruction.Mask; bool isImage = inst == Instruction.ImageLoad || inst == Instruction.ImageStore || inst == Instruction.ImageAtomic; bool isWrite = inst == Instruction.ImageStore || inst == Instruction.ImageAtomic; - bool accurateType = inst != Instruction.Lod && inst != Instruction.TextureSize; - bool intCoords = isImage || flags.HasFlag(TextureFlags.IntCoords) || inst == Instruction.TextureSize; + bool accurateType = !inst.IsTextureQuery(); + bool intCoords = isImage || flags.HasFlag(TextureFlags.IntCoords) || inst == Instruction.TextureQuerySize; bool coherent = flags.HasFlag(TextureFlags.Coherent); if (!isImage) diff --git a/src/Ryujinx.Graphics.Shader/Translation/Transforms/TexturePass.cs b/src/Ryujinx.Graphics.Shader/Translation/Transforms/TexturePass.cs index 2479d85f..dbfe6269 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Transforms/TexturePass.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Transforms/TexturePass.cs @@ -23,7 +23,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms { node = InsertCoordNormalization(context.Hfm, node, context.ResourceManager, context.GpuAccessor, context.Stage); node = InsertCoordGatherBias(node, context.ResourceManager, context.GpuAccessor); - node = InsertConstOffsets(node, context.ResourceManager, context.GpuAccessor); + node = InsertConstOffsets(node, context.GpuAccessor, context.Stage); if (texOp.Type == SamplerType.TextureBuffer && !context.GpuAccessor.QueryHostSupportsSnormBufferTextureFormat()) { @@ -99,7 +99,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms bool isBindless = (texOp.Flags & TextureFlags.Bindless) != 0; bool isIndexed = (texOp.Type & SamplerType.Indexed) != 0; - if (texOp.Inst == Instruction.TextureSize && + if (texOp.Inst == Instruction.TextureQuerySize && texOp.Index < 2 && !isBindless && !isIndexed && @@ -190,7 +190,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms } LinkedListNode<INode> textureSizeNode = node.List.AddBefore(node, new TextureOperation( - Instruction.TextureSize, + Instruction.TextureQuerySize, texOp.Type, texOp.Format, texOp.Flags, @@ -259,7 +259,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms } node.List.AddBefore(node, new TextureOperation( - Instruction.TextureSize, + Instruction.TextureQuerySize, texOp.Type, texOp.Format, texOp.Flags, @@ -287,7 +287,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms return node; } - private static LinkedListNode<INode> InsertConstOffsets(LinkedListNode<INode> node, ResourceManager resourceManager, IGpuAccessor gpuAccessor) + private static LinkedListNode<INode> InsertConstOffsets(LinkedListNode<INode> node, IGpuAccessor gpuAccessor, ShaderStage stage) { // Non-constant texture offsets are not allowed (according to the spec), // however some GPUs does support that. @@ -440,7 +440,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms sources.CopyTo(newSources, 0); - Operand[] texSizes = InsertTextureLod(node, texOp, lodSources, bindlessHandle, coordsCount); + Operand[] texSizes = InsertTextureLod(node, texOp, lodSources, bindlessHandle, coordsCount, stage); int destIndex = 0; @@ -502,7 +502,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms } else { - Operand[] texSizes = InsertTextureLod(node, texOp, lodSources, bindlessHandle, coordsCount); + Operand[] texSizes = InsertTextureLod(node, texOp, lodSources, bindlessHandle, coordsCount, stage); for (int index = 0; index < coordsCount; index++) { @@ -554,21 +554,31 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms TextureOperation texOp, Operand[] lodSources, Operand bindlessHandle, - int coordsCount) + int coordsCount, + ShaderStage stage) { Operand[] texSizes = new Operand[coordsCount]; - Operand lod = Local(); + Operand lod; + + if (stage == ShaderStage.Fragment) + { + lod = Local(); - node.List.AddBefore(node, new TextureOperation( - Instruction.Lod, - texOp.Type, - texOp.Format, - texOp.Flags, - texOp.Binding, - 0, - new[] { lod }, - lodSources)); + node.List.AddBefore(node, new TextureOperation( + Instruction.Lod, + texOp.Type, + texOp.Format, + texOp.Flags, + texOp.Binding, + 0, + new[] { lod }, + lodSources)); + } + else + { + lod = Const(0); + } for (int index = 0; index < coordsCount; index++) { @@ -586,7 +596,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms } node.List.AddBefore(node, new TextureOperation( - Instruction.TextureSize, + Instruction.TextureQuerySize, texOp.Type, texOp.Format, texOp.Flags, |