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.
83 lines
2.6 KiB
83 lines
2.6 KiB
/*------------------------------------------------------------------------- |
|
* 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 Expression generator. |
|
*//*--------------------------------------------------------------------*/ |
|
|
|
#include "rsgFunctionGenerator.hpp" |
|
#include "rsgUtils.hpp" |
|
|
|
using std::vector; |
|
|
|
namespace rsg |
|
{ |
|
|
|
FunctionGenerator::FunctionGenerator (GeneratorState& state, Function& function) |
|
: m_state (state) |
|
, m_function (function) |
|
{ |
|
} |
|
|
|
FunctionGenerator::~FunctionGenerator (void) |
|
{ |
|
} |
|
|
|
void FunctionGenerator::generate (void) |
|
{ |
|
std::vector<Statement*> statementStack; |
|
|
|
// Initialize |
|
m_state.setStatementStack(statementStack); |
|
statementStack.push_back(&m_function.getBody()); |
|
m_function.getBody().init(m_state); |
|
|
|
// Process until statement stack is empty |
|
while (!statementStack.empty()) |
|
{ |
|
DE_ASSERT((int)statementStack.size() <= m_state.getShaderParameters().maxStatementDepth); |
|
|
|
Statement* curStatement = statementStack.back(); |
|
Statement* childStatement = curStatement->createNextChild(m_state); |
|
|
|
if (childStatement) |
|
statementStack.push_back(childStatement); |
|
else |
|
statementStack.pop_back(); |
|
} |
|
|
|
// Create assignments if variables have bound value range |
|
for (vector<Variable*>::iterator i = m_requiredAssignments.begin(); i != m_requiredAssignments.end(); i++) |
|
{ |
|
Variable* variable = *i; |
|
const ValueEntry* entry = m_state.getVariableManager().getValue(variable); |
|
ValueRange valueRange(variable->getType()); |
|
|
|
valueRange.getMin() = entry->getValueRange().getMin().value(); |
|
valueRange.getMax() = entry->getValueRange().getMax().value(); |
|
|
|
// Remove value entry from this scope. After this entry ptr is invalid. |
|
m_state.getVariableManager().removeValueFromCurrentScope(variable); |
|
|
|
if (!isUndefinedValueRange(valueRange.asAccess())) |
|
m_function.getBody().addChild(new AssignStatement(m_state, variable, valueRange.asAccess())); |
|
} |
|
} |
|
|
|
} // rsg
|
|
|