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
 }