/*------------------------------------------------------------------------- * 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 Variable class. *//*--------------------------------------------------------------------*/ #include "rsgVariable.hpp" #include "rsgGeneratorState.hpp" #include "rsgShader.hpp" namespace rsg { Variable::Variable (const VariableType& type, Storage storage, const char* name) : m_type (type) , m_storage (storage) , m_name (name) , m_layoutLocation (-1) { } Variable::~Variable (void) { } void Variable::tokenizeDeclaration (GeneratorState& state, TokenStream& str) const { Version targetVersion = state.getProgramParameters().version; // \todo [2011-03-10 pyry] Remove precision hacks once precision handling is implemented switch (m_storage) { case STORAGE_CONST: str << Token::CONST; break; case STORAGE_PARAMETER_IN: str << Token::IN; break; case STORAGE_PARAMETER_OUT: str << Token::OUT; break; case STORAGE_PARAMETER_INOUT: str << Token::INOUT; break; case STORAGE_UNIFORM: { str << Token::UNIFORM; if (m_type.isFloatOrVec() || m_type.isIntOrVec()) str << Token::MEDIUM_PRECISION; break; } case STORAGE_SHADER_IN: { if (targetVersion >= VERSION_300) { if (hasLayoutLocation()) str << Token::LAYOUT << Token::LEFT_PAREN << Token::LOCATION << Token::EQUAL << m_layoutLocation << Token::RIGHT_PAREN; str << Token::IN; if (state.getShader().getType() == Shader::TYPE_FRAGMENT) str << Token::MEDIUM_PRECISION; } else { DE_ASSERT(!hasLayoutLocation()); switch (state.getShader().getType()) { case Shader::TYPE_VERTEX: str << Token::ATTRIBUTE; break; case Shader::TYPE_FRAGMENT: str << Token::VARYING << Token::MEDIUM_PRECISION; break; default: DE_ASSERT(DE_FALSE); break; } } break; } case STORAGE_SHADER_OUT: { if (targetVersion >= VERSION_300) { if (hasLayoutLocation()) str << Token::LAYOUT << Token::LEFT_PAREN << Token::LOCATION << Token::EQUAL << m_layoutLocation << Token::RIGHT_PAREN; str << Token::OUT << Token::MEDIUM_PRECISION; } else { DE_ASSERT(!hasLayoutLocation()); if (state.getShader().getType() == Shader::TYPE_VERTEX) str << Token::VARYING << Token::MEDIUM_PRECISION; else DE_ASSERT(DE_FALSE); } break; } case STORAGE_LOCAL: default: /* nothing */ break; } m_type.tokenizeShortType(str); DE_ASSERT(m_name != ""); str << Token(m_name.c_str()); } } // rsg