示例#1
0
        public void ReturnsConstant([Range(0, 10)] int input)
        {
            var uInput = (uint)input;

            using (var module = Module.Create("test_constant"))
            {
                var def = module.AddFunction(
                    Type.Int32, "constant", new Type[0], (f, b) =>
                {
                    var value = ConstantInt.Get(Type.Int32, uInput);
                    var ret   = b.CreateRet(value);
                });
                module.Verify();

                Initialize.X86.All();
                using (var engine = ExecutionEngine.CreateMCJITCompilerForModule(module))
                {
                    var func = engine.GetDelegate <Int32Delegate>(def);
                    Assert.AreEqual(input, func());
                }
            }
        }
        static void HandleConstants(GraphBuilder builder, out INode node, out PortMapper portToOffsetMapping,
                                    IConstantNodeModel constantNodeModel)
        {
            portToOffsetMapping = new PortMapper();
            var outputPortId = constantNodeModel.OutputPort?.UniqueId ?? "";

            switch (constantNodeModel)
            {
            case StringConstantModel stringConstantModel:
            {
                var index = builder.StoreStringConstant(stringConstantModel.value ?? string.Empty);
                var cf    = new ConstantString {
                    Value = new StringReference(index, StringReference.Storage.Managed)
                };
                node = MapPort(portToOffsetMapping, outputPortId, Direction.Output, ref cf.ValuePort.Port, cf);
                return;
            }

            case BooleanConstantNodeModel booleanConstantNodeModel:
            {
                var cf = new ConstantBool {
                    Value = booleanConstantNodeModel.value
                };
                node = MapPort(portToOffsetMapping, outputPortId, Direction.Output, ref cf.ValuePort.Port, cf);
                return;
            }

            case IntConstantModel intConstantModel:
            {
                var cf = new ConstantInt {
                    Value = intConstantModel.value
                };
                node = MapPort(portToOffsetMapping, outputPortId, Direction.Output, ref cf.ValuePort.Port, cf);
                return;
            }

            case FloatConstantModel floatConstantModel:
            {
                var cf = new ConstantFloat {
                    Value = floatConstantModel.value
                };
                node = MapPort(portToOffsetMapping, outputPortId, Direction.Output, ref cf.ValuePort.Port, cf);
                return;
            }

            case Vector2ConstantModel vector2ConstantModel:
            {
                var cf = new ConstantFloat2 {
                    Value = vector2ConstantModel.value
                };
                node = MapPort(portToOffsetMapping, outputPortId, Direction.Output, ref cf.ValuePort.Port, cf);
                return;
            }

            case Vector3ConstantModel vector3ConstantModel:
            {
                var cf = new ConstantFloat3 {
                    Value = vector3ConstantModel.value
                };
                node = MapPort(portToOffsetMapping, outputPortId, Direction.Output, ref cf.ValuePort.Port, cf);
                return;
            }

            case Vector4ConstantModel vector4ConstantModel:
            {
                var cf = new ConstantFloat4 {
                    Value = vector4ConstantModel.value
                };
                node = MapPort(portToOffsetMapping, outputPortId, Direction.Output, ref cf.ValuePort.Port, cf);
                return;
            }

            case QuaternionConstantModel quaternionConstantModel:
            {
                var cf = new ConstantQuaternion {
                    Value = quaternionConstantModel.value
                };
                node = MapPort(portToOffsetMapping, outputPortId, Direction.Output, ref cf.ValuePort.Port, cf);
                return;
            }

            case ObjectConstantModel _:
            {
                throw new NotImplementedException(
                          "Conversion and all - either a prefab (might live in a graph) or a scene object (must be injected during runtime bootstrap)");

                // portToOffsetMapping = new Dictionary<IPortModel, uint>();
                // var cf = new ConstantEntity {Value = objectConstantModel.value};
                // MapPort(portToOffsetMapping, objectConstantModel.OutputPort, ref cf.ValuePort.Port, nodeId);
                // node = cf;
                // return;
            }

            default:
                throw new NotImplementedException();
            }
        }
        private void Load(ShaderModel shader)
        {
            ConstantDeclarations = shader.ParseConstantTable();
            foreach (var constantDeclaration in ConstantDeclarations)
            {
                RegisterType registerType;
                switch (constantDeclaration.RegisterSet)
                {
                case RegisterSet.Bool:
                    registerType = RegisterType.ConstBool;
                    break;

                case RegisterSet.Float4:
                    registerType = RegisterType.Const;
                    break;

                case RegisterSet.Int4:
                    registerType = RegisterType.Input;
                    break;

                case RegisterSet.Sampler:
                    registerType = RegisterType.Sampler;
                    break;

                default:
                    throw new InvalidOperationException();
                }
                if (registerType == RegisterType.Sampler)
                {
                    // Use declaration from declaration instruction instead
                    continue;
                }
                for (int r = 0; r < constantDeclaration.RegisterCount; r++)
                {
                    var registerKey         = new RegisterKey(registerType, constantDeclaration.RegisterIndex + r);
                    var registerDeclaration = new RegisterDeclaration(registerKey);
                    _registerDeclarations.Add(registerKey, registerDeclaration);
                }
            }

            foreach (var instruction in shader.Instructions.Where(i => i.HasDestination))
            {
                if (instruction.Opcode == Opcode.Dcl)
                {
                    var         registerDeclaration = new RegisterDeclaration(instruction);
                    RegisterKey registerKey         = registerDeclaration.RegisterKey;

                    _registerDeclarations.Add(registerKey, registerDeclaration);

                    switch (registerKey.Type)
                    {
                    case RegisterType.Input:
                    case RegisterType.MiscType:
                        MethodInputRegisters.Add(registerKey, registerDeclaration);
                        break;

                    case RegisterType.Output:
                    case RegisterType.ColorOut:
                        MethodOutputRegisters.Add(registerKey, registerDeclaration);
                        break;
                    }
                }
                else if (instruction.Opcode == Opcode.Def)
                {
                    var constant = new Constant(
                        instruction.GetParamRegisterNumber(0),
                        instruction.GetParamSingle(1),
                        instruction.GetParamSingle(2),
                        instruction.GetParamSingle(3),
                        instruction.GetParamSingle(4));
                    _constantDefinitions.Add(constant);
                }
                else if (instruction.Opcode == Opcode.DefI)
                {
                    var constantInt = new ConstantInt(instruction.GetParamRegisterNumber(0),
                                                      instruction.Params[1],
                                                      instruction.Params[2],
                                                      instruction.Params[3],
                                                      instruction.Params[4]);
                    _constantIntDefinitions.Add(constantInt);
                }
                else if (shader.Type == ShaderType.Pixel)
                {
                    // Find all assignments to color outputs, because pixel shader outputs are not declared.
                    int          destIndex    = instruction.GetDestinationParamIndex();
                    RegisterType registerType = instruction.GetParamRegisterType(destIndex);
                    if (registerType == RegisterType.ColorOut)
                    {
                        int registerNumber = instruction.GetParamRegisterNumber(destIndex);
                        var registerKey    = new RegisterKey(registerType, registerNumber);
                        if (MethodOutputRegisters.ContainsKey(registerKey) == false)
                        {
                            var reg = new RegisterDeclaration(registerKey);
                            MethodOutputRegisters[registerKey] = reg;
                        }
                    }
                }
            }
        }
