aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader/CodeGen
diff options
context:
space:
mode:
authorriperiperi <rhy3756547@hotmail.com>2023-01-13 00:31:21 +0000
committerGitHub <noreply@github.com>2023-01-13 01:31:21 +0100
commit8fa248ceb4cbc9d199bbac1d968df8b168106c2c (patch)
tree678ca26d2a909c6a85aba13a1b03df704cabfa2e /Ryujinx.Graphics.Shader/CodeGen
parent30862b5ffd6848b1296da23bc8bb7e9f96bb7e60 (diff)
Vulkan: Add workarounds for MoltenVK (#4202)
* Add MVK basics. * Use appropriate output attribute types * 4kb vertex alignment, bunch of fixes * Add reduced shader precision mode for mvk. * Disable ASTC on MVK for now * Only request robustnes2 when it is available. * It's just the one feature actually * Add triangle fan conversion * Allow NullDescriptor on MVK for some reason. * Force safe blit on MoltenVK * Use ASTC only when formats are all available. * Disable multilevel 3d texture views * Filter duplicate render targets (on backend) * Add Automatic MoltenVK Configuration * Do not create color attachment views with formats that are not RT compatible * Make sure that the host format matches the vertex shader input types for invalid/unknown guest formats * FIx rebase for Vertex Attrib State * Fix 4b alignment for vertex * Use asynchronous queue submits for MVK * Ensure color clear shader has correct output type * Update MoltenVK config * Always use MoltenVK workarounds on MacOS * Make MVK supersede all vendors * Fix rebase * Various fixes on rebase * Get portability flags from extension * Fix some minor rebasing issues * Style change * Use LibraryImport for MVKConfiguration * Rename MoltenVK vendor to Apple Intel and AMD GPUs on moltenvk report with the those vendors - only apple silicon reports with vendor 0x106B. * Fix features2 rebase conflict * Rename fragment output type * Add missing check for fragment output types Might have caused the crash in MK8 * Only do fragment output specialization on MoltenVK * Avoid copy when passing capabilities * Self feedback * Address feedback Co-authored-by: gdk <gab.dark.100@gmail.com> Co-authored-by: nastys <nastys@users.noreply.github.com>
Diffstat (limited to 'Ryujinx.Graphics.Shader/CodeGen')
-rw-r--r--Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs26
-rw-r--r--Ryujinx.Graphics.Shader/CodeGen/Glsl/GlslGenerator.cs12
-rw-r--r--Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs4
-rw-r--r--Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs5
-rw-r--r--Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs28
5 files changed, 60 insertions, 15 deletions
diff --git a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs
index 4da21cb7..996d312b 100644
--- a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs
+++ b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs
@@ -346,12 +346,17 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
{
string name = context.OperandManager.DeclareLocal(decl);
- context.AppendLine(GetVarTypeName(decl.VarType) + " " + name + ";");
+ context.AppendLine(GetVarTypeName(context, decl.VarType) + " " + name + ";");
}
}
- public static string GetVarTypeName(AggregateType type, bool precise = true)
+ public static string GetVarTypeName(CodeGenContext context, AggregateType type, bool precise = true)
{
+ if (context.Config.GpuAccessor.QueryHostReducedPrecision())
+ {
+ precise = false;
+ }
+
return type switch
{
AggregateType.Void => "void",
@@ -666,7 +671,22 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
}
else
{
- context.AppendLine($"layout (location = {attr}) out vec4 {name};");
+ string type = context.Config.Stage != ShaderStage.Fragment ? "vec4" :
+ context.Config.GpuAccessor.QueryFragmentOutputType(attr) switch
+ {
+ AttributeType.Sint => "ivec4",
+ AttributeType.Uint => "uvec4",
+ _ => "vec4"
+ };
+
+ if (context.Config.GpuAccessor.QueryHostReducedPrecision() && context.Config.Stage == ShaderStage.Vertex && attr == 0)
+ {
+ context.AppendLine($"layout (location = {attr}) invariant out {type} {name};");
+ }
+ else
+ {
+ context.AppendLine($"layout (location = {attr}) out {type} {name};");
+ }
}
}
diff --git a/Ryujinx.Graphics.Shader/CodeGen/Glsl/GlslGenerator.cs b/Ryujinx.Graphics.Shader/CodeGen/Glsl/GlslGenerator.cs
index 90826a15..90727558 100644
--- a/Ryujinx.Graphics.Shader/CodeGen/Glsl/GlslGenerator.cs
+++ b/Ryujinx.Graphics.Shader/CodeGen/Glsl/GlslGenerator.cs
@@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
{
for (int i = 1; i < info.Functions.Count; i++)
{
- context.AppendLine($"{GetFunctionSignature(info.Functions[i])};");
+ context.AppendLine($"{GetFunctionSignature(context, info.Functions[i])};");
}
context.AppendLine();
@@ -44,7 +44,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
{
context.CurrentFunction = function;
- context.AppendLine(GetFunctionSignature(function, funcName));
+ context.AppendLine(GetFunctionSignature(context, function, funcName));
context.EnterScope();
Declarations.DeclareLocals(context, function);
@@ -54,23 +54,23 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
context.LeaveScope();
}
- private static string GetFunctionSignature(StructuredFunction function, string funcName = null)
+ private static string GetFunctionSignature(CodeGenContext context, StructuredFunction function, string funcName = null)
{
string[] args = new string[function.InArguments.Length + function.OutArguments.Length];
for (int i = 0; i < function.InArguments.Length; i++)
{
- args[i] = $"{Declarations.GetVarTypeName(function.InArguments[i])} {OperandManager.GetArgumentName(i)}";
+ args[i] = $"{Declarations.GetVarTypeName(context, function.InArguments[i])} {OperandManager.GetArgumentName(i)}";
}
for (int i = 0; i < function.OutArguments.Length; i++)
{
int j = i + function.InArguments.Length;
- args[j] = $"out {Declarations.GetVarTypeName(function.OutArguments[i])} {OperandManager.GetArgumentName(j)}";
+ args[j] = $"out {Declarations.GetVarTypeName(context, function.OutArguments[i])} {OperandManager.GetArgumentName(j)}";
}
- return $"{Declarations.GetVarTypeName(function.ReturnType)} {funcName ?? function.Name}({string.Join(", ", args)})";
+ return $"{Declarations.GetVarTypeName(context, function.ReturnType)} {funcName ?? function.Name}({string.Join(", ", args)})";
}
private static void PrintBlock(CodeGenContext context, AstBlock block)
diff --git a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs
index f667d080..3dbd73b2 100644
--- a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs
+++ b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs
@@ -32,7 +32,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
if ((outputType & AggregateType.ElementCountMask) != 0)
{
- return $"{Declarations.GetVarTypeName(outputType, precise: false)}({imageConst})";
+ return $"{Declarations.GetVarTypeName(context, outputType, precise: false)}({imageConst})";
}
return imageConst;
@@ -513,7 +513,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
if ((outputType & AggregateType.ElementCountMask) != 0)
{
- return $"{Declarations.GetVarTypeName(outputType, precise: false)}({scalarValue})";
+ return $"{Declarations.GetVarTypeName(context, outputType, precise: false)}({scalarValue})";
}
}
diff --git a/Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs b/Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs
index 3da72b40..fab1667c 100644
--- a/Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs
+++ b/Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs
@@ -577,6 +577,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
context.Decorate(spvVar, Decoration.Patch);
}
+ if (context.Config.GpuAccessor.QueryHostReducedPrecision() && attr == AttributeConsts.PositionX && context.Config.Stage != ShaderStage.Fragment)
+ {
+ context.Decorate(spvVar, Decoration.Invariant);
+ }
+
context.Decorate(spvVar, Decoration.BuiltIn, (LiteralInteger)GetBuiltIn(context, attrInfo.BaseValue));
if (context.Config.TransformFeedbackEnabled && context.Config.LastInVertexPipeline && isOutAttr)
diff --git a/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs b/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs
index a02c4c22..61abf334 100644
--- a/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs
+++ b/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs
@@ -2194,13 +2194,23 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
if (operation.Inst.HasFlag(Instruction.FP64))
{
var result = emitF(context.TypeFP64(), context.GetFP64(src1), context.GetFP64(src2));
- context.Decorate(result, Decoration.NoContraction);
+
+ if (!context.Config.GpuAccessor.QueryHostReducedPrecision())
+ {
+ context.Decorate(result, Decoration.NoContraction);
+ }
+
return new OperationResult(AggregateType.FP64, result);
}
else if (operation.Inst.HasFlag(Instruction.FP32))
{
var result = emitF(context.TypeFP32(), context.GetFP32(src1), context.GetFP32(src2));
- context.Decorate(result, Decoration.NoContraction);
+
+ if (!context.Config.GpuAccessor.QueryHostReducedPrecision())
+ {
+ context.Decorate(result, Decoration.NoContraction);
+ }
+
return new OperationResult(AggregateType.FP32, result);
}
else
@@ -2255,13 +2265,23 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
if (operation.Inst.HasFlag(Instruction.FP64))
{
var result = emitF(context.TypeFP64(), context.GetFP64(src1), context.GetFP64(src2), context.GetFP64(src3));
- context.Decorate(result, Decoration.NoContraction);
+
+ if (!context.Config.GpuAccessor.QueryHostReducedPrecision())
+ {
+ context.Decorate(result, Decoration.NoContraction);
+ }
+
return new OperationResult(AggregateType.FP64, result);
}
else if (operation.Inst.HasFlag(Instruction.FP32))
{
var result = emitF(context.TypeFP32(), context.GetFP32(src1), context.GetFP32(src2), context.GetFP32(src3));
- context.Decorate(result, Decoration.NoContraction);
+
+ if (!context.Config.GpuAccessor.QueryHostReducedPrecision())
+ {
+ context.Decorate(result, Decoration.NoContraction);
+ }
+
return new OperationResult(AggregateType.FP32, result);
}
else