Example #1
0
        /// <summary>
        /// The create string literal ast.
        /// </summary>
        /// <param name="context">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateStringLiteralAst(ParsingContext context, ParseTreeNode node)
        {
            var value = Ast <Literal>(node);

            value.SubLiterals = new List <Literal>();

            //// string_literal.Rule =
            //// string_literal_raw.List();
            var text      = new StringBuilder();
            var textValue = new StringBuilder();

            foreach (var childNode in node.ChildNodes[0].ChildNodes)
            {
                var subLiteral = new Literal
                {
                    Span  = SpanConverter.Convert(childNode.Span),
                    Value = childNode.AstNode,
                    Text  = childNode.Token.Text
                };
                value.SubLiterals.Add(subLiteral);
                textValue.Append(subLiteral.Value);
            }

            text.Append("\"").Append(textValue).Append("\"");

            value.Value = textValue.ToString();
            value.Text  = text.ToString();
        }
        /// <summary>
        /// The create expression statement ast.
        /// </summary>
        /// <param name="context">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateExpressionStatementAst(ParsingContext context, ParseTreeNode node)
        {
            //// expression_statement.Rule =
            //// empty_statement
            //// | expression + ";";
            if (node.ChildNodes[0].AstNode is EmptyStatement)
            {
                node.AstNode = node.ChildNodes[0].AstNode;
                return;
            }

            var expressionStatement = Ast <ExpressionStatement>(node);

            if (node.ChildNodes[0].AstNode is Expression)
            {
                // Standard expression statement
                expressionStatement.Expression = (Expression)node.ChildNodes[0].AstNode;
            }
            else
            {
                // Expression statement like "break;" "continue;" "discard;"
                // Standard expression statement
                CreateIdentifierAst(context, node.ChildNodes[0]);
                expressionStatement.Expression = new KeywordExpression((Identifier)node.ChildNodes[0].AstNode)
                {
                    Span = SpanConverter.Convert(node.Span)
                };
            }
        }
Example #3
0
 /// <summary>
 /// The create pack offset ast.
 /// </summary>
 /// <param name="context">
 /// </param>
 /// <param name="node">
 /// </param>
 protected static void CreatePackOffsetAst(ParsingContext context, ParseTreeNode node)
 {
     ////             [0]       [1]       [2]      [3]
     // _(":") + "packoffset" + "(" + identifier + ")";
     node.AstNode = new PackOffset()
     {
         Value = (Identifier)node.ChildNodes[2].AstNode, Span = SpanConverter.Convert(node.Span)
     };
 }
Example #4
0
 /// <summary>
 /// The create semantic ast.
 /// </summary>
 /// <param name="context">
 /// </param>
 /// <param name="node">
 /// </param>
 protected static void CreateSemanticAst(ParsingContext context, ParseTreeNode node)
 {
     ////       [0]
     // ":" + identifier
     node.AstNode = new Semantic()
     {
         Name = (Identifier)node.ChildNodes[0].AstNode, Span = SpanConverter.Convert(node.Span)
     };
 }
        /// <summary>
        /// The create statement ast.
        /// </summary>
        /// <param name="context">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateStatementAst(ParsingContext context, ParseTreeNode node)
        {
            // statement.Rule =
            // attribute_list_opt + statement_raw;
            var value = (Statement)node.ChildNodes[1].AstNode;

            node.AstNode     = value;
            value.Span       = SpanConverter.Convert(node.Span);
            value.Attributes = (List <AttributeBase>)node.ChildNodes[0].AstNode;
        }
