You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
3.9 KiB
134 lines
3.9 KiB
#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
|
|
|