mirror of
https://github.com/Ryujinx/Ryujinx.git
synced 2025-02-21 23:25:34 +00:00
* Move some properties out of ShaderConfig * Stop using ShaderConfig on backends * Replace ShaderConfig usages on Translator and passes * Move remaining properties out of ShaderConfig and delete ShaderConfig * Remove ResourceManager property from TranslatorContext * Move Rewriter passes to separate transform pass files * Fix TransformPasses.RunPass on cases where a node is removed * Move remaining ClipDistancePrimitivesWritten and UsedFeatures updates to decode stage * Reduce excessive parameter passing a bit by using structs more * Remove binding parameter from ShaderProperties methods since it is redundant * Replace decoder instruction checks with switch statement * Put GLSL on the same plan as SPIR-V for input/output declaration * Stop mutating TranslatorContext state when Translate is called * Pass most of the graphics state using a struct instead of individual query methods * Auto-format * Auto-format * Add backend logging interface * Auto-format * Remove unnecessary use of interpolated strings * Remove more modifications of AttributeUsage after decode * PR feedback * gl_Layer is not supported on compute
58 lines
2 KiB
C#
58 lines
2 KiB
C#
using Ryujinx.Graphics.Shader.IntermediateRepresentation;
|
|
using Ryujinx.Graphics.Shader.Translation.Optimizations;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
|
|
using static Ryujinx.Graphics.Shader.IntermediateRepresentation.OperandHelper;
|
|
|
|
namespace Ryujinx.Graphics.Shader.Translation.Transforms
|
|
{
|
|
class SharedAtomicSignedCas : ITransformPass
|
|
{
|
|
public static bool IsEnabled(IGpuAccessor gpuAccessor, ShaderStage stage, TargetLanguage targetLanguage, FeatureFlags usedFeatures)
|
|
{
|
|
return targetLanguage != TargetLanguage.Spirv && stage == ShaderStage.Compute && usedFeatures.HasFlag(FeatureFlags.SharedMemory);
|
|
}
|
|
|
|
public static LinkedListNode<INode> RunPass(TransformContext context, LinkedListNode<INode> node)
|
|
{
|
|
Operation operation = (Operation)node.Value;
|
|
HelperFunctionName name;
|
|
|
|
if (operation.Inst == Instruction.AtomicMaxS32)
|
|
{
|
|
name = HelperFunctionName.SharedAtomicMaxS32;
|
|
}
|
|
else if (operation.Inst == Instruction.AtomicMinS32)
|
|
{
|
|
name = HelperFunctionName.SharedAtomicMinS32;
|
|
}
|
|
else
|
|
{
|
|
return node;
|
|
}
|
|
|
|
if (operation.StorageKind != StorageKind.SharedMemory)
|
|
{
|
|
return node;
|
|
}
|
|
|
|
Operand result = operation.Dest;
|
|
Operand memoryId = operation.GetSource(0);
|
|
Operand byteOffset = operation.GetSource(1);
|
|
Operand value = operation.GetSource(2);
|
|
|
|
Debug.Assert(memoryId.Type == OperandType.Constant);
|
|
|
|
int functionId = context.Hfm.GetOrCreateFunctionId(name, memoryId.Value);
|
|
|
|
Operand[] callArgs = new Operand[] { Const(functionId), byteOffset, value };
|
|
|
|
LinkedListNode<INode> newNode = node.List.AddBefore(node, new Operation(Instruction.Call, 0, result, callArgs));
|
|
|
|
Utils.DeleteNode(node, operation);
|
|
|
|
return newNode;
|
|
}
|
|
}
|
|
}
|