156 lines
4.6 KiB
C++
156 lines
4.6 KiB
C++
#ifndef _RSGSTATEMENT_HPP
|
|
#define _RSGSTATEMENT_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 Statements.
|
|
*//*--------------------------------------------------------------------*/
|
|
|
|
#include "rsgDefs.hpp"
|
|
#include "rsgGeneratorState.hpp"
|
|
#include "rsgVariableManager.hpp"
|
|
#include "rsgExpression.hpp"
|
|
#include "rsgToken.hpp"
|
|
|
|
#include <vector>
|
|
|
|
namespace rsg
|
|
{
|
|
|
|
class Statement
|
|
{
|
|
public:
|
|
Statement (void);
|
|
virtual ~Statement (void);
|
|
|
|
virtual Statement* createNextChild (GeneratorState& state) = DE_NULL;
|
|
virtual void tokenize (GeneratorState& state, TokenStream& str) const = DE_NULL;
|
|
virtual void execute (ExecutionContext& execCtx) const = DE_NULL;
|
|
|
|
protected:
|
|
};
|
|
|
|
// IfStatement
|
|
// ForLoopStatement
|
|
// WhileStatement
|
|
// DoWhileStatement
|
|
|
|
class ExpressionStatement : public Statement
|
|
{
|
|
public:
|
|
ExpressionStatement (GeneratorState& state);
|
|
virtual ~ExpressionStatement (void);
|
|
|
|
Statement* createNextChild (GeneratorState& state) { DE_UNREF(state); return DE_NULL; }
|
|
void tokenize (GeneratorState& state, TokenStream& str) const;
|
|
void execute (ExecutionContext& execCtx) const;
|
|
|
|
static float getWeight (const GeneratorState& state);
|
|
|
|
protected:
|
|
Expression* m_expression;
|
|
};
|
|
|
|
class DeclarationStatement : public Statement
|
|
{
|
|
public:
|
|
DeclarationStatement (GeneratorState& state, Variable* variable = DE_NULL);
|
|
virtual ~DeclarationStatement (void);
|
|
|
|
Statement* createNextChild (GeneratorState& state) { DE_UNREF(state); return DE_NULL; }
|
|
void tokenize (GeneratorState& state, TokenStream& str) const;
|
|
void execute (ExecutionContext& execCtx) const;
|
|
|
|
static float getWeight (const GeneratorState& state);
|
|
|
|
protected:
|
|
const Variable* m_variable;
|
|
Expression* m_expression;
|
|
};
|
|
|
|
class BlockStatement : public Statement
|
|
{
|
|
public:
|
|
BlockStatement (GeneratorState& state);
|
|
virtual ~BlockStatement (void);
|
|
|
|
BlockStatement (void) : m_numChildrenToCreate(0) {}
|
|
void init (GeneratorState& state);
|
|
|
|
Statement* createNextChild (GeneratorState& state);
|
|
void tokenize (GeneratorState& state, TokenStream& str) const;
|
|
void execute (ExecutionContext& execCtx) const;
|
|
|
|
static float getWeight (const GeneratorState& state);
|
|
|
|
void addChild (Statement* statement);
|
|
|
|
private:
|
|
VariableScope m_scope;
|
|
|
|
int m_numChildrenToCreate;
|
|
std::vector<Statement*> m_children;
|
|
};
|
|
|
|
class ConditionalStatement : public Statement
|
|
{
|
|
public:
|
|
ConditionalStatement (GeneratorState& state);
|
|
virtual ~ConditionalStatement (void);
|
|
|
|
Statement* createNextChild (GeneratorState& state);
|
|
void tokenize (GeneratorState& state, TokenStream& str) const;
|
|
void execute (ExecutionContext& execCtx) const;
|
|
|
|
static float getWeight (const GeneratorState& state);
|
|
|
|
private:
|
|
bool isElseBlockRequired (const GeneratorState& state) const;
|
|
|
|
Expression* m_condition;
|
|
Statement* m_trueStatement;
|
|
Statement* m_falseStatement;
|
|
|
|
ValueScope m_conditionalScope;
|
|
};
|
|
|
|
// \note Used for generating mandatory assignments (shader outputs, function outputs).
|
|
// Normally assignment is handled inside ExpressionStatement where generator may
|
|
// choose to generate AssignOp expression.
|
|
class AssignStatement : public Statement
|
|
{
|
|
public:
|
|
AssignStatement (const Variable* variable, Expression* value);
|
|
AssignStatement (GeneratorState& state, const Variable* variable, ConstValueRangeAccess valueRange);
|
|
virtual ~AssignStatement (void);
|
|
|
|
Statement* createNextChild (GeneratorState& state) { DE_UNREF(state); return DE_NULL; }
|
|
void tokenize (GeneratorState& state, TokenStream& str) const;
|
|
void execute (ExecutionContext& execCtx) const;
|
|
|
|
private:
|
|
const Variable* m_variable;
|
|
Expression* m_valueExpr;
|
|
};
|
|
|
|
} // rsg
|
|
|
|
#endif // _RSGSTATEMENT_HPP
|