Example #6
0
        public void Render(Camera camera)
        {
            if (Surface.Resolution.X != depthBuffer.Description.Width || Surface.Resolution.Y != depthBuffer.Description.Height)
            {
                OnResize();
            }
            var context = Surface.Context;

            Shapes.MeshCache.FlushPendingUploads(context);

            context.Rasterizer.SetViewport(0, 0, Surface.Resolution.X, Surface.Resolution.Y, 0.0f, 1.0f);

            //Note reversed depth.
            context.ClearDepthStencilView(dsv, DepthStencilClearFlags.Depth, 0, 0);
            context.ClearRenderTargetView(rtv, new SharpDX.Mathematics.Interop.RawColor4());
            context.OutputMerger.SetRenderTargets(dsv, rtv);
            context.Rasterizer.State = rasterizerState;
            context.OutputMerger.SetDepthStencilState(opaqueDepthState);

            //All ray traced shapes use analytic coverage writes to get antialiasing.
            context.OutputMerger.SetBlendState(a2cBlendState);
            SphereRenderer.Render(context, camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.spheres.Span), 0, Shapes.spheres.Count);
            CapsuleRenderer.Render(context, camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.capsules.Span), 0, Shapes.capsules.Count);
            CylinderRenderer.Render(context, camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.cylinders.Span), 0, Shapes.cylinders.Count);

            //Non-raytraced shapes just use regular opaque rendering.
            context.OutputMerger.SetBlendState(opaqueBlendState);
            BoxRenderer.Render(context, camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.boxes.Span), 0, Shapes.boxes.Count);
            TriangleRenderer.Render(context, camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.triangles.Span), 0, Shapes.triangles.Count);
            MeshRenderer.Render(context, camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.meshes.Span), 0, Shapes.meshes.Count);
            LineRenderer.Render(context, camera, Surface.Resolution, SpanConverter.AsSpan(Lines.lines.Span), 0, Lines.lines.Count);

            Background.Render(context, camera);

            //Resolve MSAA rendering down to a single sample buffer for screenspace work.
            //Note that we're not bothering to properly handle tonemapping during the resolve. That's going to hurt quality a little, but the demos don't make use of very wide ranges.
            //(If for some reason you end up expanding the demos to make use of wider HDR, you can make this a custom resolve pretty easily.)
            context.ResolveSubresource(colorBuffer, 0, resolvedColorBuffer, 0, Format.R16G16B16A16_Float);
            context.OutputMerger.SetRenderTargets(resolvedRTV);

            //Glyph and screenspace line drawing rely on the same premultiplied alpha blending transparency. We'll handle their state out here.
            context.OutputMerger.SetBlendState(uiBlendState);
            context.OutputMerger.SetDepthStencilState(uiDepthState);
            ImageRenderer.PreparePipeline(context);
            ImageBatcher.Flush(context, Surface.Resolution, ImageRenderer);
            UILineBatcher.Flush(context, Surface.Resolution, UILineRenderer);
            GlyphRenderer.PreparePipeline(context);
            TextBatcher.Flush(context, Surface.Resolution, GlyphRenderer);

            //Note that, for now, the compress to swap handles its own depth state since it's the only post processing stage.
            context.OutputMerger.SetBlendState(opaqueBlendState);
            context.Rasterizer.State = rasterizerState;
            CompressToSwap.Render(context, resolvedSRV, Surface.RTV);
        }
        /// <summary>
        /// The create qualifiers.
        /// </summary>
        /// <param name="context">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateQualifiers(ParsingContext context, ParseTreeNode node)
        {
            var qualifier = node.ChildNodes.Count == 0 ? Qualifier.None : CollectQualifiers(node.ChildNodes[0]);

            if (qualifier != Qualifier.None)
            {
                qualifier.Span = SpanConverter.Convert(node.Span);
            }

            node.AstNode = qualifier;
        }
        /// <summary>
        /// Gets the expression.
        /// </summary>
        /// <param name="node">The node.</param>
        /// <returns>An expression</returns>
        protected static Expression GetExpression(ParseTreeNode node)
        {
            if (node.AstNode is Identifier)
            {
                return(new VariableReferenceExpression((Identifier)node.AstNode)
                {
                    Span = SpanConverter.Convert(node.Span)
                });
            }

            return((Expression)node.AstNode);
        }
        /// <summary>
        /// The create storage qualifier.
        /// </summary>
        /// <param name="context">
        /// </param>
        /// <param name="node">
        /// </param>
        protected virtual void CreateStorageQualifier(ParsingContext context, ParseTreeNode node)
        {
            var qualifier = Qualifier.None;

            if (node.ChildNodes.Count == 1)
            {
                qualifier      = Shaders.Ast.StorageQualifier.Parse(node.ChildNodes[0].Token.Text);
                qualifier.Span = SpanConverter.Convert(node.Span);
            }

            node.AstNode = qualifier;
        }
