| #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 |