示例#1
0
        protected override OpTypeStruct VisitTypeStruct(TypeStruct node)
        {
            var visitTypeStruct = base.VisitTypeStruct(node);

            visitTypeStruct.MemberTypes = new PrintableList <IdRef>(node.Fields.Select(_ => (IdRef)Visit(_.Type)));
            return(Register(visitTypeStruct, _typeInstructions));
        }
示例#2
0
        /*
         * DynamicStruct ConvertDynamic(DynamicObject dyn)
         * {
         *  Type t = dyn.GetType();
         *  DynamicStruct ret = new DynamicStruct();
         *  ret.Type = GetTypeRef(t);
         *  TypeStruct ts = types.GetValue(ret.Type);
         *  ret.MemberValues = new ValueStruct[ts.Members.Length];
         *  int slot = 0;
         *  foreach (var member in ts.Members)
         *  {
         *      string name = strings.GetValue(member);
         *      var p = t.GetProperty(name);
         *      if (p != null)
         *      {
         *          ret.MemberValues[slot] = Convert(p.GetValue(dyn));
         *      }
         *      else
         *          ret.MemberValues[slot] = Convert(t.GetField(name).GetValue(dyn));
         *      slot++;
         *  }
         *  string[] dynnames=dyn.GetDynamicMemberNames().ToArray();
         *  ret.DynamicMembers = new ushort[dynnames.Length];
         *  ret.DynamicMemberValues = new ValueStruct[dynnames.Length];
         *  for(int i=0;i<dynnames.Length;i++)
         *  {
         *      ret.DynamicMembers[i] = GetStringRef(dynnames[i]);
         *
         *      object obj;
         *
         *  }
         *  return ret;
         * }
         */
        ObjectStruct ConvertObject(object dyn)
        {
            Type         t   = dyn.GetType();
            ObjectStruct ret = new ObjectStruct();

            ret.Type = GetTypeRef(t);
            TypeStruct ts = types.GetValue(ret.Type);

            ret.Values = new ValueStruct[ts.Members.Length];
            int slot = 0;

            foreach (var member in ts.Members)
            {
                string name = strings.GetValue(member);
                var    p    = t.GetProperty(name);
                if (p != null)
                {
                    ret.Values[slot] = Convert(p.GetValue(dyn));
                }
                else
                {
                    ret.Values[slot] = Convert(t.GetField(name).GetValue(dyn));
                }
                slot++;
            }
            return(ret);
        }
示例#3
0
        DictionaryStruct ConvertDictionary(object obj)
        {
            DictionaryStruct dict = new DictionaryStruct();
            Type             t    = obj.GetType();

            dict.Type = GetTypeRef(t);

            ICollection  keys    = ((ICollection)t.GetProperty("Keys").GetValue(obj));
            PropertyInfo indexer = t.GetProperty("Item");

            //sometimes the indexer is not named "Item", we need to find it manually in that case
            if (indexer == null)
            {
                foreach (var property in t.GetProperties(BindingFlags.Public | BindingFlags.Instance))
                {
                    if (property.GetIndexParameters().Length == 1)
                    {
                        indexer = property;
                        break;
                    }
                }
            }

            dict.Keys   = new ValueStruct[keys.Count];
            dict.Values = new ValueStruct[keys.Count];

            int i = 0;

            foreach (var key in keys)
            {
                dict.Keys[i]   = Convert(key);
                dict.Values[i] = Convert(indexer.GetValue(obj, new[] { key }));
                i++;
            }


            TypeStruct ts = types.GetValue(dict.Type);

            dict.MemberValues = new ValueStruct[ts.Members.Length];
            int slot = 0;

            foreach (var member in ts.Members)
            {
                string name = strings.GetValue(member);
                var    p    = t.GetProperty(name);
                if (p != null)
                {
                    dict.MemberValues[slot] = Convert(p.GetValue(obj));
                }
                else
                {
                    dict.MemberValues[slot] = Convert(t.GetField(name).GetValue(obj));
                }
                slot++;
            }

            return(dict);
        }