Example #10
0
        public void Render(Camera camera)
        {
            if (Surface.Resolution.X != width || Surface.Resolution.Y != height)
            {
                OnResize();
            }
            Shapes.MeshCache.FlushPendingUploads();

            GL.BindFramebuffer(FramebufferTarget.Framebuffer, framebuffer);
            //Note reversed depth.
            GL.ClearDepth(0.0f);
            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
            GL.Enable(EnableCap.CullFace);
            GL.Enable(EnableCap.DepthTest);
            GL.DepthFunc(DepthFunction.Greater);

            //All ray traced shapes use analytic coverage writes to get antialiasing.
            GL.Enable(EnableCap.SampleAlphaToCoverage);
            SphereRenderer.Render(camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.spheres.Span), 0, Shapes.spheres.Count);
            CapsuleRenderer.Render(camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.capsules.Span), 0, Shapes.capsules.Count);
            CylinderRenderer.Render(camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.cylinders.Span), 0, Shapes.cylinders.Count);

            //Non-raytraced shapes just use regular opaque rendering.
            GL.Disable(EnableCap.SampleAlphaToCoverage);
            BoxRenderer.Render(camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.boxes.Span), 0, Shapes.boxes.Count);
            TriangleRenderer.Render(camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.triangles.Span), 0, Shapes.triangles.Count);
            MeshRenderer.Render(camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.meshes.Span), 0, Shapes.meshes.Count);
            LineRenderer.Render(camera, Surface.Resolution, SpanConverter.AsSpan(Lines.lines.Span), 0, Lines.lines.Count);

            Background.Render(camera);
            GL.Disable(EnableCap.CullFace);
            GL.Disable(EnableCap.DepthTest);

            //Resolve MSAA rendering down to a single sample buffer for screenspace work.
            //Note that we're not bothering to properly handle tonemapping during the resolve. That's going to hurt quality a little, but the demos don't make use of very wide ranges.
            //(If for some reason you end up expanding the demos to make use of wider HDR, you can make this a custom resolve pretty easily.)
            GL.BlitNamedFramebuffer(framebuffer, resolvedFramebuffer, 0, 0, width, height, 0, 0, width, height, ClearBufferMask.ColorBufferBit, BlitFramebufferFilter.Nearest);
            GL.BindFramebuffer(FramebufferTarget.Framebuffer, resolvedFramebuffer);

            //Glyph and screenspace line drawing rely on the same premultiplied alpha blending transparency. We'll handle their state out here.
            GL.Enable(EnableCap.Blend);
            GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.OneMinusSrcAlpha);
            GL.BlendEquation(BlendEquationMode.FuncAdd);
            ImageRenderer.PreparePipeline();
            ImageBatcher.Flush(Surface.Resolution, ImageRenderer);
            UILineBatcher.Flush(Surface.Resolution, UILineRenderer);
            GlyphRenderer.PreparePipeline();
            TextBatcher.Flush(Surface.Resolution, GlyphRenderer);
            GL.Disable(EnableCap.Blend);

            GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
            CompressToSwap.Render(resolvedColorBuffer);
        }
Example #11
0
        /// <summary>
        /// The create identifier composite list.
        /// </summary>
        /// <param name="context">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateIdentifierCompositeList(ParsingContext context, ParseTreeNode node)
        {
            var values = Ast <List <Identifier> >(node);

            foreach (var subNode in node.ChildNodes)
            {
                values.Add(new Identifier(subNode.Token.Text)
                {
                    Span = SpanConverter.Convert(subNode.Span)
                });
            }
        }
Example #12
0
        protected override void CreateStorageQualifier(ParsingContext context, ParseTreeNode node)
        {
            var qualifier = AstCompositeEnum <Qualifier>(node);

            if (node.ChildNodes.Count == 1)
            {
                qualifier      = Shaders.Ast.Hlsl.StorageQualifier.Parse(node.ChildNodes[0].Token.Text);
                qualifier.Span = SpanConverter.Convert(node.Span);
            }

            // Use Hlsl Storage Qualifiers to parse the qualifier
            node.AstNode = qualifier;
        }
        /// <summary>
        /// The ast.
        /// </summary>
        /// <param name="node">
        /// </param>
        /// <typeparam name="T">
        /// </typeparam>
        /// <returns>
        /// </returns>
        protected static T Ast <T>(ParseTreeNode node) where T : class, new()
        {
            T      value = new T();
            object obj   = value;

            node.AstNode = value;
            if (value is Node)
            {
                ((Node)obj).Span = SpanConverter.Convert(node.Span);
            }

            return(value);
        }
Example #14
0
 /// <summary>
 /// The create parameter qualifier.
 /// </summary>
 /// <param name="context">
 /// </param>
 /// <param name="node">
 /// </param>
 protected virtual void CreateParameterQualifier(ParsingContext context, ParseTreeNode node)
 {
     ////          [0]
     //// storage_class_specifier | _("in") | "out" | "inout" | "point" | "line" | "triangle" | "triangleadj";
     if (node.ChildNodes[0].AstNode is Qualifier)
     {
         node.AstNode = node.ChildNodes[0].AstNode;
     }
     else
     {
         var qualifier = Shaders.Ast.Hlsl.ParameterQualifier.Parse(node.ChildNodes[0].Token.Text);
         qualifier.Span = SpanConverter.Convert(node.Span);
         node.AstNode   = qualifier;
     }
 }
        /// <summary>
        /// The collect qualifiers.
        /// </summary>
        /// <param name="node">
        /// </param>
        /// <returns>
        /// </returns>
        protected static Qualifier CollectQualifiers(ParseTreeNode node)
        {
            var value = Qualifier.None;

            foreach (var subNode in node.ChildNodes)
            {
                value |= (Qualifier)subNode.AstNode;
            }

            if (value != Qualifier.None)
            {
                value.Span = SpanConverter.Convert(node.Span);
            }

            return(value);
        }
