Shader Memory Barriers
Fixes some of the shader generation failures in Sonic Frontiers
This commit is contained in:
parent
650f309b58
commit
a31e461db8
2 changed files with 9 additions and 3 deletions
|
@ -131,7 +131,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl.Instructions
|
||||||
case Instruction.FSIEnd:
|
case Instruction.FSIEnd:
|
||||||
return "|| FSI END ||";
|
return "|| FSI END ||";
|
||||||
case Instruction.GroupMemoryBarrier:
|
case Instruction.GroupMemoryBarrier:
|
||||||
return "|| FIND GROUP MEMORY BARRIER ||";
|
case Instruction.MemoryBarrier:
|
||||||
|
return MemoryBarrier(context, operation);
|
||||||
case Instruction.ImageLoad:
|
case Instruction.ImageLoad:
|
||||||
case Instruction.ImageStore:
|
case Instruction.ImageStore:
|
||||||
case Instruction.ImageAtomic:
|
case Instruction.ImageAtomic:
|
||||||
|
@ -140,8 +141,6 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl.Instructions
|
||||||
return Load(context, operation);
|
return Load(context, operation);
|
||||||
case Instruction.Lod:
|
case Instruction.Lod:
|
||||||
return Lod(context, operation);
|
return Lod(context, operation);
|
||||||
case Instruction.MemoryBarrier:
|
|
||||||
return "|| MEMORY BARRIER ||";
|
|
||||||
case Instruction.Store:
|
case Instruction.Store:
|
||||||
return Store(context, operation);
|
return Store(context, operation);
|
||||||
case Instruction.SwizzleAdd:
|
case Instruction.SwizzleAdd:
|
||||||
|
|
|
@ -600,6 +600,13 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl.Instructions
|
||||||
return $"float2(as_type<half2>({srcExpr})){GetMask(operation.Index)}";
|
return $"float2(as_type<half2>({srcExpr})){GetMask(operation.Index)}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string MemoryBarrier(CodeGenContext context, AstOperation operation)
|
||||||
|
{
|
||||||
|
var grouped = (operation.Inst & Instruction.Mask) == Instruction.GroupMemoryBarrier;
|
||||||
|
|
||||||
|
return $"threadgroup_barrier(mem_flags::mem_{(grouped ? "threadgroup" : "device")})";
|
||||||
|
}
|
||||||
|
|
||||||
private static string GetMask(int index)
|
private static string GetMask(int index)
|
||||||
{
|
{
|
||||||
return $".{"xy".AsSpan(index, 1)}";
|
return $".{"xy".AsSpan(index, 1)}";
|
||||||
|
|
Loading…
Reference in a new issue