1 /*------------------------------------------------------------------------- 2 * drawElements Quality Program Random Shader Generator 3 * ---------------------------------------------------- 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Variable class. 22 *//*--------------------------------------------------------------------*/ 23 24 #include "rsgVariable.hpp" 25 #include "rsgGeneratorState.hpp" 26 #include "rsgShader.hpp" 27 28 namespace rsg 29 { 30 31 Variable::Variable (const VariableType& type, Storage storage, const char* name) 32 : m_type (type) 33 , m_storage (storage) 34 , m_name (name) 35 , m_layoutLocation (-1) 36 { 37 } 38 39 Variable::~Variable (void) 40 { 41 } 42 43 void Variable::tokenizeDeclaration (GeneratorState& state, TokenStream& str) const 44 { 45 Version targetVersion = state.getProgramParameters().version; 46 47 // \todo [2011-03-10 pyry] Remove precision hacks once precision handling is implemented 48 switch (m_storage) 49 { 50 case STORAGE_CONST: str << Token::CONST; break; 51 case STORAGE_PARAMETER_IN: str << Token::IN; break; 52 case STORAGE_PARAMETER_OUT: str << Token::OUT; break; 53 case STORAGE_PARAMETER_INOUT: str << Token::INOUT; break; 54 55 case STORAGE_UNIFORM: 56 { 57 str << Token::UNIFORM; 58 if (m_type.isFloatOrVec() || m_type.isIntOrVec()) 59 str << Token::MEDIUM_PRECISION; 60 break; 61 } 62 63 case STORAGE_SHADER_IN: 64 { 65 if (targetVersion >= VERSION_300) 66 { 67 if (hasLayoutLocation()) 68 str << Token::LAYOUT << Token::LEFT_PAREN << Token::LOCATION << Token::EQUAL << m_layoutLocation << Token::RIGHT_PAREN; 69 70 str << Token::IN; 71 72 if (state.getShader().getType() == Shader::TYPE_FRAGMENT) 73 str << Token::MEDIUM_PRECISION; 74 } 75 else 76 { 77 DE_ASSERT(!hasLayoutLocation()); 78 79 switch (state.getShader().getType()) 80 { 81 case Shader::TYPE_VERTEX: str << Token::ATTRIBUTE; break; 82 case Shader::TYPE_FRAGMENT: str << Token::VARYING << Token::MEDIUM_PRECISION; break; 83 default: DE_ASSERT(DE_FALSE); break; 84 } 85 } 86 break; 87 } 88 89 case STORAGE_SHADER_OUT: 90 { 91 if (targetVersion >= VERSION_300) 92 { 93 if (hasLayoutLocation()) 94 str << Token::LAYOUT << Token::LEFT_PAREN << Token::LOCATION << Token::EQUAL << m_layoutLocation << Token::RIGHT_PAREN; 95 96 str << Token::OUT << Token::MEDIUM_PRECISION; 97 } 98 else 99 { 100 DE_ASSERT(!hasLayoutLocation()); 101 102 if (state.getShader().getType() == Shader::TYPE_VERTEX) 103 str << Token::VARYING << Token::MEDIUM_PRECISION; 104 else 105 DE_ASSERT(DE_FALSE); 106 } 107 break; 108 } 109 110 case STORAGE_LOCAL: 111 default: 112 /* nothing */ 113 break; 114 } 115 116 m_type.tokenizeShortType(str); 117 118 DE_ASSERT(m_name != ""); 119 str << Token(m_name.c_str()); 120 } 121 122 } // rsg 123