Bladeren bron

Added interpolator qualifier support.

Branimir Karadžić 11 jaren geleden
bovenliggende
commit
0ebb4923fc

+ 4 - 4
3rdparty/glsl-optimizer/src/glsl/glsl_lexer.cpp

@@ -1961,7 +1961,7 @@ DEPRECATED_ES_KEYWORD(VARYING);
 case 66:
 case 66:
 YY_RULE_SETUP
 YY_RULE_SETUP
 #line 294 "src/glsl/glsl_lexer.ll"
 #line 294 "src/glsl/glsl_lexer.ll"
-KEYWORD(120, 300, 120, 300, CENTROID);
+KEYWORD(120, 100, 120, 100, CENTROID);
 	YY_BREAK
 	YY_BREAK
 case 67:
 case 67:
 YY_RULE_SETUP
 YY_RULE_SETUP
@@ -1971,17 +1971,17 @@ KEYWORD(120, 100, 120, 100, INVARIANT);
 case 68:
 case 68:
 YY_RULE_SETUP
 YY_RULE_SETUP
 #line 296 "src/glsl/glsl_lexer.ll"
 #line 296 "src/glsl/glsl_lexer.ll"
-KEYWORD(130, 100, 130, 300, FLAT);
+KEYWORD(120, 100, 120, 100, FLAT);
 	YY_BREAK
 	YY_BREAK
 case 69:
 case 69:
 YY_RULE_SETUP
 YY_RULE_SETUP
 #line 297 "src/glsl/glsl_lexer.ll"
 #line 297 "src/glsl/glsl_lexer.ll"
-KEYWORD(130, 300, 130, 300, SMOOTH);
+KEYWORD(120, 100, 120, 100, SMOOTH);
 	YY_BREAK
 	YY_BREAK
 case 70:
 case 70:
 YY_RULE_SETUP
 YY_RULE_SETUP
 #line 298 "src/glsl/glsl_lexer.ll"
 #line 298 "src/glsl/glsl_lexer.ll"
-KEYWORD(130, 300, 130, 0, NOPERSPECTIVE);
+KEYWORD(120, 100, 120, 100, NOPERSPECTIVE);
 	YY_BREAK
 	YY_BREAK
 case 71:
 case 71:
 YY_RULE_SETUP
 YY_RULE_SETUP

+ 5 - 5
3rdparty/glsl-optimizer/src/glsl/glsl_lexer.ll

@@ -291,11 +291,11 @@ out		return OUT_TOK;
 inout		return INOUT_TOK;
 inout		return INOUT_TOK;
 uniform		return UNIFORM;
 uniform		return UNIFORM;
 varying		DEPRECATED_ES_KEYWORD(VARYING);
 varying		DEPRECATED_ES_KEYWORD(VARYING);
-centroid	KEYWORD(120, 300, 120, 300, CENTROID);
-invariant	KEYWORD(120, 100, 120, 100, INVARIANT);
-flat		KEYWORD(130, 100, 130, 300, FLAT);
-smooth		KEYWORD(130, 300, 130, 300, SMOOTH);
-noperspective	KEYWORD(130, 300, 130, 0, NOPERSPECTIVE);
+centroid		KEYWORD(120, 100, 120, 100, CENTROID);
+invariant		KEYWORD(120, 100, 120, 100, INVARIANT);
+flat			KEYWORD(120, 100, 120, 100, FLAT);
+smooth			KEYWORD(120, 100, 120, 100, SMOOTH);
+noperspective	KEYWORD(120, 100, 120, 100, NOPERSPECTIVE);
 
 
 sampler1D	DEPRECATED_ES_KEYWORD(SAMPLER1D);
 sampler1D	DEPRECATED_ES_KEYWORD(SAMPLER1D);
 sampler2D	return SAMPLER2D;
 sampler2D	return SAMPLER2D;

+ 2 - 2
3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.cpp

