huangcm
2025-02-24 69ed55dec4b2116a19e4cca4393cbc014fce5fb2
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
#ifndef _RSGSHADER_HPP
#define _RSGSHADER_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 Shader Class.
 *//*--------------------------------------------------------------------*/
 
#include "rsgDefs.hpp"
#include "rsgVariable.hpp"
#include "rsgStatement.hpp"
#include "rsgVariableManager.hpp"
#include "rsgToken.hpp"
#include "rsgExecutionContext.hpp"
 
#include <vector>
#include <string>
 
namespace rsg
{
 
class Function
{
public:
                               Function            (void);
                               Function            (const char* name);
                               ~Function            (void);
 
   const VariableType&            getReturnType        (void) const                { return m_returnType;        }
   void                        setReturnType        (const VariableType& type)    { m_returnType = type;        }
 
   void                        addParameter        (Variable* variable);
 
   BlockStatement&                getBody                (void)            { return m_functionBlock;    }
   const BlockStatement&        getBody                (void) const    { return m_functionBlock;    }
 
   void                        tokenize            (GeneratorState& state, TokenStream& stream) const;
 
private:
   std::string                    m_name;
   std::vector<Variable*>        m_parameters;
   VariableType                m_returnType;
 
   BlockStatement                m_functionBlock;
};
 
class ShaderInput
{
public:
                               ShaderInput            (const Variable* variable, ConstValueRangeAccess valueRange);
                               ~ShaderInput        (void) {}
 
   const Variable*                getVariable            (void) const    { return m_variable;    }
   ConstValueRangeAccess        getValueRange        (void) const    { return ConstValueRangeAccess(m_variable->getType(), &m_min[0], &m_max[0]);    }
   ValueRangeAccess            getValueRange        (void)            { return ValueRangeAccess(m_variable->getType(), &m_min[0], &m_max[0]);            }
 
private:
   const Variable*                m_variable;
   std::vector<Scalar>            m_min;
   std::vector<Scalar>            m_max;
};
 
class Shader
{
public:
   enum Type
   {
       TYPE_VERTEX = 0,
       TYPE_FRAGMENT,
 
       TYPE_LAST
   };
 
                               Shader                (Type type);
                               ~Shader                (void);
 
   Type                        getType                (void) const    { return m_type;                }
   const char*                    getSource            (void) const    { return m_source.c_str();        }
 
   void                        execute                (ExecutionContext& execCtx) const;
 
   // For generator implementation only
   Function&                    getMain                (void)            { return m_mainFunction;        }
   Function&                    allocateFunction    (void);
 
   VariableScope&                getGlobalScope        (void)            { return m_globalScope;            }
   std::vector<Statement*>&    getGlobalStatements    (void)            { return m_globalStatements;    }
 
   void                        tokenize            (GeneratorState& state, TokenStream& str) const;
   void                        setSource            (const char* source) { m_source = source;        }
 
   std::vector<ShaderInput*>&    getInputs            (void)            { return m_inputs;                }
   std::vector<ShaderInput*>&    getUniforms            (void)            { return m_uniforms;            }
 
   // For executor
   const std::vector<ShaderInput*>&    getInputs    (void) const    { return m_inputs;                }
   const std::vector<ShaderInput*>&    getUniforms    (void) const    { return m_uniforms;            }
   void                                getOutputs    (std::vector<const Variable*>& outputs) const;
 
private:
   Type                        m_type;
 
   VariableScope                m_globalScope;
   std::vector<Statement*>        m_globalStatements;
 
   std::vector<ShaderInput*>    m_inputs;
   std::vector<ShaderInput*>    m_uniforms;
 
   std::vector<Function*>        m_functions;
   Function                    m_mainFunction;
 
   std::string                    m_source;
};
 
} // rsg
 
#endif // _RSGSHADER_HPP