xref: /aosp_15_r20/external/deqp/framework/randomshaders/rsgGeneratorState.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker #ifndef _RSGGENERATORSTATE_HPP
2*35238bceSAndroid Build Coastguard Worker #define _RSGGENERATORSTATE_HPP
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program Random Shader Generator
5*35238bceSAndroid Build Coastguard Worker  * ----------------------------------------------------
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker  *
9*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker  *
15*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker  *
21*35238bceSAndroid Build Coastguard Worker  *//*!
22*35238bceSAndroid Build Coastguard Worker  * \file
23*35238bceSAndroid Build Coastguard Worker  * \brief Generator state.
24*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "rsgDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "rsgParameters.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "rsgNameAllocator.hpp"
30*35238bceSAndroid Build Coastguard Worker 
31*35238bceSAndroid Build Coastguard Worker #include <vector>
32*35238bceSAndroid Build Coastguard Worker 
33*35238bceSAndroid Build Coastguard Worker namespace rsg
34*35238bceSAndroid Build Coastguard Worker {
35*35238bceSAndroid Build Coastguard Worker 
36*35238bceSAndroid Build Coastguard Worker class Shader;
37*35238bceSAndroid Build Coastguard Worker class VariableManager;
38*35238bceSAndroid Build Coastguard Worker class VariableType;
39*35238bceSAndroid Build Coastguard Worker class Statement;
40*35238bceSAndroid Build Coastguard Worker 
41*35238bceSAndroid Build Coastguard Worker enum ExpressionFlags
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker     CONST_EXPR        = (1 << 0),
44*35238bceSAndroid Build Coastguard Worker     NO_VAR_ALLOCATION = (1 << 1)
45*35238bceSAndroid Build Coastguard Worker };
46*35238bceSAndroid Build Coastguard Worker 
47*35238bceSAndroid Build Coastguard Worker enum
48*35238bceSAndroid Build Coastguard Worker {
49*35238bceSAndroid Build Coastguard Worker     PRECEDENCE_MAX = 100
50*35238bceSAndroid Build Coastguard Worker };
51*35238bceSAndroid Build Coastguard Worker 
52*35238bceSAndroid Build Coastguard Worker class GeneratorState
53*35238bceSAndroid Build Coastguard Worker {
54*35238bceSAndroid Build Coastguard Worker public:
55*35238bceSAndroid Build Coastguard Worker     GeneratorState(const ProgramParameters &programParams, de::Random &random);
56*35238bceSAndroid Build Coastguard Worker     ~GeneratorState(void);
57*35238bceSAndroid Build Coastguard Worker 
getProgramParameters(void) const58*35238bceSAndroid Build Coastguard Worker     const ProgramParameters &getProgramParameters(void) const
59*35238bceSAndroid Build Coastguard Worker     {
60*35238bceSAndroid Build Coastguard Worker         return m_programParams;
61*35238bceSAndroid Build Coastguard Worker     }
getRandom(void)62*35238bceSAndroid Build Coastguard Worker     de::Random &getRandom(void)
63*35238bceSAndroid Build Coastguard Worker     {
64*35238bceSAndroid Build Coastguard Worker         return m_random;
65*35238bceSAndroid Build Coastguard Worker     }
66*35238bceSAndroid Build Coastguard Worker 
getShaderParameters(void) const67*35238bceSAndroid Build Coastguard Worker     const ShaderParameters &getShaderParameters(void) const
68*35238bceSAndroid Build Coastguard Worker     {
69*35238bceSAndroid Build Coastguard Worker         return *m_shaderParams;
70*35238bceSAndroid Build Coastguard Worker     }
getShader(void)71*35238bceSAndroid Build Coastguard Worker     Shader &getShader(void)
72*35238bceSAndroid Build Coastguard Worker     {
73*35238bceSAndroid Build Coastguard Worker         return *m_shader;
74*35238bceSAndroid Build Coastguard Worker     }
75*35238bceSAndroid Build Coastguard Worker 
76*35238bceSAndroid Build Coastguard Worker     void setShader(const ShaderParameters &params, Shader &shader);
77*35238bceSAndroid Build Coastguard Worker 
getNameAllocator(void)78*35238bceSAndroid Build Coastguard Worker     NameAllocator &getNameAllocator(void)
79*35238bceSAndroid Build Coastguard Worker     {
80*35238bceSAndroid Build Coastguard Worker         return m_nameAllocator;
81*35238bceSAndroid Build Coastguard Worker     }
getVariableManager(void)82*35238bceSAndroid Build Coastguard Worker     VariableManager &getVariableManager(void)
83*35238bceSAndroid Build Coastguard Worker     {
84*35238bceSAndroid Build Coastguard Worker         return *m_varManager;
85*35238bceSAndroid Build Coastguard Worker     }
getVariableManager(void) const86*35238bceSAndroid Build Coastguard Worker     const VariableManager &getVariableManager(void) const
87*35238bceSAndroid Build Coastguard Worker     {
88*35238bceSAndroid Build Coastguard Worker         return *m_varManager;
89*35238bceSAndroid Build Coastguard Worker     }
setVariableManager(VariableManager & varManager)90*35238bceSAndroid Build Coastguard Worker     void setVariableManager(VariableManager &varManager)
91*35238bceSAndroid Build Coastguard Worker     {
92*35238bceSAndroid Build Coastguard Worker         m_varManager = &varManager;
93*35238bceSAndroid Build Coastguard Worker     }
94*35238bceSAndroid Build Coastguard Worker 
95*35238bceSAndroid Build Coastguard Worker     // \todo [2011-06-10 pyry] Could we not expose whole statement stack to everyone?
getStatementDepth(void) const96*35238bceSAndroid Build Coastguard Worker     int getStatementDepth(void) const
97*35238bceSAndroid Build Coastguard Worker     {
98*35238bceSAndroid Build Coastguard Worker         return (int)m_statementStack->size();
99*35238bceSAndroid Build Coastguard Worker     }
setStatementStack(std::vector<Statement * > & stack)100*35238bceSAndroid Build Coastguard Worker     void setStatementStack(std::vector<Statement *> &stack)
101*35238bceSAndroid Build Coastguard Worker     {
102*35238bceSAndroid Build Coastguard Worker         m_statementStack = &stack;
103*35238bceSAndroid Build Coastguard Worker     }
getStatementStackEntry(int ndx) const104*35238bceSAndroid Build Coastguard Worker     const Statement *getStatementStackEntry(int ndx) const
105*35238bceSAndroid Build Coastguard Worker     {
106*35238bceSAndroid Build Coastguard Worker         return m_statementStack->at(ndx);
107*35238bceSAndroid Build Coastguard Worker     }
108*35238bceSAndroid Build Coastguard Worker 
getExpressionDepth(void) const109*35238bceSAndroid Build Coastguard Worker     int getExpressionDepth(void) const
110*35238bceSAndroid Build Coastguard Worker     {
111*35238bceSAndroid Build Coastguard Worker         return m_expressionDepth;
112*35238bceSAndroid Build Coastguard Worker     }
setExpressionDepth(int depth)113*35238bceSAndroid Build Coastguard Worker     void setExpressionDepth(int depth)
114*35238bceSAndroid Build Coastguard Worker     {
115*35238bceSAndroid Build Coastguard Worker         m_expressionDepth = depth;
116*35238bceSAndroid Build Coastguard Worker     }
117*35238bceSAndroid Build Coastguard Worker 
118*35238bceSAndroid Build Coastguard Worker     // \todo [2011-03-21 pyry] A bit of a hack... Move to ValueRange?
getExpressionFlags(void) const119*35238bceSAndroid Build Coastguard Worker     uint32_t getExpressionFlags(void) const
120*35238bceSAndroid Build Coastguard Worker     {
121*35238bceSAndroid Build Coastguard Worker         return m_exprFlagStack.back();
122*35238bceSAndroid Build Coastguard Worker     }
pushExpressionFlags(uint32_t flags)123*35238bceSAndroid Build Coastguard Worker     void pushExpressionFlags(uint32_t flags)
124*35238bceSAndroid Build Coastguard Worker     {
125*35238bceSAndroid Build Coastguard Worker         m_exprFlagStack.push_back(flags);
126*35238bceSAndroid Build Coastguard Worker     }
popExpressionFlags(void)127*35238bceSAndroid Build Coastguard Worker     void popExpressionFlags(void)
128*35238bceSAndroid Build Coastguard Worker     {
129*35238bceSAndroid Build Coastguard Worker         m_exprFlagStack.pop_back();
130*35238bceSAndroid Build Coastguard Worker     }
131*35238bceSAndroid Build Coastguard Worker 
getPrecedence(void) const132*35238bceSAndroid Build Coastguard Worker     int getPrecedence(void) const
133*35238bceSAndroid Build Coastguard Worker     {
134*35238bceSAndroid Build Coastguard Worker         return m_precedenceStack.back();
135*35238bceSAndroid Build Coastguard Worker     }
pushPrecedence(int precedence)136*35238bceSAndroid Build Coastguard Worker     void pushPrecedence(int precedence)
137*35238bceSAndroid Build Coastguard Worker     {
138*35238bceSAndroid Build Coastguard Worker         m_precedenceStack.push_back(precedence);
139*35238bceSAndroid Build Coastguard Worker     }
popPrecedence(void)140*35238bceSAndroid Build Coastguard Worker     void popPrecedence(void)
141*35238bceSAndroid Build Coastguard Worker     {
142*35238bceSAndroid Build Coastguard Worker         m_precedenceStack.pop_back();
143*35238bceSAndroid Build Coastguard Worker     }
144*35238bceSAndroid Build Coastguard Worker 
145*35238bceSAndroid Build Coastguard Worker private:
146*35238bceSAndroid Build Coastguard Worker     const ProgramParameters &m_programParams;
147*35238bceSAndroid Build Coastguard Worker     de::Random &m_random;
148*35238bceSAndroid Build Coastguard Worker 
149*35238bceSAndroid Build Coastguard Worker     const ShaderParameters *m_shaderParams;
150*35238bceSAndroid Build Coastguard Worker     Shader *m_shader;
151*35238bceSAndroid Build Coastguard Worker 
152*35238bceSAndroid Build Coastguard Worker     NameAllocator m_nameAllocator;
153*35238bceSAndroid Build Coastguard Worker     VariableManager *m_varManager;
154*35238bceSAndroid Build Coastguard Worker 
155*35238bceSAndroid Build Coastguard Worker     std::vector<Statement *> *m_statementStack;
156*35238bceSAndroid Build Coastguard Worker     int m_expressionDepth;
157*35238bceSAndroid Build Coastguard Worker     std::vector<uint32_t> m_exprFlagStack;
158*35238bceSAndroid Build Coastguard Worker     std::vector<int> m_precedenceStack;
159*35238bceSAndroid Build Coastguard Worker };
160*35238bceSAndroid Build Coastguard Worker 
161*35238bceSAndroid Build Coastguard Worker } // namespace rsg
162*35238bceSAndroid Build Coastguard Worker 
163*35238bceSAndroid Build Coastguard Worker #endif // _RSGGENERATORSTATE_HPP
164