I/O Load/Store Progress

This commit is contained in:
Isaac Marovitz 2023-08-15 17:04:45 +01:00 committed by Isaac Marovitz
commit a3b9c19f5e
3 changed files with 53 additions and 3 deletions

View file

@ -35,10 +35,60 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl.Instructions
case StorageKind.InputPerPatch: case StorageKind.InputPerPatch:
case StorageKind.Output: case StorageKind.Output:
case StorageKind.OutputPerPatch: case StorageKind.OutputPerPatch:
return "I/O load or store"; if (operation.GetSource(srcIndex++) is not AstOperand varId || varId.Type != OperandType.Constant)
{
throw new InvalidOperationException($"First input of {operation.Inst} with {storageKind} storage must be a constant operand.");
}
IoVariable ioVariable = (IoVariable)varId.Value;
bool isOutput = storageKind.IsOutput();
if (context.Definitions.HasPerLocationInputOrOutput(ioVariable, isOutput))
{
if (operation.GetSource(srcIndex++) is not AstOperand vecIndex || vecIndex.Type != OperandType.Constant)
{
throw new InvalidOperationException($"Second input of {operation.Inst} with {storageKind} storage must be a constant operand.");
}
if (operation.SourcesCount > srcIndex &&
operation.GetSource(srcIndex) is AstOperand elemIndex &&
elemIndex.Type == OperandType.Constant &&
context.Definitions.HasPerLocationInputOrOutputComponent(ioVariable, vecIndex.Value, elemIndex.Value, isOutput))
{
srcIndex++;
}
}
(varName, varType) = IoMap.GetMslBuiltIn(ioVariable);
break;
default: default:
throw new InvalidOperationException($"Invalid storage kind {storageKind}."); throw new InvalidOperationException($"Invalid storage kind {storageKind}.");
} }
for (; srcIndex < inputsCount; srcIndex++)
{
IAstNode src = operation.GetSource(srcIndex);
if ((varType & AggregateType.ElementCountMask) != 0 &&
srcIndex == inputsCount - 1 &&
src is AstOperand elementIndex &&
elementIndex.Type == OperandType.Constant)
{
varName += "." + "xyzw"[elementIndex.Value & 3];
}
else
{
varName += $"[{GetSourceExpr(context, src, AggregateType.S32)}]";
}
}
if (isStore)
{
varType &= AggregateType.ElementTypeMask;
varName = $"{varName} = {GetSourceExpr(context, operation.GetSource(srcIndex), varType)}";
}
return varName;
} }
public static string Load(CodeGenContext context, AstOperation operation) public static string Load(CodeGenContext context, AstOperation operation)

View file

@ -5,7 +5,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl.Instructions
{ {
static class IoMap static class IoMap
{ {
public static (string, AggregateType) GetMSLBuiltIn(IoVariable ioVariable) public static (string, AggregateType) GetMslBuiltIn(IoVariable ioVariable)
{ {
return ioVariable switch return ioVariable switch
{ {

View file

@ -118,7 +118,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Msl
} }
} }
(_, AggregateType varType) = IoMap.GetMSLBuiltIn(ioVariable); (_, AggregateType varType) = IoMap.GetMslBuiltIn(ioVariable);
return varType & AggregateType.ElementTypeMask; return varType & AggregateType.ElementTypeMask;
} }