示例#4
0
 private static Constant Get <TData>(IntegerType type, params TData[] data) => GetGeneric(type, (x, y) => ConstantInt.Get(x, y), data);
示例#5
0
        public void DocumentNode(SearcherItem searcherItem, INodeModel nodeModel)
        {
            INode node;

            switch (nodeModel)
            {
            case IDotsNodeModel baseDotsNodeModel:
                node = baseDotsNodeModel.Node;
                break;

            case StringConstantModel _:
                node = new ConstantString();
                break;

            case BooleanConstantNodeModel _:
                node = new ConstantBool();
                break;

            case IntConstantModel _:
                node = new ConstantInt();
                break;

            case FloatConstantModel _:
                node = new ConstantFloat();
                break;

            case Vector2ConstantModel _:
                node = new ConstantFloat2();
                break;

            case Vector3ConstantModel _:
                node = new ConstantFloat3();
                break;

            case Vector4ConstantModel _:
                node = new ConstantFloat4();
                break;

            case QuaternionConstantModel _:
                node = new ConstantQuaternion();
                break;

            default:
                return;
            }
            var nodeType      = node.GetType();
            var executionType = GetNodeExecutionType(nodeType, node);
            var title         = Attribute.IsDefined(node.GetType(), typeof(WorkInProgressAttribute))
                ? $"{searcherItem.Name} [WIP]"
                : searcherItem.Name;

            SectionTitle(title, 1);

            var nodeDescription = GetNodeDescription(nodeType, executionType, out string exampleText, out string dataSetup);

            if (!String.IsNullOrEmpty(nodeDescription))
            {
                Paragraph(nodeDescription);
            }

            GetPortsDescription(executionType, node);

            if (exampleText != null)
            {
                SectionTitle("Examples", 2);
                Paragraph(exampleText);
            }

            if (dataSetup != null)
            {
                SectionTitle("Data Setup", 2);
                Paragraph(dataSetup);
            }
        }
示例#6
0
 public void AddCase(ConstantInt onVal, BasicBlock dest) => LLVM.AddCase(this.Unwrap(), onVal.Unwrap(), dest.Unwrap <LLVMBasicBlockRef>());