Example #16
0
 private NonTerminal CreateScalarTerminal <T>(T scalarType) where T : ScalarType, new()
 {
     return(new NonTerminal(
                scalarType.Name,
                (context, node) =>
     {
         var value = Ast <T>(node);
         value.Name = new Identifier(scalarType.Name)
         {
             Span = SpanConverter.Convert(node.Span)
         };
         value.Type = scalarType.Type;
     })
     {
         Rule = Keyword(scalarType.Name)
     });
 }
        /// <summary>
        /// The create method declaration raw ast.
        /// </summary>
        /// <param name="context">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateMethodDeclarationRawAst(ParsingContext context, ParseTreeNode node)
        {
            //// method_declaration_raw.Rule =
            ////        [0]                         [1]                 [2]               [3]
            //// attribute_qualifier_pre + declaration_specifiers + method_declarator + method_qualifier_post;
            var methodDeclaration = (MethodDeclaration)node.ChildNodes[2].AstNode;

            node.AstNode           = methodDeclaration;
            methodDeclaration.Span = SpanConverter.Convert(node.Span);

            methodDeclaration.Attributes.AddRange((List <AttributeBase>)node.ChildNodes[0].AstNode);
            var declarationSpecifiers = (Tuple <Qualifier, TypeBase>)node.ChildNodes[1].AstNode;

            methodDeclaration.Qualifiers  = declarationSpecifiers.Item1;
            methodDeclaration.ReturnType  = declarationSpecifiers.Item2;
            methodDeclaration.Qualifiers |= (Qualifier)node.ChildNodes[3].AstNode;

            methodDeclaration.UpdateParameters();
        }
Example #18
0
        /// <summary>
        /// The create cast expression ast.
        /// </summary>
        /// <param name="parsingcontext">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateCastExpressionAst(ParsingContext parsingcontext, ParseTreeNode node)
        {
            // [0]       [1]               [2]               [3]        [4]
            // "(" + type_for_cast + rank_specifier.Star() + ")" + cast_expression;
            var value = Ast <CastExpression>(node);

            var type = (TypeBase)node.ChildNodes[1].AstNode;

            if (node.ChildNodes[2].ChildNodes.Count > 0)
            {
                var arrayType = new ArrayType {
                    Type = type, Span = SpanConverter.Convert(node.ChildNodes[2].Span)
                };
                FillListFromNodes(node.ChildNodes[2].ChildNodes, arrayType.Dimensions);
                type = arrayType;
            }

            value.Target = type;
            value.From   = (Expression)node.ChildNodes[4].AstNode;
        }
        protected static void CreateTypeFromTokenAst <T>(ParsingContext parsingcontext, ParseTreeNode node) where T : TypeBase, new()
        {
            if (node.ChildNodes.Count == 1 && node.ChildNodes[0].AstNode is T)
            {
                node.AstNode = node.ChildNodes[0].AstNode;
            }
            else
            {
                var value    = Ast <T>(node);
                var nextNode = node;
                while (nextNode.Token == null)
                {
                    nextNode = nextNode.ChildNodes[0];
                }

                value.Name = new Identifier(nextNode.Token.Text)
                {
                    Span = SpanConverter.Convert(node.Span)
                };
            }
        }
Example #20
0
        private static void HandleMessages(ParseTree parseTree, string file, ParsingResult result)
        {
            foreach (var parserMessage in parseTree.ParserMessages)
            {
                var level = new ReportMessageLevel();
                switch (parserMessage.Level)
                {
                case ParserErrorLevel.Info:
                    level = ReportMessageLevel.Info;
                    break;

                case ParserErrorLevel.Error:
                    level = ReportMessageLevel.Error;
                    break;

                case ParserErrorLevel.Warning:
                    level = ReportMessageLevel.Warning;
                    break;
                }

                result.Messages.Add(new ReportMessage(level, "", parserMessage.Message, new Ast.SourceSpan(SpanConverter.Convert(parserMessage.Location), 0)));

                if (parserMessage.Level != ParserErrorLevel.Info)
                {
                    result.HasErrors = true;
                }
            }
        }
