Finally fix (most) image atomics

This commit is contained in:
Isaac Marovitz 2024-08-01 18:13:49 +01:00 committed by Isaac Marovitz
parent 8fa8f3a390
commit 068a83bdfb
2 changed files with 41 additions and 8 deletions

View file

@ -46,7 +46,11 @@ namespace Ryujinx.Graphics.Metal
{ {
ShaderSource shader = _shaders[i]; ShaderSource shader = _shaders[i];
var compileOptions = new MTLCompileOptions { PreserveInvariance = true }; var compileOptions = new MTLCompileOptions
{
PreserveInvariance = true,
LanguageVersion = MTLLanguageVersion.Version31,
};
var index = i; var index = i;
_handles[i] = device.NewLibrary(StringHelper.NSString(shader.Code), compileOptions, (library, error) => CompilationResultHandler(library, error, index)); _handles[i] = device.NewLibrary(StringHelper.NSString(shader.Code), compileOptions, (library, error) => CompilationResultHandler(library, error, index));

View file

@ -211,7 +211,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl.Instructions
} }
else else
{ {
coordsBuilder.Append(Src(AggregateType.S32)); coordsBuilder.Append($"uint({Src(AggregateType.S32)})");
} }
if (isArray) if (isArray)
@ -251,16 +251,45 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl.Instructions
_ => string.Empty, _ => string.Empty,
}; };
texCallBuilder.Append($"{prefix}4({string.Join(", ", cElems)}), "); texCallBuilder.Append($"{prefix}4({string.Join(", ", cElems)})");
texCallBuilder.Append(", ");
texCallBuilder.Append(coordsBuilder);
} }
if (texOp.Inst == Instruction.ImageAtomic)
{
// Atomics do (coord, value)
texCallBuilder.Append(coordsBuilder); texCallBuilder.Append(coordsBuilder);
texCallBuilder.Append(", ");
AggregateType type = texOp.Format.GetComponentType();
if ((texOp.Flags & TextureFlags.AtomicMask) == TextureFlags.CAS)
{
texCallBuilder.Append(Src(type)); // Compare value.
}
string value = (texOp.Flags & TextureFlags.AtomicMask) switch
{
TextureFlags.Increment => NumberFormatter.FormatInt(1, type), // TODO: Clamp value
TextureFlags.Decrement => NumberFormatter.FormatInt(-1, type), // TODO: Clamp value
_ => Src(type),
};
texCallBuilder.Append(value);
// This doesn't match what the MSL spec document says so either
// it is wrong or the MSL compiler has a bug.
texCallBuilder.Append(")[0]");
}
else
{
texCallBuilder.Append(')'); texCallBuilder.Append(')');
if (texOp.Inst == Instruction.ImageLoad) if (texOp.Inst == Instruction.ImageLoad)
{ {
texCallBuilder.Append(GetMaskMultiDest(texOp.Index)); texCallBuilder.Append(GetMaskMultiDest(texOp.Index));
} }
}
return texCallBuilder.ToString(); return texCallBuilder.ToString();
} }