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.
173 lines
4.6 KiB
173 lines
4.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 Shader Evaluation Context.
|
|
*//*--------------------------------------------------------------------*/
|
|
|
|
#include "rsgExecutionContext.hpp"
|
|
|
|
namespace rsg
|
|
{
|
|
|
|
ExecMaskStorage::ExecMaskStorage (bool initVal)
|
|
{
|
|
for (int i = 0; i < EXEC_VEC_WIDTH; i++)
|
|
m_data[i].as<bool>() = initVal;
|
|
}
|
|
|
|
ExecValueAccess ExecMaskStorage::getValue (void)
|
|
{
|
|
return ExecValueAccess(VariableType::getScalarType(VariableType::TYPE_BOOL), m_data);
|
|
}
|
|
|
|
ExecConstValueAccess ExecMaskStorage::getValue (void) const
|
|
{
|
|
return ExecConstValueAccess(VariableType::getScalarType(VariableType::TYPE_BOOL), m_data);
|
|
}
|
|
|
|
ExecutionContext::ExecutionContext (const Sampler2DMap& samplers2D, const SamplerCubeMap& samplersCube)
|
|
: m_samplers2D (samplers2D)
|
|
, m_samplersCube (samplersCube)
|
|
{
|
|
// Initialize execution mask to true
|
|
ExecMaskStorage initVal(true);
|
|
pushExecutionMask(initVal.getValue());
|
|
}
|
|
|
|
ExecutionContext::~ExecutionContext (void)
|
|
{
|
|
for (VarValueMap::iterator i = m_varValues.begin(); i != m_varValues.end(); i++)
|
|
delete i->second;
|
|
m_varValues.clear();
|
|
}
|
|
|
|
ExecValueAccess ExecutionContext::getValue (const Variable* variable)
|
|
{
|
|
ExecValueStorage* storage = m_varValues[variable];
|
|
|
|
if (!storage)
|
|
{
|
|
storage = new ExecValueStorage(variable->getType());
|
|
m_varValues[variable] = storage;
|
|
}
|
|
|
|
return storage->getValue(variable->getType());
|
|
}
|
|
|
|
const Sampler2D& ExecutionContext::getSampler2D (const Variable* sampler) const
|
|
{
|
|
const ExecValueStorage* samplerVal = m_varValues.find(sampler)->second;
|
|
|
|
int samplerNdx = samplerVal->getValue(sampler->getType()).asInt(0);
|
|
|
|
return m_samplers2D.find(samplerNdx)->second;
|
|
}
|
|
|
|
const SamplerCube& ExecutionContext::getSamplerCube (const Variable* sampler) const
|
|
{
|
|
const ExecValueStorage* samplerVal = m_varValues.find(sampler)->second;
|
|
|
|
int samplerNdx = samplerVal->getValue(sampler->getType()).asInt(0);
|
|
|
|
return m_samplersCube.find(samplerNdx)->second;
|
|
}
|
|
|
|
void ExecutionContext::andExecutionMask (ExecConstValueAccess value)
|
|
{
|
|
ExecMaskStorage tmp;
|
|
ExecValueAccess newValue = tmp.getValue();
|
|
ExecConstValueAccess oldValue = getExecutionMask();
|
|
|
|
for (int i = 0; i < EXEC_VEC_WIDTH; i++)
|
|
newValue.asBool(i) = oldValue.asBool(i) && value.asBool(i);
|
|
|
|
pushExecutionMask(newValue);
|
|
}
|
|
|
|
void ExecutionContext::pushExecutionMask (ExecConstValueAccess value)
|
|
{
|
|
ExecMaskStorage tmp;
|
|
tmp.getValue() = value.value();
|
|
m_execMaskStack.push_back(tmp);
|
|
}
|
|
|
|
void ExecutionContext::popExecutionMask (void)
|
|
{
|
|
m_execMaskStack.pop_back();
|
|
}
|
|
|
|
ExecConstValueAccess ExecutionContext::getExecutionMask (void) const
|
|
{
|
|
return m_execMaskStack[m_execMaskStack.size()-1].getValue();
|
|
}
|
|
|
|
void assignMasked (ExecValueAccess dst, ExecConstValueAccess src, ExecConstValueAccess mask)
|
|
{
|
|
const VariableType& type = dst.getType();
|
|
|
|
switch (type.getBaseType())
|
|
{
|
|
case VariableType::TYPE_ARRAY:
|
|
{
|
|
int numElems = type.getNumElements();
|
|
for (int elemNdx = 0; elemNdx < numElems; elemNdx++)
|
|
assignMasked(dst.arrayElement(elemNdx), src.arrayElement(elemNdx), mask);
|
|
|
|
break;
|
|
}
|
|
|
|
case VariableType::TYPE_STRUCT:
|
|
{
|
|
int numMembers = (int)type.getMembers().size();
|
|
for (int memberNdx = 0; memberNdx < numMembers; memberNdx++)
|
|
assignMasked(dst.member(memberNdx), src.member(memberNdx), mask);
|
|
|
|
break;
|
|
}
|
|
|
|
case VariableType::TYPE_FLOAT:
|
|
case VariableType::TYPE_INT:
|
|
case VariableType::TYPE_BOOL:
|
|
case VariableType::TYPE_SAMPLER_2D:
|
|
case VariableType::TYPE_SAMPLER_CUBE:
|
|
{
|
|
for (int elemNdx = 0; elemNdx < type.getNumElements(); elemNdx++)
|
|
{
|
|
ExecValueAccess dstElem = dst.component(elemNdx);
|
|
ExecConstValueAccess srcElem = src.component(elemNdx);
|
|
|
|
for (int compNdx = 0; compNdx < EXEC_VEC_WIDTH; compNdx++)
|
|
{
|
|
if (mask.asBool(compNdx))
|
|
dstElem.asScalar(compNdx) = srcElem.asScalar(compNdx);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
DE_FATAL("Unsupported");
|
|
break;
|
|
}
|
|
}
|
|
|
|
} // rsg
|