diff --git a/3rdparty/glsl-optimizer/src/glsl/glsl_lexer.cpp b/3rdparty/glsl-optimizer/src/glsl/glsl_lexer.cpp index 0c363f65..a0373642 100644 --- a/3rdparty/glsl-optimizer/src/glsl/glsl_lexer.cpp +++ b/3rdparty/glsl-optimizer/src/glsl/glsl_lexer.cpp @@ -1961,7 +1961,7 @@ DEPRECATED_ES_KEYWORD(VARYING); case 66: YY_RULE_SETUP #line 294 "src/glsl/glsl_lexer.ll" -KEYWORD(120, 300, 120, 300, CENTROID); +KEYWORD(120, 100, 120, 100, CENTROID); YY_BREAK case 67: YY_RULE_SETUP @@ -1971,17 +1971,17 @@ KEYWORD(120, 100, 120, 100, INVARIANT); case 68: YY_RULE_SETUP #line 296 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 100, 130, 300, FLAT); +KEYWORD(120, 100, 120, 100, FLAT); YY_BREAK case 69: YY_RULE_SETUP #line 297 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 300, SMOOTH); +KEYWORD(120, 100, 120, 100, SMOOTH); YY_BREAK case 70: YY_RULE_SETUP #line 298 "src/glsl/glsl_lexer.ll" -KEYWORD(130, 300, 130, 0, NOPERSPECTIVE); +KEYWORD(120, 100, 120, 100, NOPERSPECTIVE); YY_BREAK case 71: YY_RULE_SETUP diff --git a/3rdparty/glsl-optimizer/src/glsl/glsl_lexer.ll b/3rdparty/glsl-optimizer/src/glsl/glsl_lexer.ll index 90acdc3c..1c32aba6 100644 --- a/3rdparty/glsl-optimizer/src/glsl/glsl_lexer.ll +++ b/3rdparty/glsl-optimizer/src/glsl/glsl_lexer.ll @@ -291,11 +291,11 @@ out return OUT_TOK; inout return INOUT_TOK; uniform return UNIFORM; 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); sampler2D return SAMPLER2D; diff --git a/3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.cpp b/3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.cpp index 5656fcf0..901d26d2 100644 --- a/3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.cpp +++ b/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) { - 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) { 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 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) { id = ++globals->var_counter; diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index c69f6b32..15a4b137 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -3117,6 +3117,12 @@ namespace bgfx if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) && 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 && bx::findIdentifierMatch(code, s_OES_standard_derivatives) ; @@ -3257,6 +3263,9 @@ namespace bgfx , "#define lowp\n" "#define mediump\n" "#define highp\n" + "#define flat\n" + "#define smooth\n" + "#define noperspective\n" ); bx::write(&writer, code, codeLen); diff --git a/tools/shaderc/shaderc.cpp b/tools/shaderc/shaderc.cpp index ae158713..ab866ac1 100644 --- a/tools/shaderc/shaderc.cpp +++ b/tools/shaderc/shaderc.cpp @@ -4,29 +4,29 @@ */ #define _BX_TRACE(_format, ...) \ - do { \ + BX_MACRO_BLOCK_BEGIN \ if (g_verbose) \ { \ fprintf(stderr, BX_FILE_LINE_LITERAL "" _format "\n", ##__VA_ARGS__); \ } \ - } while(0) + BX_MACRO_BLOCK_END #define _BX_WARN(_condition, _format, ...) \ - do { \ + BX_MACRO_BLOCK_BEGIN \ if (!(_condition) ) \ { \ BX_TRACE("WARN " _format, ##__VA_ARGS__); \ } \ - } while(0) + BX_MACRO_BLOCK_END #define _BX_CHECK(_condition, _format, ...) \ - do { \ + BX_MACRO_BLOCK_BEGIN \ if (!(_condition) ) \ { \ BX_TRACE("CHECK " _format, ##__VA_ARGS__); \ bx::debugBreak(); \ } \ - } while(0) + BX_MACRO_BLOCK_END #define BX_TRACE _BX_TRACE #define BX_WARN _BX_WARN @@ -250,6 +250,20 @@ struct Uniform }; typedef std::vector 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 struct UniformRemapDx9 { @@ -485,6 +499,7 @@ private: struct Varying { std::string m_precision; + std::string m_interpolation; std::string m_name; std::string m_type; std::string m_init; @@ -1668,6 +1683,7 @@ void help(const char* _error = NULL) " nacl\n" " osx\n" " windows\n" + " --preprocess Preprocess only.\n" " --raw Do not process shader. No preprocessor, and no glsl-optimizer (GLSL only).\n" " --type Shader type (vertex, fragment)\n" " --varyingdef Path to varying.def.sc file.\n" @@ -1915,6 +1931,7 @@ int main(int _argc, const char* _argv[]) if (NULL != eol) { const char* precision = NULL; + const char* interpolation = NULL; const char* type = parse; if (0 == strncmp(type, "lowp", 4) @@ -1924,11 +1941,20 @@ int main(int _argc, const char* _argv[]) precision = 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 (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 && name < eol @@ -1941,6 +1967,12 @@ int main(int _argc, const char* _argv[]) { 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_name.assign(name, bx::strword(name)-name); 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 shaderOutputs; uint32_t inputHash = 0; @@ -2022,6 +2056,8 @@ int main(int _argc, const char* _argv[]) } } +BX_TRACE("2"); + if (raw) { { @@ -2122,18 +2158,21 @@ int main(int _argc, const char* _argv[]) { const Varying& var = varyingIt->second; const char* name = var.m_name.c_str(); + if (0 == strncmp(name, "a_", 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_interpolation.c_str() , var.m_type.c_str() , name ); } 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_type.c_str() , name @@ -2148,7 +2187,11 @@ int main(int _argc, const char* _argv[]) if (varyingIt != varyingMap.end() ) { 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" ); + if (hlsl < 4) + { + preprocessor.writef( + "#define flat\n" + "#define smooth\n" + "#define noperspective\n" + ); + } + entry[4] = '_'; if ('f' == shaderType) @@ -2208,7 +2260,13 @@ int main(int _argc, const char* _argv[]) if (varyingIt != varyingMap.end() ) { 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 texture2DProjLod texture2DProjLodEXT\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" ); }