mirror of
https://github.com/GreemDev/Ryujinx.git
synced 2024-12-22 23:55:47 +00:00
Finally fix (most) image atomics
This commit is contained in:
parent
8fa8f3a390
commit
068a83bdfb
2 changed files with 41 additions and 8 deletions
|
@ -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));
|
||||||
|
|
|
@ -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,15 +251,44 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
texCallBuilder.Append(coordsBuilder);
|
if (texOp.Inst == Instruction.ImageAtomic)
|
||||||
texCallBuilder.Append(')');
|
|
||||||
|
|
||||||
if (texOp.Inst == Instruction.ImageLoad)
|
|
||||||
{
|
{
|
||||||
texCallBuilder.Append(GetMaskMultiDest(texOp.Index));
|
// Atomics do (coord, value)
|
||||||
|
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(')');
|
||||||
|
|
||||||
|
if (texOp.Inst == Instruction.ImageLoad)
|
||||||
|
{
|
||||||
|
texCallBuilder.Append(GetMaskMultiDest(texOp.Index));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return texCallBuilder.ToString();
|
return texCallBuilder.ToString();
|
||||||
|
|
Loading…
Reference in a new issue