@@ -303,7 +303,7 @@ void ir_print_glsl_visitor::newline_deindent()
 
 
 void ir_print_glsl_visitor::print_var_name (ir_variable* v)
 void ir_print_glsl_visitor::print_var_name (ir_variable* v)
 {
 {
-    long id = (long)hash_table_find (globals->var_hash, v);
+    uintptr_t id = (uintptr_t)hash_table_find (globals->var_hash, v);
 	if (!id && v->data.mode == ir_var_temporary)
 	if (!id && v->data.mode == ir_var_temporary)
 	{
 	{
         id = ++globals->var_counter;
         id = ++globals->var_counter;
@@ -418,7 +418,7 @@ void ir_print_glsl_visitor::visit(ir_variable *ir)
 	// give an id to any variable defined in a function that is not an uniform
 	// give an id to any variable defined in a function that is not an uniform
 	if ((this->mode == kPrintGlslNone && ir->data.mode != ir_var_uniform))
 	if ((this->mode == kPrintGlslNone && ir->data.mode != ir_var_uniform))
 	{
 	{
-		long id = (long)hash_table_find (globals->var_hash, ir);
+		uintptr_t id = (uintptr_t)hash_table_find (globals->var_hash, ir);
 		if (id == 0)
 		if (id == 0)
 		{
 		{
 			id = ++globals->var_counter;
 			id = ++globals->var_counter;

+ 9 - 0
src/renderer_gl.cpp

@@ -3117,6 +3117,12 @@ namespace bgfx
 				if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES)
 				if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES)
 				&&  BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES < 30) )
 				&&  BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES < 30) )
 				{
 				{
+					writeString(&writer
+						, "#define flat\n"
+						  "#define smooth\n"
+						  "#define noperspective\n"
+						);
+
 					bool usesDerivatives = s_extension[Extension::OES_standard_derivatives].m_supported 
 					bool usesDerivatives = s_extension[Extension::OES_standard_derivatives].m_supported 
 						&& bx::findIdentifierMatch(code, s_OES_standard_derivatives)
 						&& bx::findIdentifierMatch(code, s_OES_standard_derivatives)
 						;
 						;
@@ -3257,6 +3263,9 @@ namespace bgfx
 							, "#define lowp\n"
 							, "#define lowp\n"
 							  "#define mediump\n"
 							  "#define mediump\n"
 							  "#define highp\n"
 							  "#define highp\n"
+							  "#define flat\n"
+							  "#define smooth\n"
+							  "#define noperspective\n"
 							);
 							);
 
 
 					bx::write(&writer, code, codeLen);
 					bx::write(&writer, code, codeLen);

+ 76 - 18
tools/shaderc/shaderc.cpp

@@ -4,29 +4,29 @@
  */
  */
 
 
 #define _BX_TRACE(_format, ...) \
 #define _BX_TRACE(_format, ...) \
-				do { \
+				BX_MACRO_BLOCK_BEGIN \
 					if (g_verbose) \
 					if (g_verbose) \
 					{ \
 					{ \
 						fprintf(stderr, BX_FILE_LINE_LITERAL "" _format "\n", ##__VA_ARGS__); \
 						fprintf(stderr, BX_FILE_LINE_LITERAL "" _format "\n", ##__VA_ARGS__); \
 					} \
 					} \
-				} while(0)
+				BX_MACRO_BLOCK_END
 
 
 #define _BX_WARN(_condition, _format, ...) \
 #define _BX_WARN(_condition, _format, ...) \
-				do { \
+				BX_MACRO_BLOCK_BEGIN \
 					if (!(_condition) ) \
 					if (!(_condition) ) \
 					{ \
 					{ \
 						BX_TRACE("WARN " _format, ##__VA_ARGS__); \
 						BX_TRACE("WARN " _format, ##__VA_ARGS__); \
 					} \
 					} \
-				} while(0)
+				BX_MACRO_BLOCK_END
 
 
 #define _BX_CHECK(_condition, _format, ...) \
 #define _BX_CHECK(_condition, _format, ...) \
-				do { \
+				BX_MACRO_BLOCK_BEGIN \
 					if (!(_condition) ) \
 					if (!(_condition) ) \
 					{ \
 					{ \
 						BX_TRACE("CHECK " _format, ##__VA_ARGS__); \
 						BX_TRACE("CHECK " _format, ##__VA_ARGS__); \
 						bx::debugBreak(); \
 						bx::debugBreak(); \
 					} \
 					} \
-				} while(0)
+				BX_MACRO_BLOCK_END
 
 
 #define BX_TRACE _BX_TRACE
 #define BX_TRACE _BX_TRACE
 #define BX_WARN  _BX_WARN
 #define BX_WARN  _BX_WARN
@@ -250,6 +250,20 @@ struct Uniform
 };
 };
 typedef std::vector<Uniform> UniformArray;
 typedef std::vector<Uniform> UniformArray;
 
 
+const char* interpolationDx11(const char* _glsl)
+{
+	if (0 == strcmp(_glsl, "smooth") )
+	{
+		return "linear";
+	}
+	else if (0 == strcmp(_glsl, "flat") )
+	{
+		return "nointerpolation";
+	}
+
+	return _glsl; // noperspective
+}
+
 #if BX_PLATFORM_WINDOWS
 #if BX_PLATFORM_WINDOWS
 struct UniformRemapDx9
 struct UniformRemapDx9
 {
 {
@@ -485,6 +499,7 @@ private:
 struct Varying
 struct Varying
 {
 {
 	std::string m_precision;
 	std::string m_precision;
+	std::string m_interpolation;
 	std::string m_name;
 	std::string m_name;
 	std::string m_type;
 	std::string m_type;
 	std::string m_init;
 	std::string m_init;
@@ -1668,6 +1683,7 @@ void help(const char* _error = NULL)
 		  "           nacl\n"
 		  "           nacl\n"
 		  "           osx\n"
 		  "           osx\n"
 		  "           windows\n"
 		  "           windows\n"
+		  "      --preprocess              Preprocess only.\n"
 		  "      --raw                     Do not process shader. No preprocessor, and no glsl-optimizer (GLSL only).\n"
 		  "      --raw                     Do not process shader. No preprocessor, and no glsl-optimizer (GLSL only).\n"
 		  "      --type <type>             Shader type (vertex, fragment)\n"
 		  "      --type <type>             Shader type (vertex, fragment)\n"
 		  "      --varyingdef <file path>  Path to varying.def.sc file.\n"
 		  "      --varyingdef <file path>  Path to varying.def.sc file.\n"
@@ -1915,6 +1931,7 @@ int main(int _argc, const char* _argv[])
 			if (NULL != eol)
 			if (NULL != eol)
 			{
 			{
 				const char* precision = NULL;
 				const char* precision = NULL;
+				const char* interpolation = NULL;
 				const char* type = parse;
 				const char* type = parse;
 
 
 				if (0 == strncmp(type, "lowp", 4)
 				if (0 == strncmp(type, "lowp", 4)
@@ -1924,11 +1941,20 @@ int main(int _argc, const char* _argv[])
 					precision = type;
 					precision = type;
 					type = parse = bx::strws(bx::strword(parse) );
 					type = parse = bx::strws(bx::strword(parse) );
 				}
 				}
-				const char* name = parse = bx::strws(bx::strword(parse) );
-				const char* column = parse = bx::strws(bx::strword(parse) );
-				const char* semantics = parse = bx::strws(bx::strnws(parse) );
-				const char* assign = parse = bx::strws(bx::strword(parse) );
-				const char* init = parse = bx::strws(bx::strnws(parse) );
+
+				if (0 == strncmp(type, "flat", 4)
+				||  0 == strncmp(type, "smooth", 6)
+				||  0 == strncmp(type, "noperspective", 13) )
+				{
+					interpolation = type;
+					type = parse = bx::strws(bx::strword(parse) );
+				}
+
+				const char* name      = parse = bx::strws(bx::strword(parse) );
+				const char* column    = parse = bx::strws(bx::strword(parse) );
+				const char* semantics = parse = bx::strws(bx::strnws (parse) );
+				const char* assign    = parse = bx::strws(bx::strword(parse) );
+				const char* init      = parse = bx::strws(bx::strnws (parse) );
 
 
 				if (type < eol
 				if (type < eol
 				&&  name < eol
 				&&  name < eol
@@ -1941,6 +1967,12 @@ int main(int _argc, const char* _argv[])
 					{
 					{
 						var.m_precision.assign(precision, bx::strword(precision)-precision);
 						var.m_precision.assign(precision, bx::strword(precision)-precision);
 					}
 					}
+
+					if (NULL != interpolation)
+					{
+						var.m_interpolation.assign(interpolation, bx::strword(interpolation)-interpolation);
+					}
+
 					var.m_type.assign(type, bx::strword(type)-type);
 					var.m_type.assign(type, bx::strword(type)-type);
 					var.m_name.assign(name, bx::strword(name)-name);
 					var.m_name.assign(name, bx::strword(name)-name);
 					var.m_semantics.assign(semantics, bx::strword(semantics)-semantics);
 					var.m_semantics.assign(semantics, bx::strword(semantics)-semantics);
@@ -1959,6 +1991,8 @@ int main(int _argc, const char* _argv[])
 			}
 			}
 		}
 		}
 
 
+BX_TRACE("1");
+
 		InOut shaderInputs;
 		InOut shaderInputs;
 		InOut shaderOutputs;
 		InOut shaderOutputs;
 		uint32_t inputHash = 0;
 		uint32_t inputHash = 0;
@@ -2022,6 +2056,8 @@ int main(int _argc, const char* _argv[])
 			}
 			}
 		}
 		}
 
 
+BX_TRACE("2");
+
 		if (raw)
 		if (raw)
 		{
 		{
 			{
 			{
@@ -2122,18 +2158,21 @@ int main(int _argc, const char* _argv[])
 						{
 						{
 							const Varying& var = varyingIt->second;
 							const Varying& var = varyingIt->second;
 							const char* name = var.m_name.c_str();
 							const char* name = var.m_name.c_str();
+
 							if (0 == strncmp(name, "a_", 2)
 							if (0 == strncmp(name, "a_", 2)
 							||  0 == strncmp(name, "i_", 2) )
 							||  0 == strncmp(name, "i_", 2) )
 							{
 							{
-								preprocessor.writef("attribute %s %s %s;\n"
+								preprocessor.writef("attribute %s %s %s %s;\n"
 										, var.m_precision.c_str()
 										, var.m_precision.c_str()
+										, var.m_interpolation.c_str()
 										, var.m_type.c_str()
 										, var.m_type.c_str()
 										, name
 										, name
 										);
 										);
 							}
 							}
 							else
 							else
 							{
 							{
-								preprocessor.writef("varying %s %s %s;\n"
+								preprocessor.writef("%s varying %s %s %s;\n"
+										, var.m_interpolation.c_str()
 										, var.m_precision.c_str()
 										, var.m_precision.c_str()
 										, var.m_type.c_str()
 										, var.m_type.c_str()
 										, name
 										, name
@@ -2148,7 +2187,11 @@ int main(int _argc, const char* _argv[])
 						if (varyingIt != varyingMap.end() )
 						if (varyingIt != varyingMap.end() )
 						{
 						{
 							const Varying& var = varyingIt->second;
 							const Varying& var = varyingIt->second;
-							preprocessor.writef("varying %s %s;\n", var.m_type.c_str(), var.m_name.c_str() );
+							preprocessor.writef("%s varying %s %s;\n"
+								, var.m_interpolation.c_str()
+								, var.m_type.c_str()
+								, var.m_name.c_str()
+								);
 						}
 						}
 					}
 					}
 				}
 				}
@@ -2169,6 +2212,15 @@ int main(int _argc, const char* _argv[])
 						"#define mat4 float4x4\n"
 						"#define mat4 float4x4\n"
 						);
 						);
 
 
+					if (hlsl < 4)
+					{
+						preprocessor.writef(
+							"#define flat\n"
+							"#define smooth\n"
+							"#define noperspective\n"
+							);
+					}
+
 					entry[4] = '_';
 					entry[4] = '_';
 
 
 					if ('f' == shaderType)
 					if ('f' == shaderType)
@@ -2208,7 +2260,13 @@ int main(int _argc, const char* _argv[])
 							if (varyingIt != varyingMap.end() )
 							if (varyingIt != varyingMap.end() )
 							{
 							{
 								const Varying& var = varyingIt->second;
 								const Varying& var = varyingIt->second;
-								preprocessor.writef(" \\\n\t%s%s %s : %s", arg++ > 0 ? ", " : "  ", var.m_type.c_str(), var.m_name.c_str(), var.m_semantics.c_str() );
+								preprocessor.writef(" \\\n\t%s%s %s %s : %s"
+									, arg++ > 0 ? ", " : "  "
+									, interpolationDx11(var.m_interpolation.c_str() )
+									, var.m_type.c_str()
+									, var.m_name.c_str()
+									, var.m_semantics.c_str()
+									);
 							}
 							}
 						}
 						}
 
 
@@ -2427,9 +2485,9 @@ int main(int _argc, const char* _argv[])
 										  "#define texture2DLod texture2DLodEXT\n"
 										  "#define texture2DLod texture2DLodEXT\n"
 										  "#define texture2DProjLod texture2DProjLodEXT\n"
 										  "#define texture2DProjLod texture2DProjLodEXT\n"
 										  "#define textureCubeLod textureCubeLodEXT\n"
 										  "#define textureCubeLod textureCubeLodEXT\n"
-	//									  "#define texture2DGrad texture2DGradEXT\n"
-	//									  "#define texture2DProjGrad texture2DProjGradEXT\n"
-	//									  "#define textureCubeGrad textureCubeGradEXT\n"
+//										  "#define texture2DGrad texture2DGradEXT\n"
+//										  "#define texture2DProjGrad texture2DProjGradEXT\n"
+//										  "#define textureCubeGrad textureCubeGradEXT\n"
 										);
 										);
 								}
 								}