示例#4
0
 void WriteType(TypeStruct type)
 {
     WriteVInt(type.TypeName);
     WriteVInt(type.AssemblyName);
     writer.Write(type.IsValueType);
     WriteVInt((uint)type.Members.Length);
     foreach (var x in type.Members)
     {
         WriteVInt(x);
     }
 }
示例#5
0
        private static TypeStruct BuildStructure(params int[] indices)
        {
            var fields = indices.Select(index => new TypeStructureField(WellKnownTypes[index].Type,
                                                                        WellKnownTypes[index].Name)).ToArray();
            var structure           = new TypeStruct("testStruct", fields);
            var spirvStructureField = new TypeStructureField(structure,
                                                             string.Join("_", structure.Fields.Select(_ => _.Name)));
            var endMarker   = new TypeStructureField(SpirvTypeBase.Float, "endMarker");
            var modelStruct = new TypeStruct("test_" + spirvStructureField.Name, marker,
                                             spirvStructureField, endMarker);

            return(modelStruct);
        }
示例#6
0
 private void CompareStructureLayout(TypeStruct expected, TypeStruct actual)
 {
     Assert.AreEqual(expected.Fields.Count, actual.Fields.Count);
     for (var index = 0; index < expected.Fields.Count; index++)
     {
         var actualField   = actual.Fields[index];
         var expectedField = expected.Fields[index];
         Assert.AreEqual(expectedField.ByteOffset, actualField.ByteOffset);
         if (expectedField.Type.TypeCategory == SpirvTypeCategory.Struct)
         {
             CompareStructureLayout((TypeStruct)expectedField.Type, (TypeStruct)actualField.Type);
         }
     }
 }
示例#7
0
        TypeStruct ReadTypeStruct()
        {
            TypeStruct t = new TypeStruct();

            t.TypeName     = (uint)ReadVInt();
            t.AssemblyName = (uint)ReadVInt();
            t.IsValueType  = reader.ReadBoolean();
            t.Members      = new uint[(int)ReadVInt()];
            for (int i = 0; i < t.Members.Length; i++)
            {
                t.Members[i] = (uint)ReadVInt();
            }
            return(t);
        }
示例#8
0
        void WriteArray(ArrayStruct array)
        {
            TypeStruct ts = types.GetValue(array.ElementType);

            writer.Write((byte)array.NativeElementType);
            WriteVInt(array.ElementType);
            WriteVInt((uint)array.Values.Length);
            bool b = !TypeMarkerUtil.IsFinal(array.NativeElementType);

            foreach (var x in array.Values)
            {
                WriteValue(x, b);
            }
        }
        protected virtual void WriteStruct(TypeStruct structure)
        {
            var fields = structure.Fields;

            WriteLine("[StructLayout(LayoutKind.Explicit)]");
            WriteLine("public partial struct " + structure.DebugName);
            WriteLine("{");
            for (var memberIndex = 0; memberIndex < fields.Count; memberIndex++)
            {
                var field = fields[memberIndex];
                WriteStructField(field.Name, field.ByteOffset.Value, field.Type);
                if (memberIndex != fields.Count - 1)
                {
                    WriteLine();
                }
            }
            WriteLine("}");
        }
示例#10
0
        private (Shader, Veldrid.Shader[]) CompileShaderForFieldSet(TypeStruct fieldSet)
        {
            var vertexShaderText = new VertexShaderTemplate(fieldSet).TransformText();

            var(vertexBytes, shaderInstructions) = CompileToBytecode(vertexShaderText);
            var fragmentShaderText = new FragmentShaderTemplate().TransformText();
            var fragment           = SpirvCompilation.CompileGlslToSpirv(fragmentShaderText, "fragment.glsl",
                                                                         ShaderStages.Fragment, new GlslCompileOptions {
                Debug = true
            });
            var shaders = ResourceFactory.CreateFromSpirv(
                new ShaderDescription(ShaderStages.Vertex, vertexBytes, "main"),
                new ShaderDescription(ShaderStages.Fragment, fragment.SpirvBytes, "main"));

            foreach (var shader in shaders)
            {
                Disposables.Add(shader);
            }
            return(shaderInstructions, shaders);
        }
