aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Ryujinx.Graphics.Shader/CodeGen/Glsl/CodeGenContext.cs19
-rw-r--r--Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs27
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 b4823019..82534749 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 164de7bb..6805f2fa 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;