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.
135 lines
3.9 KiB
135 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
|