示例#11
0
        uint GetTypeRef(Type t)
        {
            TypeStruct ts = new TypeStruct();

            ts.AssemblyName = GetStringRef(t.Assembly.FullName);
            ts.TypeName     = GetStringRef(t.FullName);
            ts.IsValueType  = t.IsValueType;
            int           id    = types.GetReferenceIdIfAvailable(ts);
            List <string> names = new List <string>();

            if (id < 0)
            {
                foreach (var pi in t.GetProperties(BindingFlags.Instance | BindingFlags.Public))
                {
                    if (pi.CanRead && pi.CanWrite && !pi.IsDefined(typeof(NonSerializedAttribute)) && pi.GetIndexParameters().Length == 0)
                    {
                        names.Add(pi.Name);
                    }
                }
                foreach (var fi in t.GetFields(BindingFlags.Instance | BindingFlags.Public))
                {
                    if (!fi.IsInitOnly && !fi.IsNotSerialized && !fi.IsPinvokeImpl && !fi.IsLiteral)
                    {
                        names.Add(fi.Name);
                    }
                }
                ts.Members = new uint[names.Count];
                for (int i = 0; i < names.Count; i++)
                {
                    ts.Members[i] = GetStringRef(names[i]);
                }
                id = types.GetReferenceId(ts);
            }
            checked
            {
                return((uint)id);
            }
        }
示例#12
0
        object ReadObject()
        {
            int        typeref = (int)ReadVInt();
            TypeStruct ts      = typeStructs[typeref];
            Type       t       = types[typeref];

            object obj = Activator.CreateInstance(t);

            foreach (var x in ts.Members)
            {
                var name = strings[(int)x];
                var prop = t.GetProperty(name, BindingFlags.Public | BindingFlags.Instance);
                if (prop != null)
                {
                    prop.SetValue(obj, ReadValue());
                }
                else
                {
                    t.GetField(name, BindingFlags.Public | BindingFlags.Instance).SetValue(obj, ReadValue());
                }
            }
            return(obj);
        }
示例#13
0
        ListStruct ConvertList(IEnumerable obj)
        {
            Type          t        = obj.GetType();
            List <object> elements = obj.Cast <object>().ToList();
            ListStruct    list     = new ListStruct();

            list.Type        = GetTypeRef(t);
            list.ElementType = GetTypeMarker(obj);
            list.Values      = new ValueStruct[elements.Count];
            for (int i = 0; i < elements.Count; i++)
            {
                list.Values[i] = Convert(elements[i]);
            }


            TypeStruct ts = types.GetValue(list.Type);

            list.MemberValues = new ValueStruct[ts.Members.Length];
            int slot = 0;

            foreach (var member in ts.Members)
            {
                string name = strings.GetValue(member);
                var    p    = t.GetProperty(name);
                if (p != null)
                {
                    list.MemberValues[slot] = Convert(p.GetValue(obj));
                }
                else
                {
                    list.MemberValues[slot] = Convert(t.GetField(name).GetValue(obj));
                }
                slot++;
            }

            return(list);
        }
