private void ParseAssignmentInstruction(D3D10Instruction instruction) { var newOutputs = new Dictionary <RegisterComponentKey, HlslTreeNode>(); RegisterComponentKey[] destinationKeys = GetDestinationKeys(instruction).ToArray(); foreach (RegisterComponentKey destinationKey in destinationKeys) { HlslTreeNode instructionTree = CreateInstructionTree(instruction, destinationKey); newOutputs[destinationKey] = instructionTree; } foreach (var output in newOutputs) { _activeOutputs[output.Key] = output.Value; } }
private HlslTreeNode CreateInstructionTree(D3D10Instruction instruction, RegisterComponentKey destinationKey) { int componentIndex = destinationKey.ComponentIndex; switch (instruction.Opcode) { case D3D10Opcode.DclInputPS: case D3D10Opcode.DclInputPSSgv: case D3D10Opcode.DclInput: case D3D10Opcode.DclOutput: case D3D10Opcode.DclOutputSgv: { var shaderInput = new RegisterInputNode(destinationKey); return(shaderInput); } case D3D10Opcode.Mov: case D3D10Opcode.Add: case D3D10Opcode.Frc: case D3D10Opcode.Mad: case D3D10Opcode.Max: case D3D10Opcode.Min: case D3D10Opcode.Mul: case D3D10Opcode.Rsq: case D3D10Opcode.SinCos: case D3D10Opcode.Sqrt: { HlslTreeNode[] inputs = GetInputs(instruction, componentIndex); switch (instruction.Opcode) { case D3D10Opcode.Add: return(new AddOperation(inputs[0], inputs[1])); case D3D10Opcode.Mad: return(new MultiplyAddOperation(inputs[0], inputs[1], inputs[2])); case D3D10Opcode.Mov: return(new MoveOperation(inputs[0])); case D3D10Opcode.Mul: return(new MultiplyOperation(inputs[0], inputs[1])); case D3D10Opcode.Rsq: return(new ReciprocalSquareRootOperation(inputs[0])); case D3D10Opcode.Sqrt: return(new SquareRootOperation(inputs[0])); default: throw new NotImplementedException(); } } case D3D10Opcode.Sample: case D3D10Opcode.SampleC: case D3D10Opcode.SampleCLZ: case D3D10Opcode.SampleL: case D3D10Opcode.SampleD: case D3D10Opcode.SampleB: return(CreateTextureLoadOutputNode(instruction, componentIndex)); case D3D10Opcode.Dp2: case D3D10Opcode.Dp3: case D3D10Opcode.Dp4: return(CreateDotProductNode(instruction)); default: throw new NotImplementedException($"{instruction.Opcode} not implemented"); } }
public static void Verify(D3D10Instruction instruction) { // TODO }