aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs')
-rw-r--r--src/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs132
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