aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Shader/StructuredIr/StructuredProgram.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics/Shader/StructuredIr/StructuredProgram.cs')
-rw-r--r--Ryujinx.Graphics/Shader/StructuredIr/StructuredProgram.cs254
1 files changed, 0 insertions, 254 deletions
diff --git a/Ryujinx.Graphics/Shader/StructuredIr/StructuredProgram.cs b/Ryujinx.Graphics/Shader/StructuredIr/StructuredProgram.cs
deleted file mode 100644
index 26faaf36..00000000
--- a/Ryujinx.Graphics/Shader/StructuredIr/StructuredProgram.cs
+++ /dev/null
@@ -1,254 +0,0 @@
-using Ryujinx.Graphics.Shader.IntermediateRepresentation;
-using System;
-using System.Collections.Generic;
-
-namespace Ryujinx.Graphics.Shader.StructuredIr
-{
- static class StructuredProgram
- {
- public static StructuredProgramInfo MakeStructuredProgram(BasicBlock[] blocks)
- {
- PhiFunctions.Remove(blocks);
-
- StructuredProgramContext context = new StructuredProgramContext(blocks.Length);
-
- for (int blkIndex = 0; blkIndex < blocks.Length; blkIndex++)
- {
- BasicBlock block = blocks[blkIndex];
-
- context.EnterBlock(block);
-
- foreach (INode node in block.Operations)
- {
- Operation operation = (Operation)node;
-
- if (IsBranchInst(operation.Inst))
- {
- context.LeaveBlock(block, operation);
- }
- else
- {
- AddOperation(context, operation);
- }
- }
- }
-
- GotoElimination.Eliminate(context.GetGotos());
-
- AstOptimizer.Optimize(context.Info);
-
- return context.Info;
- }
-
- private static void AddOperation(StructuredProgramContext context, Operation operation)
- {
- Instruction inst = operation.Inst;
-
- IAstNode[] sources = new IAstNode[operation.SourcesCount];
-
- for (int index = 0; index < sources.Length; index++)
- {
- sources[index] = context.GetOperandUse(operation.GetSource(index));
- }
-
- if (operation.Dest != null)
- {
- AstOperand dest = context.GetOperandDef(operation.Dest);
-
- if (inst == Instruction.LoadConstant)
- {
- Operand ldcSource = operation.GetSource(0);
-
- if (ldcSource.Type != OperandType.Constant)
- {
- throw new InvalidOperationException("Found LDC with non-constant constant buffer slot.");
- }
-
- context.Info.CBuffers.Add(ldcSource.Value);
- }
-
- AstAssignment assignment;
-
- // If all the sources are bool, it's better to use short-circuiting
- // logical operations, rather than forcing a cast to int and doing
- // a bitwise operation with the value, as it is likely to be used as
- // a bool in the end.
- if (IsBitwiseInst(inst) && AreAllSourceTypesEqual(sources, VariableType.Bool))
- {
- inst = GetLogicalFromBitwiseInst(inst);
- }
-
- bool isCondSel = inst == Instruction.ConditionalSelect;
- bool isCopy = inst == Instruction.Copy;
-
- if (isCondSel || isCopy)
- {
- VariableType type = GetVarTypeFromUses(operation.Dest);
-
- if (isCondSel && type == VariableType.F32)
- {
- inst |= Instruction.FP;
- }
-
- dest.VarType = type;
- }
- else
- {
- dest.VarType = InstructionInfo.GetDestVarType(inst);
- }
-
- int componentMask = 1 << operation.ComponentIndex;
-
- IAstNode source;
-
- if (operation is TextureOperation texOp)
- {
- AstTextureOperation astTexOp = new AstTextureOperation(
- inst,
- texOp.Type,
- texOp.Flags,
- texOp.Handle,
- componentMask,
- sources);
-
- context.Info.Samplers.Add(astTexOp);
-
- source = astTexOp;
- }
- else if (!isCopy)
- {
- source = new AstOperation(inst, componentMask, sources);
- }
- else
- {
- source = sources[0];
- }
-
- assignment = new AstAssignment(dest, source);
-
- context.AddNode(assignment);
- }
- else
- {
- context.AddNode(new AstOperation(inst, sources));
- }
- }
-
- private static VariableType GetVarTypeFromUses(Operand dest)
- {
- HashSet<Operand> visited = new HashSet<Operand>();
-
- Queue<Operand> pending = new Queue<Operand>();
-
- bool Enqueue(Operand operand)
- {
- if (visited.Add(operand))
- {
- pending.Enqueue(operand);
-
- return true;
- }
-
- return false;
- }
-
- Enqueue(dest);
-
- while (pending.TryDequeue(out Operand operand))
- {
- foreach (INode useNode in operand.UseOps)
- {
- if (!(useNode is Operation operation))
- {
- continue;
- }
-
- if (operation.Inst == Instruction.Copy)
- {
- if (operation.Dest.Type == OperandType.LocalVariable)
- {
- if (Enqueue(operation.Dest))
- {
- break;
- }
- }
- else
- {
- return OperandInfo.GetVarType(operation.Dest.Type);
- }
- }
- else
- {
- for (int index = 0; index < operation.SourcesCount; index++)
- {
- if (operation.GetSource(index) == operand)
- {
- return InstructionInfo.GetSrcVarType(operation.Inst, index);
- }
- }
- }
- }
- }
-
- return VariableType.S32;
- }
-
- private static bool AreAllSourceTypesEqual(IAstNode[] sources, VariableType type)
- {
- foreach (IAstNode node in sources)
- {
- if (!(node is AstOperand operand))
- {
- return false;
- }
-
- if (operand.VarType != type)
- {
- return false;
- }
- }
-
- return true;
- }
-
- private static bool IsBranchInst(Instruction inst)
- {
- switch (inst)
- {
- case Instruction.Branch:
- case Instruction.BranchIfFalse:
- case Instruction.BranchIfTrue:
- return true;
- }
-
- return false;
- }
-
- private static bool IsBitwiseInst(Instruction inst)
- {
- switch (inst)
- {
- case Instruction.BitwiseAnd:
- case Instruction.BitwiseExclusiveOr:
- case Instruction.BitwiseNot:
- case Instruction.BitwiseOr:
- return true;
- }
-
- return false;
- }
-
- private static Instruction GetLogicalFromBitwiseInst(Instruction inst)
- {
- switch (inst)
- {
- case Instruction.BitwiseAnd: return Instruction.LogicalAnd;
- case Instruction.BitwiseExclusiveOr: return Instruction.LogicalExclusiveOr;
- case Instruction.BitwiseNot: return Instruction.LogicalNot;
- case Instruction.BitwiseOr: return Instruction.LogicalOr;
- }
-
- throw new ArgumentException($"Unexpected instruction \"{inst}\".");
- }
- }
-} \ No newline at end of file