13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program Random Shader Generator 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ---------------------------------------------------- 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*! 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Shader Source Formatter. 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "rsgPrettyPrinter.hpp" 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deStringUtil.hpp" 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace rsg 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const char* s_tokenStr[] = 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_NULL, // IDENTIFIER, 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "struct", // STRUCT, 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "invariant", // INVARIANT, 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "precision", // PRECISION, 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "void", // VOID, 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "break", // BREAK, 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "continue", // CONTINUE, 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "do ", // DO, 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "while ", // WHILE, 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "else ", // ELSE, 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "for ", // FOR, 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "if ", // IF, 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "discard", // DISCARD, 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "return ", // RETURN, 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "++", // INC_OP, 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "--", // DEC_OP, 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "(", // LEFT_PAREN, 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ")", // RIGHT_PAREN, 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "[", // LEFT_BRACKET, 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "]", // RIGHT_BRACKET, 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "{", // LEFT_BRACE, 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "}", // RIGHT_BRACE, 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ".", // DOT, 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ", ", // COMMA, 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " : ", // COLON, 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ";", // SEMICOLON, 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " - ", // MINUS, 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " + ", // PLUS, 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " * ", // MUL, 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " / ", // DIV, 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " % ", // MOD, 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " ? ", // QUESTION, 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "bool", // BOOL, 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "bvec2", // BVEC2, 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "bvec3", // BVEC3, 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "bvec4", // BVEC4, 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "int", // INT, 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "ivec2", // IVEC2, 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "ivec3", // IVEC3, 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "ivec4", // IVEC4, 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "float", // FLOAT, 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "vec2", // VEC2, 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "vec3", // VEC3, 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "vec4", // VEC4, 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "mat2", // MAT2, 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "mat3", // MAT3, 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "mat4", // MAT4, 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "sampler2D", // SAMPLER2D, 803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "samplerCube", // SAMPLERCUBE, 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_NULL, // FLOAT_LITERAL, 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_NULL, // INT_LITERAL, 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_NULL, // BOOL_LITERAL, 843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " = ", // EQUAL, 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " *= ", // MUL_ASSIGN, 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " /= ", // DIV_ASSIGN, 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " += ", // ADD_ASSIGN, 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " -= ", // SUB_ASSIGN, 893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " < ", // CMP_LT, 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " > ", // CMP_GT, 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " <= ", // CMP_LE, 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " >= ", // CMP_GE, 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " == ", // CMP_EQ, 943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " != ", // CMP_NE, 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " && ", // LOGICAL_AND, 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " || ", // LOGICAL_OR, 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "!", // LOGICAL_NOT, 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " ^^ ", // LOGICAL_XOR, 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "attribute", // ATTRIBUTE, 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "uniform", // UNIFORM, 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "varying", // VARYING, 1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "const", // CONST, 1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "flat", // FLAT, 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "highp", // HIGH_PRECISION, 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "mediump", // MEDIUM_PRECISION, 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "lowp", // LOW_PRECISION, 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "in", // IN, 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "out", // OUT, 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "inout", // INOUT, 1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "layout", // LAYOUT, 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "location", // LOCATION, 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_NULL, // INDENT_INC, 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_NULL, // INDENT_DEC, 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "\n" // NEWLINE, 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1173c827367444ee418f129b2c238299f49d3264554Jarkko PoyryPrettyPrinter::PrettyPrinter (std::ostringstream& str) 1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : m_str (str) 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_indentDepth (0) 1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline const char* PrettyPrinter::getSimpleTokenStr (Token::Type token) 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(de::inBounds<int>(token, 0, (int)DE_LENGTH_OF_ARRAY(s_tokenStr))); 1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return s_tokenStr[token]; 1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid PrettyPrinter::append (const TokenStream& tokens) 1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int ndx = 0; ndx < tokens.getSize(); ndx++) 1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry processToken(tokens[ndx]); 1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline bool isIdentifierChar (char c) 1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return de::inRange(c, 'a', 'z') || de::inRange(c, 'A', 'Z') || de::inRange(c, '0', '9') || c == '_'; 1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid PrettyPrinter::processToken (const Token& token) 1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool prevIsIdentifierChar = m_line.length() > 0 && isIdentifierChar(m_line[m_line.length()-1]); 1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (token.getType()) 1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case Token::IDENTIFIER: 1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (prevIsIdentifierChar) 1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_line += " "; 1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_line += token.getIdentifier(); 1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case Token::FLOAT_LITERAL: 1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::string f = de::toString(token.getFloat()); 1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (f.find('.') == std::string::npos) 1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry f += ".0"; // Make sure value parses as float 1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_line += f; 1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case Token::INT_LITERAL: 1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_line += de::toString(token.getInt()); 1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case Token::BOOL_LITERAL: 1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_line += (token.getBool() ? "true" : "false"); 1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case Token::INDENT_INC: 1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_indentDepth += 1; 1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case Token::INDENT_DEC: 1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_indentDepth -= 1; 1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case Token::NEWLINE: 1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Indent 1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < m_indentDepth; i++) 1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_str << "\t"; 1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Flush line to source 1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_str << m_line + "\n"; 1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_line = ""; 1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* tokenStr = getSimpleTokenStr(token.getType()); 1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (prevIsIdentifierChar && isIdentifierChar(tokenStr[0])) 1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_line += " "; 1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_line += tokenStr; 1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // rsg 199