示例#14
0
        internal object Read()
        {
            byte[] magic = reader.ReadBytes(4);
            for (int i = 0; i < magic.Length; i++)
            {
                if (magic[i] != CbfConstants.MagicNumber[i])
                {
                    throw new NotSupportedException("File format not supported.");
                }
            }
            byte version = reader.ReadByte();

            if (version != CbfConstants.Version)
            {
                throw new NotSupportedException("File version <" + version + "> is not supported. (Supported version: " + CbfConstants.Version + ")");
            }

            PoolFlags flags = (PoolFlags)reader.ReadByte();

            bool hasStrings, hasFloats, hasDoubles, hasDecimals, hasDates, hasTypes;

            hasStrings  = flags.HasFlag(PoolFlags.HasStrings);
            hasFloats   = flags.HasFlag(PoolFlags.HasFloats);
            hasDoubles  = flags.HasFlag(PoolFlags.HasDoubles);
            hasDecimals = flags.HasFlag(PoolFlags.HasDecimals);
            hasDates    = flags.HasFlag(PoolFlags.HasDates);
            hasTypes    = flags.HasFlag(PoolFlags.HasTypes);

            if (hasStrings)
            {
                strings = new List <string>((int)ReadVInt());
            }
            if (hasFloats)
            {
                floats = new List <float>((int)ReadVInt());
            }
            if (hasDoubles)
            {
                doubles = new List <double>((int)ReadVInt());
            }
            if (hasDecimals)
            {
                decimals = new List <decimal>((int)ReadVInt());
            }
            if (hasDates)
            {
                dates = new List <DateTime>((int)ReadVInt());
            }
            if (hasTypes)
            {
                int typelen = (int)ReadVInt();
                typeStructs = new List <TypeStruct>(typelen);
                types       = new List <Type>(typelen);
            }

            if (hasStrings)
            {
                for (int i = 0; i < strings.Capacity; i++)
                {
                    strings.Add(ReadString());
                }
            }
            if (hasFloats)
            {
                for (int i = 0; i < floats.Capacity; i++)
                {
                    floats.Add(reader.ReadSingle());
                }
            }
            if (hasDoubles)
            {
                for (int i = 0; i < doubles.Capacity; i++)
                {
                    doubles.Add(reader.ReadDouble());
                }
            }
            if (hasDecimals)
            {
                for (int i = 0; i < decimals.Capacity; i++)
                {
                    decimals.Add(reader.ReadDecimal());
                }
            }
            if (hasDates)
            {
                for (int i = 0; i < dates.Capacity; i++)
                {
                    dates.Add(new DateTime(ReadVSInt()));
                }
            }
            if (hasTypes)
            {
                for (int i = 0; i < types.Capacity; i++)
                {
                    TypeStruct t = ReadTypeStruct();
                    typeStructs.Add(t);
                    types.Add(GetTypeByName(strings[(int)t.TypeName], strings[(int)t.AssemblyName]));
                }
            }
            return(ReadValue());
        }
示例#15
0
    /// <summary>
    /// Разделяет строку на массив переменных, определённых структорой TypeStruct
    /// </summary>
    /// <param name="type">Строка, содержащая код блока VAR</param>
    /// <returns>Массив переменных</returns>
    private TypeStruct[] GetTypeStructFromField(string var)
    {
        TypeStruct[] vars = new TypeStruct[0];

        int dp = 0, i = 1, var_declarate = 0;
        bool is_name = true,
            is_type = false;
        string name = var[0].ToString(), type = "";

        while (i < var.Length)
        {
            if (var[i] == ':')
                dp++;
            else if (var[i] == ';')
                dp--;

            if (dp == 0 && char.IsLetter(var[i]) && var[i - 1] == ' ')
                is_name = true;
            else if (dp == 1 && var[i - 1] == ':')
                is_type = true;
            else if (dp == 1 && var[i] == ':')
            {
                is_name = false;
                string[] names = name.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
                var_declarate = names.Length;
                Array.Resize(ref vars, vars.Length + var_declarate);
                for (int j = 0; j < var_declarate; j++)
                {
                    vars[vars.Length - var_declarate + j] = new TypeStruct();
                    vars[vars.Length - var_declarate + j].name = names[j].Trim();
                }
                name = "";
            }
            else if (dp == 0 && var[i] == ';')
            {
                is_type = false;
                for (int j = 0; j < var_declarate; j++)
                    vars[vars.Length - var_declarate + j].type = type.Trim();
                type = "";
            }

            if (is_name)
                name += var[i];
            if (is_type)
                type += var[i];

            i++;
        }

        return vars;
    }
