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