ronnie
2022-10-14 1504bb53e29d3d46222c0b3ea994fc494b48e153
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#ifndef _RSGSTATEMENT_HPP
#define _RSGSTATEMENT_HPP
/*-------------------------------------------------------------------------
 * drawElements Quality Program Random Shader Generator
 * ----------------------------------------------------
 *
 * Copyright 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief Statements.
 *//*--------------------------------------------------------------------*/
 
#include "rsgDefs.hpp"
#include "rsgGeneratorState.hpp"
#include "rsgVariableManager.hpp"
#include "rsgExpression.hpp"
#include "rsgToken.hpp"
 
#include <vector>
 
namespace rsg
{
 
class Statement
{
public:
                               Statement            (void);
   virtual                        ~Statement            (void);
 
   virtual Statement*            createNextChild        (GeneratorState& state)                            = DE_NULL;
   virtual void                tokenize            (GeneratorState& state, TokenStream& str) const    = DE_NULL;
   virtual void                execute                (ExecutionContext& execCtx) const                = DE_NULL;
 
protected:
};
 
// IfStatement
// ForLoopStatement
// WhileStatement
// DoWhileStatement
 
class ExpressionStatement : public Statement
{
public:
                           ExpressionStatement        (GeneratorState& state);
   virtual                    ~ExpressionStatement    (void);
 
   Statement*                createNextChild            (GeneratorState& state) { DE_UNREF(state); return DE_NULL; }
   void                    tokenize                (GeneratorState& state, TokenStream& str) const;
   void                    execute                    (ExecutionContext& execCtx) const;
 
   static float            getWeight                (const GeneratorState& state);
 
protected:
   Expression*                m_expression;
};
 
class DeclarationStatement : public Statement
{
public:
                           DeclarationStatement    (GeneratorState& state, Variable* variable = DE_NULL);
   virtual                    ~DeclarationStatement    (void);
 
   Statement*                createNextChild            (GeneratorState& state) { DE_UNREF(state); return DE_NULL; }
   void                    tokenize                (GeneratorState& state, TokenStream& str) const;
   void                    execute                    (ExecutionContext& execCtx) const;
 
   static float            getWeight                (const GeneratorState& state);
 
protected:
   const Variable*            m_variable;
   Expression*                m_expression;
};
 
class BlockStatement : public Statement
{
public:
                           BlockStatement            (GeneratorState& state);
   virtual                    ~BlockStatement            (void);
 
                           BlockStatement            (void) : m_numChildrenToCreate(0) {}
   void                    init                    (GeneratorState& state);
 
   Statement*                createNextChild            (GeneratorState& state);
   void                    tokenize                (GeneratorState& state, TokenStream& str) const;
   void                    execute                    (ExecutionContext& execCtx) const;
 
   static float            getWeight                (const GeneratorState& state);
 
   void                    addChild                (Statement* statement);
 
private:
   VariableScope            m_scope;
 
   int                        m_numChildrenToCreate;
   std::vector<Statement*>    m_children;
};
 
class ConditionalStatement : public Statement
{
public:
                           ConditionalStatement    (GeneratorState& state);
   virtual                    ~ConditionalStatement    (void);
 
   Statement*                createNextChild            (GeneratorState& state);
   void                    tokenize                (GeneratorState& state, TokenStream& str) const;
   void                    execute                    (ExecutionContext& execCtx) const;
 
   static float            getWeight                (const GeneratorState& state);
 
private:
   bool                    isElseBlockRequired        (const GeneratorState& state) const;
 
   Expression*                m_condition;
   Statement*                m_trueStatement;
   Statement*                m_falseStatement;
 
   ValueScope                m_conditionalScope;
};
 
// \note Used for generating mandatory assignments (shader outputs, function outputs).
//       Normally assignment is handled inside ExpressionStatement where generator may
//       choose to generate AssignOp expression.
class AssignStatement : public Statement
{
public:
                           AssignStatement            (const Variable* variable, Expression* value);
                           AssignStatement            (GeneratorState& state, const Variable* variable, ConstValueRangeAccess valueRange);
   virtual                    ~AssignStatement        (void);
 
   Statement*                createNextChild            (GeneratorState& state) { DE_UNREF(state); return DE_NULL; }
   void                    tokenize                (GeneratorState& state, TokenStream& str) const;
   void                    execute                    (ExecutionContext& execCtx) const;
 
private:
   const Variable*            m_variable;
   Expression*                m_valueExpr;
};
 
} // rsg
 
#endif // _RSGSTATEMENT_HPP