示例#16
0
 public static TypeStruct Of(int structIndex)
 {
     var st = new TypeStruct();
     st.structIndex = structIndex;
     return st;
 }
        public void GreenQuadReflectionTest()
        {
            byte[] vertexByteCode;
            byte[] framentByteCode;
            {
                var const_1f = new Constant(-1.0f);
                var const1f  = new Constant(1.0f);
                var const0f  = new Constant(0.0f);
                var const0i  = new Constant(0);

                var arrayType = new TypeArray(SpirvTypeBase.Vec4, 4);
                var a         = new ConstantComposite(SpirvTypeBase.Vec4, const_1f, const1f, const0f, const1f);
                var b         = new ConstantComposite(SpirvTypeBase.Vec4, const1f, const1f, const1f, const1f);
                var c         = new ConstantComposite(SpirvTypeBase.Vec4, const_1f, const_1f, const0f, const1f);
                var d         = new ConstantComposite(SpirvTypeBase.Vec4, const1f, const_1f, const1f, const1f);
                var positions = new ConstantComposite(arrayType, a, b, c, d);

                var clipArrayType = new TypeArray(SpirvTypeBase.Float, 1);
                var gl_PerVertex  = new TypeStruct("gl_PerVertex",
                                                   new TypeStructureField(SpirvTypeBase.Vec4, "gl_Position")
                                                   .WithDecoration(Decoration.BuiltIn(BuiltIn.Position())),
                                                   new TypeStructureField(SpirvTypeBase.Float, "gl_PointSize")
                                                   .WithDecoration(Decoration.BuiltIn(BuiltIn.PointSize())),
                                                   new TypeStructureField(clipArrayType, "gl_ClipDistance")
                                                   .WithDecoration(Decoration.BuiltIn(BuiltIn.ClipDistance())),
                                                   new TypeStructureField(clipArrayType, "gl_CullDistance")
                                                   .WithDecoration(Decoration.BuiltIn(BuiltIn.CullDistance()))
                                                   ).WithDecoration(Decoration.Block());
                var outputVar = new Variable(gl_PerVertex.MakePointer(StorageClass.Output()), StorageClass.Output(), null, "");

                var localVar = new Variable(
                    arrayType.MakePointer(StorageClass.Function()),
                    StorageClass.Function(), null, "indexable");
                Node positionPointer = new AccessChain(SpirvTypeBase.Vec4.MakePointer(StorageClass.Output()), outputVar, new[] { const0i });
                var  glVertexIndex   = Variable.gl_VertexIndex();
                Node position        = new Load(SpirvTypeBase.Vec4,
                                                new AccessChain(SpirvTypeBase.Vec4.MakePointer(StorageClass.Function()), localVar, new Node[]
                {
                    new Load(SpirvTypeBase.Int, glVertexIndex, null)
                }), null);
                var vertexShaderMain = new Function(Spv.FunctionControl.Enumerant.None, new TypeFunction()
                {
                    ReturnType = SpirvTypeBase.Void
                }, "main")
                                       .SetUp(_ => _
                                              .ThenLabel()
                                              .ThenStore(localVar, positions, null)
                                              .ThenStore(positionPointer, position, null)
                                              .ThenReturn()
                                              );
                var reflection = new ShaderReflection()
                                 .WithCapability(Capability.Shader())
                                 .WithExtInstImport("GLSL.std.450")
                                 .WithMemoryModel(AddressingModel.Logical(), MemoryModel.GLSL450())
                                 .WithEntryPoint(ExecutionModel.Vertex(), vertexShaderMain, "main");
                var shader = reflection
                             .BuildShader();

                vertexByteCode = shader.Build();

                Console.WriteLine("-----------------------");
                Node node = reflection.EntryPointInstructions.First().Value;
                while (node != null)
                {
                    Console.WriteLine($".Then(new {node})");
                    node = node.GetNext();
                }
                //var vertexSource = @"#version 450
                //#extension GL_KHR_vulkan_glsl : enable

                //const vec4 QuadInfos[4] =
                //{
                //    vec4(-1, 1, 0, 1),
                //    vec4(1, 1, 1, 1),
                //    vec4(-1, -1, 0, 1),
                //    vec4(1, -1, 1, 1),
                //};

                //void main()
                //{
                //    gl_Position = QuadInfos[gl_VertexIndex];
                //}";
                //vertexByteCode = ShaderTestBase.CompileToBytecode(vertexSource, ShaderStages.Vertex, true, true);
            }
            {
                var const0f  = new Constant(0.0f);
                var const1f  = new Constant(1.0f);
                var redColor = new ConstantComposite(SpirvTypeBase.Vec4, const0f, const1f, const0f, const1f);
                var v        = new Variable(SpirvTypeBase.Vec4.MakePointer(StorageClass.Output()), StorageClass.Output(), null, "fsout_Color0")
                {
                    Location = 0
                };
                var fragmentShaderMain = new Function(Spv.FunctionControl.Enumerant.None, new TypeFunction(SpirvTypeBase.Void), "main")
                                         .SetUp(_ => _
                                                .ThenLabel()
                                                .ThenStore(v, redColor, null)
                                                .ThenReturn()
                                                );

                var reflection = new ShaderReflection()
                                 .WithCapability(Capability.Shader())
                                 .WithExtInstImport("GLSL.std.450")
                                 .WithMemoryModel(AddressingModel.Logical(), MemoryModel.GLSL450())
                                 .WithEntryPoint(ExecutionModel.Fragment(), fragmentShaderMain, "main")
                                 .WithExecutionMode(fragmentShaderMain, ExecutionMode.OriginUpperLeft());

                var shader = reflection
                             .BuildShader();

                framentByteCode = shader
                                  .Build();

                Console.WriteLine("-----------------------");
                Node node = reflection.EntryPointInstructions.First().Value;
                while (node != null)
                {
                    Console.WriteLine($".Then(new {node})");
                    node = node.GetNext();
                }

                //    var fragmentSource = @"#version 450

                //layout(location = 0) out vec4 fsout_Color0;

                //void main()
                //{
                //    fsout_Color0 = vec4(0,1,0,1);
                //}";
                //    framentByteCode = ShaderTestBase.CompileToBytecode(fragmentSource, ShaderStages.Fragment, true, true);
            }

            {
                var glsl = Veldrid.SPIRV.SpirvCompilation.CompileVertexFragment(vertexByteCode, framentByteCode,
                                                                                CrossCompileTarget.GLSL);
                Console.WriteLine(glsl.VertexShader);
                Console.WriteLine(glsl.FragmentShader);
            }

            var shaders = ResourceFactory.CreateFromSpirv(
                new ShaderDescription(ShaderStages.Vertex, vertexByteCode, "main"),
                new ShaderDescription(ShaderStages.Fragment, framentByteCode, "main"));

            var readRenderTargetPixel = RenderQuad(shaders);

            Assert.AreEqual(new RgbaByte(0, 255, 0, 255), readRenderTargetPixel);
        }
