Ejemplo n.º 1
0
        private void ParseTechnique(UnifiedShaderInfo info, List <UnifiedShaderToken> tokens)
        {
            var name = ConsumeToken(tokens);

            ExpectToken(name, UnifiedShaderTokenType.StringToken);
            ExpectToken(ConsumeToken(tokens), UnifiedShaderTokenType.OpenBrace);

            var technique = new TechniqueInfo
            {
                Name   = name.Text,
                Passes = new List <PassInfo>()
            };

            while (tokens[0].TokenType == UnifiedShaderTokenType.StringToken &&
                   tokens[0].Text == "pass")
            {
                var pass = new PassInfo();
                ExpectToken(ConsumeToken(tokens), "pass");
                var passName = ConsumeToken(tokens);
                ExpectToken(passName, UnifiedShaderTokenType.StringToken);
                pass.Name = passName.Text;
                ParsePass(pass, tokens);
                technique.Passes.Add(pass);
            }

            info.Techniques.Add(technique);

            ExpectToken(ConsumeToken(tokens), UnifiedShaderTokenType.CloseBrace);
        }
Ejemplo n.º 2
0
        private void ParseShaders(UnifiedShaderInfo info, List <UnifiedShaderToken> tokens)
        {
            ExpectToken(ConsumeToken(tokens), UnifiedShaderTokenType.OpenBrace);

            while (tokens[0].TokenType == UnifiedShaderTokenType.LanguageStart)
            {
                var languageStart = ConsumeToken(tokens);
                var languageBlock = ConsumeToken(tokens);
                var languageEnd   = ConsumeToken(tokens);
                ExpectToken(languageStart, UnifiedShaderTokenType.LanguageStart);
                ExpectToken(languageBlock, UnifiedShaderTokenType.LanguageBlock);
                ExpectToken(languageEnd, UnifiedShaderTokenType.LanguageEnd);

                if (!info.ShaderBlocks.ContainsKey(languageStart.Text))
                {
                    info.ShaderBlocks[languageStart.Text] = new ShaderBlockInfo
                    {
                        ShaderText = String.Empty
                    };
                }

                info.ShaderBlocks[languageStart.Text].ShaderText += languageBlock.Text;
            }

            ExpectToken(ConsumeToken(tokens), UnifiedShaderTokenType.CloseBrace);
        }
Ejemplo n.º 3
0
        private void ParseParameters(UnifiedShaderInfo info, List <UnifiedShaderToken> tokens)
        {
            ExpectToken(ConsumeToken(tokens), UnifiedShaderTokenType.OpenBrace);

            ParseParameterList(info.Parameters, tokens);

            ExpectToken(ConsumeToken(tokens), UnifiedShaderTokenType.CloseBrace);
        }
Ejemplo n.º 4
0
        private void ParseConstantBuffers(UnifiedShaderInfo info, List <UnifiedShaderToken> tokens)
        {
            ExpectToken(ConsumeToken(tokens), UnifiedShaderTokenType.OpenBrace);

            while (tokens[0].TokenType == UnifiedShaderTokenType.StringToken && tokens[0].Text == "cbuffer")
            {
                var buffer = new ConstantBufferInfo();
                ParseConstantBuffer(buffer, tokens);
                info.ConstantBuffers.Add(buffer);
            }

            ExpectToken(ConsumeToken(tokens), UnifiedShaderTokenType.CloseBrace);
        }
Ejemplo n.º 5
0
        public UnifiedShaderInfo Parse(string input)
        {
            var tokens = Lex(input);
            var info   = new UnifiedShaderInfo
            {
                ConstantBuffers = new List <ConstantBufferInfo>(),
                Parameters      = new List <ParameterInfo>(),
                ShaderBlocks    = new Dictionary <string, ShaderBlockInfo>(),
                Techniques      = new List <TechniqueInfo>()
            };

            ParseTopLevel(info, tokens);

            return(info);
        }
Ejemplo n.º 6
0
        private void ParseTopLevel(UnifiedShaderInfo info, List <UnifiedShaderToken> tokens)
        {
            while (tokens.Count > 0)
            {
                var token = ConsumeToken(tokens);
                switch (token.TokenType)
                {
                case UnifiedShaderTokenType.VersionDeclaration:
                    break;

                case UnifiedShaderTokenType.StringToken:
                    switch (token.Text)
                    {
                    case "cbuffers":
                        ParseConstantBuffers(info, tokens);
                        break;

                    case "parameters":
                        ParseParameters(info, tokens);
                        break;

                    case "shaders":
                        ParseShaders(info, tokens);
                        break;

                    case "technique":
                        ParseTechnique(info, tokens);
                        break;

                    default:
                        throw new UnifiedShaderParsingUnexpectedTokenException(token, "cbuffers", "parameters",
                                                                               "shaders", "technique");
                    }
                    break;

                default:
                    throw new UnifiedShaderParsingUnexpectedTokenException(token,
                                                                           UnifiedShaderTokenType.VersionDeclaration, UnifiedShaderTokenType.StringToken);
                }
            }
        }