diff options
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs')
-rw-r--r-- | src/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs | 132 |
1 files changed, 54 insertions, 78 deletions
diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs index 3701325e..7d3d22d8 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs @@ -324,16 +324,7 @@ namespace Ryujinx.Graphics.Shader.Instructions int handle = !isBindless ? imm : 0; - TextureOperation operation = context.CreateTextureOperation( - Instruction.TextureSample, - type, - flags, - handle, - componentMask, - dests, - sources); - - context.Add(operation); + EmitTextureSample(context, type, flags, handle, componentMask, dests, sources); } private static void EmitTexs( @@ -657,16 +648,7 @@ namespace Ryujinx.Graphics.Shader.Instructions Array.Resize(ref dests, outputIndex); } - TextureOperation operation = context.CreateTextureOperation( - Instruction.TextureSample, - type, - flags, - handle, - componentMask, - dests, - sources); - - context.Add(operation); + EmitTextureSample(context, type, flags, handle, componentMask, dests, sources); if (isF16) { @@ -812,18 +794,7 @@ namespace Ryujinx.Graphics.Shader.Instructions Array.Resize(ref dests, outputIndex); } - int handle = imm; - - TextureOperation operation = context.CreateTextureOperation( - Instruction.TextureSample, - type, - flags, - handle, - componentMask, - dests, - sources); - - context.Add(operation); + EmitTextureSample(context, type, flags, imm, componentMask, dests, sources); } private static void EmitTmml( @@ -913,15 +884,21 @@ namespace Ryujinx.Graphics.Shader.Instructions return Register(dest++, RegisterType.Gpr); } - int handle = imm; + int binding = isBindless ? 0 : context.Config.ResourceManager.GetTextureOrImageBinding( + Instruction.Lod, + type, + TextureFormat.Unknown, + flags, + TextureOperation.DefaultCbufSlot, + imm); for (int compMask = componentMask, compIndex = 0; compMask != 0; compMask >>= 1, compIndex++) { if ((compMask & 1) != 0) { - Operand destOperand = GetDest(); + Operand d = GetDest(); - if (destOperand == null) + if (d == null) { break; } @@ -930,28 +907,18 @@ namespace Ryujinx.Graphics.Shader.Instructions if (compIndex >= 2) { context.Add(new CommentNode("Unsupported component z or w found")); - context.Copy(destOperand, Const(0)); + context.Copy(d, Const(0)); } else { - Operand tempDest = Local(); - - TextureOperation operation = context.CreateTextureOperation( - Instruction.Lod, - type, - flags, - handle, - compIndex ^ 1, // The instruction component order is the inverse of GLSL's. - new[] { tempDest }, - sources); - - context.Add(operation); + // The instruction component order is the inverse of GLSL's. + Operand res = context.Lod(type, flags, binding, compIndex ^ 1, sources); - tempDest = context.FPMultiply(tempDest, ConstF(256.0f)); + res = context.FPMultiply(res, ConstF(256.0f)); - Operand fixedPointValue = context.FP32ConvertToS32(tempDest); + Operand fixedPointValue = context.FP32ConvertToS32(res); - context.Copy(destOperand, fixedPointValue); + context.Copy(d, fixedPointValue); } } } @@ -1081,18 +1048,7 @@ namespace Ryujinx.Graphics.Shader.Instructions Array.Resize(ref dests, outputIndex); } - int handle = imm; - - TextureOperation operation = context.CreateTextureOperation( - Instruction.TextureSample, - type, - flags, - handle, - componentMask, - dests, - sources); - - context.Add(operation); + EmitTextureSample(context, type, flags, imm, componentMask, dests, sources); } private static void EmitTxq( @@ -1111,10 +1067,6 @@ namespace Ryujinx.Graphics.Shader.Instructions context.Config.SetUsedFeature(FeatureFlags.IntegerSampling); - // TODO: Validate and use query. - Instruction inst = Instruction.TextureSize; - TextureFlags flags = isBindless ? TextureFlags.Bindless : TextureFlags.None; - Operand Ra() { if (srcA > RegisterConsts.RegisterZeroIndex) @@ -1157,31 +1109,55 @@ namespace Ryujinx.Graphics.Shader.Instructions type = context.Config.GpuAccessor.QuerySamplerType(imm); } + TextureFlags flags = isBindless ? TextureFlags.Bindless : TextureFlags.None; + + int binding = isBindless ? 0 : context.Config.ResourceManager.GetTextureOrImageBinding( + Instruction.TextureSize, + type, + TextureFormat.Unknown, + flags, + TextureOperation.DefaultCbufSlot, + imm); + for (int compMask = componentMask, compIndex = 0; compMask != 0; compMask >>= 1, compIndex++) { if ((compMask & 1) != 0) { - Operand destOperand = GetDest(); + Operand d = GetDest(); - if (destOperand == null) + if (d == null) { break; } - TextureOperation operation = context.CreateTextureOperation( - inst, - type, - flags, - imm, - compIndex, - new[] { destOperand }, - sources); + // TODO: Validate and use query parameter. + Operand res = context.TextureSize(type, flags, binding, compIndex, sources); - context.Add(operation); + context.Copy(d, res); } } } + private static void EmitTextureSample( + EmitterContext context, + SamplerType type, + TextureFlags flags, + int handle, + int componentMask, + Operand[] dests, + Operand[] sources) + { + int binding = flags.HasFlag(TextureFlags.Bindless) ? 0 : context.Config.ResourceManager.GetTextureOrImageBinding( + Instruction.TextureSample, + type, + TextureFormat.Unknown, + flags, + TextureOperation.DefaultCbufSlot, + handle); + + context.TextureSample(type, flags, binding, componentMask, dests, sources); + } + private static SamplerType ConvertSamplerType(TexDim dimensions) { return dimensions switch |