示例#18
0
    /// <summary>
    /// Приводит дерево к типу TypeStruct
    /// </summary>
    /// <param name="root">Корневой элемент</param>
    /// <param name="root_name">Имя родителя</param>
    /// <returns></returns>
    private TypeStruct[] GetTypesStruct(Tree root, string root_name)
    {
        if (root_name != "type" && root_name != "var" && root_name != "const")
            return null;

        if (root == null)
            return null;

        Tree start_cursor = GetElementCursor(root, root_name);

        if (start_cursor == null)
            return null;

        if (!start_cursor.HasChild())
            return null;

        TypeStruct[] types = new TypeStruct[start_cursor.GetChildCount()];

        for (int i = 0; i < types.Length; i++)
        {
            Tree cursor = start_cursor.GetChildById(i);
            string type_str = cursor.command;
            if (cursor.HasChild())
                cursor = cursor.GetChildById(0);
            while (cursor.parent.command != root_name)
            {
                cursor.enters_count++;
                if (cursor.enters_count == 1)
                    type_str += " " + cursor.command;
                else if (cursor.type == "record")
                    type_str += " end;";
                if (cursor.HasChild() && cursor.enters_count == 1)
                    cursor = cursor.GetChildById(0);
                else if (cursor.next == null)
                    cursor = cursor.parent;
                else
                    cursor = cursor.next;
            }

            if (cursor.type == "record")
                type_str += " end;";

            int j = 0;
            if (root_name == "type" || root_name == "const")
                while (type_str[j] != '=')
                    j++;
            else if (root_name == "var")
                while (type_str[j] != ':')
                    j++;
            while (type_str.EndsWith(";"))
                type_str = type_str.Remove(type_str.Length - 1);

            string[] replace = new string[] { "\t", "\n", "\r" };
            for (int k = 0; k < replace.Length; k++)
                type_str = type_str.Replace(replace[k], " ");
            while (type_str.IndexOf("  ") > -1)
                type_str = type_str.Replace("  ", " ");

            types[i] = new TypeStruct();
            types[i].name = type_str.Remove(j).Trim();
            types[i].type = type_str.Remove(0, j + 1).Trim();
        }

        return types;
    }