Example #21
0
        /// <summary>
        /// Initializes a new instance of the <see cref="HlslGrammar"/> class.
        /// </summary>
        public HlslGrammar()
        {
            GrammarComments = "Hlsl version 5.0";

            Term(string_literal_raw, TokenCategory.String, TokenType.StringLiteral);
            Punc("::", TokenType.IdentifierSeparator);

            // ------------------------------------------------------------------------------------
            // Comments
            // ------------------------------------------------------------------------------------

            identifier_ns_list.Rule  = MakePlusRule(identifier_ns_list, ToTerm("::"), identifier_raw);
            identifier_dot_list.Rule = MakePlusRule(identifier_dot_list, ToTerm("."), identifier_raw);
            identifier_ns.Rule       = identifier_raw + "::" + identifier_ns_list;
            identifier_dot.Rule      = identifier_or_generic + ToTerm(".") + identifier_dot_list;
            identifier_or_dot.Rule   = identifier | identifier_dot;

            identifier.Rule |= identifier_ns;

            semi_opt.Rule = Empty | PreferShiftHere() + ";";

            //Prepare term set for conflict resolution
            _skipTokensInPreview.UnionWith(new[] { ToTerm("."), identifier_raw, ToTerm(","), ToTerm("::"), ToTerm("["), ToTerm("]"), float_literal, integer_literal });


            var genericResolverHint = new GenericResolverHint(_skipTokensInPreview);

            less_than.Rule = genericResolverHint + "<";

            // ------------------------------------------------------------------------------------
            // Types
            // ------------------------------------------------------------------------------------

            // String
            string_literal.Rule = string_literal_raw.List();
            string_literal_raw.AstNodeCreator = CreateStringRawLiteral;

            // Add string to literals
            literal.Rule |= string_literal;

            float_qualifier.Rule = Keyword("unorm") | Keyword("snorm");

            // scalars
            var scalarTypes = new[] { ScalarType.Bool, ScalarType.Int, ScalarType.UInt, ScalarType.Float, ScalarType.Half, ScalarType.Double };

            foreach (var scalarType in scalarTypes)
            {
                NonTerminal scalarTerm;
                var         localScalarType = scalarType;

                if (scalarType == ScalarType.Float)
                {
                    scalarTerm = new NonTerminal(
                        "float",
                        (context, node) =>
                    {
                        var dynamicFloatType  = Ast <ScalarType>(node);
                        dynamicFloatType.Name = new Identifier(localScalarType.Name)
                        {
                            Span = SpanConverter.Convert(node.Span)
                        };
                        dynamicFloatType.Type       = localScalarType.Type;
                        dynamicFloatType.Qualifiers = Qualifier.None;
                        if (node.ChildNodes.Count == 2)
                        {
                            dynamicFloatType.Qualifiers = (Qualifier)node.ChildNodes[0].AstNode;
                        }
                    })
                    {
                        Rule = Keyword("float", true) | float_qualifier + Keyword("float", true)
                    };
                }
                else
                {
                    scalarTerm = CreateScalarTerminal(scalarType);
                }

                if (scalars.Rule == null)
                {
                    scalars.Rule = scalarTerm;
                }
                else
                {
                    scalars.Rule |= scalarTerm;
                }
            }

            // Buffer Rules
            buffer_type.Rule = TypeName("Buffer") + less_than + simple_type_or_type_name + ">";

            // Vectors Rules
            vector_type.AstNodeCreator = CreateVectorAst;
            vector_type.Rule           = Keyword("vector") + less_than + scalars_or_typename + "," + number + ">";
            vector_type_list.Rule      = vector_type;

            // Add all vector int1 int2 int3 int4... float1 float2 float3 float4... etc.
            foreach (var scalarTypeIt in scalarTypes)
            {
                var scalarType = scalarTypeIt;
                for (var dim = 1; dim <= 4; dim++)
                {
                    var vectorTypeInstance = new VectorType(scalarTypeIt, dim);
                    var nonGenericType     = vectorTypeInstance.ToNonGenericType();
                    var name = nonGenericType.Name.Text;
                    vector_type_list.Rule |= new NonTerminal(name,
                                                             (ctx, node) =>
                    {
                        var typeName = vectorTypeInstance.ToNonGenericType(SpanConverter.Convert(node.Span));
                        node.AstNode = typeName;
                    })
                    {
                        Rule = Keyword(name)
                    };
                }
            }

            // Matrices
            matrix_type_simple.Rule           = Keyword("matrix");
            matrix_type_simple.AstNodeCreator = (ctx, node) =>
            {
                var typeName = Ast <TypeName>(node);
                typeName.Name = new Identifier("matrix")
                {
                    Span = SpanConverter.Convert(node.Span)
                };
                typeName.TypeInference.TargetType = new MatrixType(ScalarType.Float, 4, 4);
            };

            matrix_type.Rule           = Keyword("matrix") + less_than + scalars_or_typename + "," + number + "," + number + ">";
            matrix_type.AstNodeCreator = CreateMatrixAst;
            matrix_type_list.Rule      = matrix_type | matrix_type_simple;

            // Add all matrix typedefs: int1x1 int1x2... float1x1 float1x2 float1x3 float1x4... etc.
            foreach (var scalarTypeIt in scalarTypes)
            {
                var scalarType = scalarTypeIt;
                for (var dimX = 1; dimX <= 4; dimX++)
                {
                    for (var dimY = 1; dimY <= 4; dimY++)
                    {
                        var matrixTypeInstance = new MatrixType(scalarTypeIt, dimY, dimX);
                        var nonGenericType     = matrixTypeInstance.ToNonGenericType();
                        var name = nonGenericType.Name.Text;

                        // var typeName = new TypeName(name) { Alias = matrixTypeInstance };
                        matrix_type_list.Rule |= new NonTerminal(
                            name,
                            (ctx, node) =>
                        {
                            var typeName = matrixTypeInstance.ToNonGenericType(SpanConverter.Convert(node.Span));
                            node.AstNode = typeName;
                        })
                        {
                            Rule = Keyword(name)
                        };
                    }
                }
            }

            // Sampler types
            state_type.Rule = CreateRuleFromObjectTypes(
                StateType.BlendState,
                StateType.DepthStencilState,
                StateType.RasterizerState,
                SamplerStateType.SamplerState,
                SamplerStateType.SamplerStateOld,
                SamplerStateType.SamplerComparisonState);

            sampler_type.Rule = CreateRuleFromObjectTypes(
                SamplerType.Sampler,
                SamplerType.Sampler1D,
                SamplerType.Sampler2D,
                SamplerType.Sampler3D,
                SamplerType.SamplerCube);

            sampler_type.AstNodeCreator = CreateTypeFromTokenAst <SamplerType>;

            // Texture types
            texture_type_profile_4.Rule = CreateRuleFromObjectTypes(
                TextureType.Texture1D,
                TextureType.Texture1DArray,
                TextureType.Texture2D,
                TextureType.Texture2DArray,
                TextureType.Texture3D,
                TextureType.TextureCube);

            texture_type.Rule = Keyword("texture") | texture_type_profile_4;

            // ByteAddressBuffer
            byte_address_buffer.Rule = TypeName("ByteAddressBuffer") | TypeName("RWByteAddressBuffer");

            // StructuredBuffer
            structured_buffer_type.Rule = TypeName("AppendStructuredBuffer") | TypeName("ConsumeStructuredBuffer") | TypeName("RWStructuredBuffer") | TypeName("StructuredBuffer");
            structured_buffer.Rule      = structured_buffer_type + less_than + scalars_and_vectors + ">";

            // RWTexture.*
            texture_type_profile_5.Rule = TypeName("RWBuffer") | TypeName("RWTexture1D") | TypeName("RWTexture1DArray") | TypeName("RWTexture2D") | TypeName("RWTexture2DArray") | TypeName("RWTexture3D");

            texture_generic_simple_type.Rule = texture_type_profile_4 + less_than + scalars_and_vectors + ">"
                                               | texture_type_profile_5 + less_than + scalars_and_vectors + ">";

            texture_dms_type_profile_5.Rule = TypeName("Texture2DMS") | TypeName("Texture2DMSArray");

            texture_generic_dms_type.Rule = texture_dms_type_profile_5 + less_than + scalars_and_vectors + ">"
                                            | texture_dms_type_profile_5 + less_than + scalars_and_vectors + "," + number + ">";

            texture_generic_type.Rule = texture_generic_simple_type | texture_generic_dms_type;

            // HullShader/DomainShader InputPatch/OutputPatch
            patch_type.Rule = TypeName("InputPatch") | TypeName("OutputPatch");

            patch_generic_type.Rule = patch_type + less_than + type + "," + number + ">";

            texture_type_list.Rule = texture_type | texture_generic_type;

            // Types used by the geometry shader
            geometry_stream.Rule = line_stream | point_stream | triangle_stream | stream_output_object;

            triangle_stream.Rule = TypeName("TriangleStream") + less_than + type + ">";

            point_stream.Rule = TypeName("PointStream") + less_than + type + ">";

            line_stream.Rule = TypeName("LineStream") + less_than + type + ">";

            stream_output_object.Rule = TypeName("StreamOutputObject") + less_than + type + ">";

            //// Shader object
            //// shader_objects.Rule = ToTerm("VertexShader") | "PixelShader" | "GeometryShader";

            string_type.Rule = Keyword("string");

            // Add string to simple types
            simple_type.Rule |= string_type;

            // Add Object types
            object_type.Rule |= buffer_type
                                | state_type
                                | texture_type_list
                                | byte_address_buffer
                                | structured_buffer
                                | patch_generic_type
                                | interface_specifier
                                | class_specifier
                                | geometry_stream;
            ////| shader_objects;

            // Type name
            typename_for_cast.Rule = identifier + new IdentifierResolverHint(true);

            identifier_generic_parameter_list.Rule = MakePlusRule(identifier_generic_parameter_list, ToTerm(","), identifier_sub_generic);

            identifier_sub_generic.Rule           = identifier_or_generic;
            identifier_sub_generic.AstNodeCreator = CreateIdentifierSubGenericAst;

            //identifier_generic.Rule = identifier + new IdentifierResolverHint(true) + "<" + identifier_generic_parameter_list + ">";
            identifier_generic.Rule = identifier + new GenericResolverHint(_skipTokensInPreview) + "<" + identifier_generic_parameter_list + ">";

            identifier_or_generic.Rule = identifier + new IdentifierResolverHint(true)
                                         | identifier_generic + this.ReduceHere();

            type_generic.Rule = identifier_or_generic;

            // Type used for cast (use valuetype)
            type_for_cast.Rule = typename_for_cast
                                 | value_type;

            // ------------------------------------------------------------------------------------
            // Expressions
            // ------------------------------------------------------------------------------------

            // Add special variable allowed as variable name and keyword
            identifier_extended.Rule |= Keyword("sample") | Keyword("point");

            // postfix_expression
            postfix_expression.Rule |= compile_expression
                                       | asm_expression
                                       | state_expression;

            compile_expression.Rule = Keyword("compile") + identifier + method_invoke_expression_simple;

            // Match an asm block: asm { ... }
            asm_expression.Rule = asm_block;
            KeyTerms.Add(asm_block.Name, asm_block);

            state_expression.Rule = state_type + state_initializer;

            // Add cast_expression
            cast_expression_raw.Rule = "(" + type_for_cast + rank_specifier.ListOpt() + ")" + cast_expression;

            cast_expression.Rule |= cast_expression_raw;

            // Syntax is for example: texture = <g_textureref>;
            identifier_special_reference_expression.Rule = less_than + indexable_identifier + ">";

            identifier_keyword.Rule = Keyword("texture");

            simple_assignment_expression_statement.Rule |= indexable_identifier + assignment_operator + identifier_special_reference_expression + ";"
                                                           | identifier_keyword + assignment_operator + identifier_special_reference_expression + ";"
                                                           | identifier_keyword + assignment_operator + expression + ";";

            state_initializer.Rule = "{" + simple_assignment_expression_statement.ListOpt() + "}";

            // ------------------------------------------------------------------------------------
            // Attribute modifiers
            // ------------------------------------------------------------------------------------
            attribute_qualifier_pre.Rule = attribute_list_opt;

            attribute_list_opt.Rule = MakeStarRule(attribute_list_opt, null, attribute_modifier);

            attribute_modifier.Rule = "[" + identifier + "]"
                                      | "[" + identifier + "(" + literal_list.Opt() + ")" + "]";

            // ------------------------------------------------------------------------------------
            // Variable modifiers
            // ------------------------------------------------------------------------------------
            // storageClass = Storage_Class + Type_Modifier
            storage_qualifier.Rule |= Keyword("extern") | Keyword("nointerpolation") | Keyword("precise") | Keyword("shared") | Keyword("groupshared") | Keyword("static") | Keyword("volatile")
                                      | Keyword("row_major") | Keyword("column_major") | Keyword("linear") | Keyword("centroid") | Keyword("noperspective") | Keyword("sample") | Keyword("unsigned")
                                      | Keyword("inline");

            semantic.Rule = ToTerm(":") + identifier;

            packoffset.Rule = ToTerm(":") + Keyword("packoffset") + "(" + identifier_or_dot + ")";

            register.Rule = ToTerm(":") + Keyword("register") + "(" + indexable_identifier + ")"
                            | ToTerm(":") + Keyword("register") + "(" + identifier + "," + indexable_identifier + ")";


            variable_declarator_qualifier_post_hlsl.Rule = Empty
                                                           | semantic
                                                           | semantic + packoffset + register.ListOpt()
                                                           | semantic + register.List()
                                                           | packoffset + register.ListOpt()
                                                           | register.List();

            variable_declarator_qualifier_post.Rule = variable_declarator_qualifier_post_hlsl;

            // ------------------------------------------------------------------------------------
            // Declarations
            // ------------------------------------------------------------------------------------

            // Add typedef and constant buffer resource
            declaration.Rule |= typedef_declaration
                                | constant_buffer_resource;

            indexable_identifier_declarator_list.Rule = MakePlusRule(indexable_identifier_declarator_list, ToTerm(","), indexable_identifier_declarator);

            // typedef [const] Type Name[Index];
            typedef_declaration.Rule = Keyword("typedef") + type + indexable_identifier_declarator_list + ";"
                                       | Keyword("typedef") + storage_qualifier + type + indexable_identifier_declarator_list + ";";

            annotations.Rule = less_than + variable_declaration_raw.ListOpt() + ">";

            annotations_opt.Rule = Empty | annotations;

            // todo: add annotations_opt to variable_declarator qualifier post

            // Add annotations to variable declarator
            variable_declarator_raw.Rule += annotations_opt;

            // Add special
            variable_declarator.Rule |= variable_declarator_raw + state_initializer
                                        | variable_declarator_raw + state_array_initializer;

            state_initializer_list.Rule = MakePlusRule(state_initializer_list, ToTerm(","), state_initializer);

            state_array_initializer.Rule = "{" + state_initializer_list + "}"
                                           | "{" + state_initializer_list + "," + "}";

            // interface definition
            interface_specifier.Rule = Keyword("interface") + identifier_or_generic + "{" + method_declaration.ListOpt() + "}";

            // class definition
            class_specifier.Rule      = Keyword("class") + identifier_or_generic + class_base_type + "{" + scope_declaration.ListOpt() + "}";
            class_base_type_list.Rule = MakePlusRule(class_base_type_list, ToTerm(","), type_generic);
            class_base_type.Rule      = (ToTerm(":") + class_base_type_list).Opt();

            // buffer definition
            constant_buffer_resource_type.Rule = Keyword("cbuffer") | Keyword("tbuffer");

            constant_buffer_resource.Rule = attribute_qualifier_pre + constant_buffer_resource_type + identifier.Opt() + register.Opt() + "{" + declaration.ListOpt() + "}" + semi_opt;

            semantic_list_opt.Rule = semantic.ListOpt();

            // Method
            method_qualifier_post.Rule = semantic_list_opt;

            method_operator_identifier.Rule = Keyword("operator") + "[" + "]"
                                              | Keyword("operator") + "[" + "]" + "[" + "]";
            method_special_identifier.Rule = identifier_extended + "." + method_operator_identifier | method_operator_identifier;

            method_declarator.Rule |= method_special_identifier + "(" + parameter_list + ")";

            parameter_qualifier.Rule           = storage_qualifier | Keyword("in") | Keyword("out") | Keyword("inout") | Keyword("point") | Keyword("line") | Keyword("lineadj") | Keyword("triangle") | Keyword("triangleadj");
            parameter_qualifier.AstNodeCreator = CreateParameterQualifier;

            parameter_qualifier_pre_list_opt.Rule = parameter_qualifier.ListOpt();
            parameter_qualifier_pre.Rule          = parameter_qualifier_pre_list_opt;
            // Make parameter_qualifier_pre transient as there is nothing else to parse then parameter_qualifier_pre_list_opt
            parameter_qualifier_pre.Flags = TermFlags.IsTransient | TermFlags.NoAstNode;

            parameter_qualifier_post.Rule = semantic_list_opt
                                            | "=" + initializer + semantic_list_opt;
            parameter_qualifier_post.AstNodeCreator = CreateParameterQualifierPost;

            // ------------------------------------------------------------------------------------
            // Technique/pass
            // ------------------------------------------------------------------------------------

            // technique
            technique_keyword.Rule = Keyword("technique") | Keyword("Technique") | Keyword("technique10") | Keyword("Technique10") | Keyword("technique11") | Keyword("Technique11");

            technique_definition.Rule = attribute_qualifier_pre + technique_keyword + identifier.Opt() + annotations_opt + "{" + pass_definition.List() + "}" + semi_opt;

            // pass
            pass_keyword.Rule = Keyword("pass") | Keyword("Pass");

            pass_statement.Rule = method_invoke_expression_simple + ";"
                                  | simple_assignment_expression_statement;

            pass_definition.Rule = attribute_qualifier_pre + pass_keyword + identifier.Opt() + annotations_opt + "{" + pass_statement.ListOpt() + "}" + semi_opt;

            // ------------------------------------------------------------------------------------
            // Top Level
            // ------------------------------------------------------------------------------------

            // Add the technique to the top level
            toplevel_declaration.Rule |= technique_definition;

            /*
             * //// ------------------------------------------------------------------------------------
             * //// Xenko Grammar
             * //// ------------------------------------------------------------------------------------
             * //var identifier_csharp = new NonTerminal("identifier_csharp");
             * //var group = new NonTerminal("group");
             * //var using_statement = new NonTerminal("using_statement");
             * //group.Rule = "group" + identifier + "{" + scope_declaration.ListOpt() + "}";
             * //identifier_csharp.Rule = MakePlusRule(identifier_csharp, ToTerm("."), identifier);
             * //using_statement.Rule = "using" + identifier + "=" + identifier_csharp + ";"
             * //                       | "using" + identifier_csharp + ";";
             * //scope_declaration.Rule |= using_statement;
             * //toplevel_declaration.Rule |= group;
             */

            // ------------------------------------------------------------------------------------
            // Globals
            // ------------------------------------------------------------------------------------
            // LanguageFlags = LanguageFlags.NewLineBeforeEOF;
            LanguageFlags |= LanguageFlags.CreateAst;
        }
Example #22
0
 public override void Convert(ReadOnlySpan <TiffBgra64> source, Span <TiffGray16> destination)
 {
     SpanConverter.Convert(source, destination);
 }
 public override void Convert(ReadOnlySpan <TiffCmyk64> source, Span <TiffCmyk32> destination)
 {
     SpanConverter.Convert(source, destination);
 }
Example #24
0
 public override void Convert(ReadOnlySpan <TiffBgr24> source, Span <TiffRgba32> destination)
 {
     SpanConverter.Convert(source, destination);
 }
 public override void Convert(ReadOnlySpan <TiffGray8> source, Span <TiffRgb24> destination)
 {
     SpanConverter.Convert(source, destination);
 }