Fix fragment shaders (and fuck everything up)

This commit is contained in:
Isaac Marovitz 2023-10-10 20:00:56 -04:00 committed by Isaac Marovitz
parent 2890fc1069
commit 511db833db
4 changed files with 21 additions and 6 deletions

View file

@ -20,8 +20,9 @@ namespace Ryujinx.Graphics.Metal
{ {
for (int index = 0; index < shaders.Length; index++) for (int index = 0; index < shaders.Length; index++)
{ {
var libraryError = new NSError(IntPtr.Zero);
ShaderSource shader = shaders[index]; ShaderSource shader = shaders[index];
var libraryError = new NSError(IntPtr.Zero);
var shaderLibrary = device.NewLibrary(StringHelper.NSString(shader.Code), new MTLCompileOptions(IntPtr.Zero), ref libraryError); var shaderLibrary = device.NewLibrary(StringHelper.NSString(shader.Code), new MTLCompileOptions(IntPtr.Zero), ref libraryError);
if (libraryError != IntPtr.Zero) if (libraryError != IntPtr.Zero)
{ {

View file

@ -67,6 +67,10 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
{ {
context.AppendLine("VertexOutput out;"); context.AppendLine("VertexOutput out;");
} }
else if (stage == ShaderStage.Fragment)
{
context.AppendLine("FragmentOutput out;");
}
foreach (AstOperand decl in function.Locals) foreach (AstOperand decl in function.Locals)
{ {
@ -133,8 +137,9 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
{ {
string type = GetVarTypeName(context, context.Definitions.GetUserDefinedType(ioDefinition.Location, isOutput: false)); string type = GetVarTypeName(context, context.Definitions.GetUserDefinedType(ioDefinition.Location, isOutput: false));
string name = $"{DefaultNames.IAttributePrefix}{ioDefinition.Location}"; string name = $"{DefaultNames.IAttributePrefix}{ioDefinition.Location}";
string suffix = context.Definitions.Stage == ShaderStage.Vertex ? $" [[attribute({ioDefinition.Location})]]" : "";
context.AppendLine($"{type} {name} [[attribute({ioDefinition.Location})]];"); context.AppendLine($"{type} {name}{suffix};");
} }
context.LeaveScope(";"); context.LeaveScope(";");
@ -173,9 +178,17 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
foreach (var ioDefinition in inputs.OrderBy(x => x.Location)) foreach (var ioDefinition in inputs.OrderBy(x => x.Location))
{ {
string type = GetVarTypeName(context, context.Definitions.GetUserDefinedType(ioDefinition.Location, isOutput: true)); string type = GetVarTypeName(context, context.Definitions.GetUserDefinedType(ioDefinition.Location, isOutput: true));
string name = $"{DefaultNames.OAttributePrefix}{ioDefinition.Location}"; string name = ioDefinition.IoVariable switch
name = ioDefinition.IoVariable == IoVariable.Position ? "position" : name; {
string suffix = ioDefinition.IoVariable == IoVariable.Position ? " [[position]]" : ""; IoVariable.Position => "position",
IoVariable.FragmentOutputColor => "color",
_ => $"{DefaultNames.OAttributePrefix}{ioDefinition.Location}"
};
string suffix = ioDefinition.IoVariable switch
{
IoVariable.Position => " [[position]]",
_ => ""
};
context.AppendLine($"{type} {name}{suffix};"); context.AppendLine($"{type} {name}{suffix};");
} }

View file

@ -70,7 +70,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl.Instructions
{ {
return $"{op} {GetSourceExpr(context, operation.GetSource(0), context.CurrentFunction.ReturnType)}"; return $"{op} {GetSourceExpr(context, operation.GetSource(0), context.CurrentFunction.ReturnType)}";
} }
else if (inst == Instruction.Return && context.Definitions.Stage == ShaderStage.Vertex) if (inst == Instruction.Return && context.Definitions.Stage is ShaderStage.Vertex or ShaderStage.Fragment)
{ {
return $"{op} out"; return $"{op} out";
} }

View file

@ -91,6 +91,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
{ {
funcKeyword = "fragment"; funcKeyword = "fragment";
funcName = "fragmentMain"; funcName = "fragmentMain";
returnType = "FragmentOutput";
} }
else if (stage == ShaderStage.Compute) else if (stage == ShaderStage.Compute)
{ {