示例#19
0
        public void TestPermutation(TypeStruct fieldSet)
        {
            var(shaderInstructions, shaders) = CompileShaderForFieldSet(fieldSet);
            var shaderReflection = new ShaderReflection(shaderInstructions);
            var structure        = shaderReflection.Structures.Where(_ => _.DebugName == fieldSet.DebugName).First();

            CompareStructureLayout(structure, fieldSet);

            var bufferSize = structure.SizeInBytes;

            bufferSize = SpirvUtils.RoundUp(bufferSize, 16);
            var buffer = ResourceFactory.CreateBuffer(new BufferDescription(bufferSize, BufferUsage.UniformBuffer));

            Disposables.Add(buffer);

            var bytes   = new byte[bufferSize];
            var counter = 1;
            var hash    = 0;

            PopulateBuffer(bytes, 0, structure, ref counter, ref hash);
            GraphicsDevice.UpdateBuffer(buffer, 0, bytes);

            //structure.EvaluateLayout();

            //var hlsl = SpirvCompilation.CompileVertexFragment(vertex.SpirvBytes, fragment.SpirvBytes, CrossCompileTarget.HLSL, new CrossCompileOptions());
            //var glsl = SpirvCompilation.CompileVertexFragment(vertex.SpirvBytes, fragment.SpirvBytes, CrossCompileTarget.GLSL, new CrossCompileOptions());
            //var msl = SpirvCompilation.CompileVertexFragment(vertex.SpirvBytes, fragment.SpirvBytes, CrossCompileTarget.MSL, new CrossCompileOptions());
            //var essl = SpirvCompilation.CompileVertexFragment(vertex.SpirvBytes, fragment.SpirvBytes, CrossCompileTarget.ESSL, new CrossCompileOptions());


            var layout = ResourceFactory.CreateResourceLayout(new ResourceLayoutDescription(
                                                                  new ResourceLayoutElementDescription("ModelBuffer", ResourceKind.UniformBuffer, ShaderStages.Vertex)));

            Disposables.Add(layout);

            var resourceSet = ResourceFactory.CreateResourceSet(new ResourceSetDescription(layout, buffer));

            Disposables.Add(resourceSet);

            var pd = new GraphicsPipelineDescription(
                BlendStateDescription.SingleOverrideBlend,
                DepthStencilStateDescription.Disabled,
                RasterizerStateDescription.Default,
                PrimitiveTopology.PointList,
                new ShaderSetDescription(new[] { new VertexLayoutDescription(new VertexElementDescription[] { }) },
                                         shaders),
                new[] { layout },
                Framebuffer.OutputDescription);
            var pipeline = ResourceFactory.CreateGraphicsPipeline(pd);

            Disposables.Add(pipeline);

            CommandList.Begin();
            CommandList.SetFramebuffer(Framebuffer);
            CommandList.SetPipeline(pipeline);
            CommandList.SetGraphicsResourceSet(0, resourceSet);
            CommandList.Draw(1);
            CommandList.End();

            GraphicsDevice.SubmitCommands(CommandList);
            GraphicsDevice.WaitForIdle();

            var expected = new RgbaByte((byte)(hash % 256), (byte)(hash / 256 % 256), (byte)(hash / 65536 % 256),
                                        (byte)(hash / 16777216 % 256));
            var actual = ReadRenderTargetPixel();

            Assert.AreEqual(expected, actual);
        }
示例#20
0
 public VertexShaderTemplate(TypeStruct fields)
 {
     _fields = fields;
 }
示例#21
0
文件: struct.cs 项目: hlorenzi/trapl
 public static TypeStruct Of(int structIndex)
 {
     var st = new TypeStruct();
     st.structIndex = structIndex;
     return st;
 }