FSI (with raster order groups)

This commit is contained in:
Isaac Marovitz 2024-07-24 16:25:03 +01:00 committed by Isaac Marovitz
parent fdf7578928
commit 2b919493e3
3 changed files with 15 additions and 11 deletions

View file

@ -65,14 +65,16 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
context.AppendLine("using namespace metal;"); context.AppendLine("using namespace metal;");
context.AppendLine(); context.AppendLine();
var fsi = (info.HelperFunctionsMask & HelperFunctionsMask.FSI) != 0;
DeclareInputAttributes(context, info.IoDefinitions.Where(x => IsUserDefined(x, StorageKind.Input))); DeclareInputAttributes(context, info.IoDefinitions.Where(x => IsUserDefined(x, StorageKind.Input)));
context.AppendLine(); context.AppendLine();
DeclareOutputAttributes(context, info.IoDefinitions.Where(x => x.StorageKind == StorageKind.Output)); DeclareOutputAttributes(context, info.IoDefinitions.Where(x => x.StorageKind == StorageKind.Output));
context.AppendLine(); context.AppendLine();
DeclareBufferStructures(context, context.Properties.ConstantBuffers.Values, true); DeclareBufferStructures(context, context.Properties.ConstantBuffers.Values, true, fsi);
DeclareBufferStructures(context, context.Properties.StorageBuffers.Values, false); DeclareBufferStructures(context, context.Properties.StorageBuffers.Values, false, fsi);
DeclareTextures(context, context.Properties.Textures.Values); DeclareTextures(context, context.Properties.Textures.Values);
DeclareImages(context, context.Properties.Images.Values); DeclareImages(context, context.Properties.Images.Values, fsi);
if ((info.HelperFunctionsMask & HelperFunctionsMask.FindLSB) != 0) if ((info.HelperFunctionsMask & HelperFunctionsMask.FindLSB) != 0)
{ {
@ -180,7 +182,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
} }
} }
private static void DeclareBufferStructures(CodeGenContext context, IEnumerable<BufferDefinition> buffers, bool constant) private static void DeclareBufferStructures(CodeGenContext context, IEnumerable<BufferDefinition> buffers, bool constant, bool fsi)
{ {
var name = constant ? "ConstantBuffers" : "StorageBuffers"; var name = constant ? "ConstantBuffers" : "StorageBuffers";
var addressSpace = constant ? "constant" : "device"; var addressSpace = constant ? "constant" : "device";
@ -193,8 +195,9 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
foreach (BufferDefinition buffer in sortedBuffers) foreach (BufferDefinition buffer in sortedBuffers)
{ {
var needsPadding = buffer.Layout == BufferLayout.Std140; var needsPadding = buffer.Layout == BufferLayout.Std140;
string fsiSuffix = constant && fsi ? " [[raster_order_group(0)]]" : "";
argBufferPointers.Add($"{addressSpace} {Defaults.StructPrefix}_{buffer.Name}* {buffer.Name};"); argBufferPointers.Add($"{addressSpace} {Defaults.StructPrefix}_{buffer.Name}* {buffer.Name}{fsiSuffix};");
context.AppendLine($"struct {Defaults.StructPrefix}_{buffer.Name}"); context.AppendLine($"struct {Defaults.StructPrefix}_{buffer.Name}");
context.EnterScope(); context.EnterScope();
@ -271,7 +274,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
context.AppendLine(); context.AppendLine();
} }
private static void DeclareImages(CodeGenContext context, IEnumerable<TextureDefinition> images) private static void DeclareImages(CodeGenContext context, IEnumerable<TextureDefinition> images, bool fsi)
{ {
context.AppendLine("struct Images"); context.AppendLine("struct Images");
context.EnterScope(); context.EnterScope();
@ -284,7 +287,9 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
foreach (TextureDefinition image in sortedImages) foreach (TextureDefinition image in sortedImages)
{ {
var imageTypeName = image.Type.ToMslTextureType(true); var imageTypeName = image.Type.ToMslTextureType(true);
argBufferPointers.Add($"{imageTypeName} {image.Name};"); string fsiSuffix = fsi ? " [[raster_order_group(0)]]" : "";
argBufferPointers.Add($"{imageTypeName} {image.Name}{fsiSuffix};");
} }
foreach (var pointer in argBufferPointers) foreach (var pointer in argBufferPointers)

View file

@ -131,9 +131,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl.Instructions
case Instruction.Call: case Instruction.Call:
return Call(context, operation); return Call(context, operation);
case Instruction.FSIBegin: case Instruction.FSIBegin:
return "|| FSI BEGIN ||";
case Instruction.FSIEnd: case Instruction.FSIEnd:
return "|| FSI END ||"; return "// FSI implemented with raster order groups in MSL";
case Instruction.GroupMemoryBarrier: case Instruction.GroupMemoryBarrier:
case Instruction.MemoryBarrier: case Instruction.MemoryBarrier:
case Instruction.Barrier: case Instruction.Barrier:

View file

@ -164,8 +164,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl.Instructions
public static bool NeedsParenthesis(IAstNode node, Instruction pInst, InstInfo pInfo, bool isLhs) public static bool NeedsParenthesis(IAstNode node, Instruction pInst, InstInfo pInfo, bool isLhs)
{ {
// If the node isn't a operation, then it can only be a operand, // If the node isn't an operation, then it can only be an operand,
// and those never needs to be surrounded in parenthesis. // and those never needs to be surrounded in parentheses.
if (node is not AstOperation operation) if (node is not AstOperation operation)
{ {
// This is sort of a special case, if this is a negative constant, // This is sort of a special case, if this is a negative constant,