mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2024-11-25 00:58:30 -05:00
Added interpolator qualifier support.
This commit is contained in:
parent
c7a257c27d
commit
0ebb4923fc
5 changed files with 96 additions and 29 deletions
|
@ -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
|
||||||
|
|
|
@ -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);
|
centroid KEYWORD(120, 100, 120, 100, CENTROID);
|
||||||
invariant KEYWORD(120, 100, 120, 100, INVARIANT);
|
invariant KEYWORD(120, 100, 120, 100, INVARIANT);
|
||||||
flat KEYWORD(130, 100, 130, 300, FLAT);
|
flat KEYWORD(120, 100, 120, 100, FLAT);
|
||||||
smooth KEYWORD(130, 300, 130, 300, SMOOTH);
|
smooth KEYWORD(120, 100, 120, 100, SMOOTH);
|
||||||
noperspective KEYWORD(130, 300, 130, 0, NOPERSPECTIVE);
|
noperspective KEYWORD(120, 100, 120, 100, NOPERSPECTIVE);
|
||||||
|
|
||||||
sampler1D DEPRECATED_ES_KEYWORD(SAMPLER1D);
|
sampler1D DEPRECATED_ES_KEYWORD(SAMPLER1D);
|
||||||
sampler2D return SAMPLER2D;
|
sampler2D return SAMPLER2D;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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* name = parse = bx::strws(bx::strword(parse) );
|
||||||
const char* column = 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* semantics = parse = bx::strws(bx::strnws (parse) );
|
||||||
const char* assign = parse = bx::strws(bx::strword(parse) );
|
const char* assign = parse = bx::strws(bx::strword(parse) );
|
||||||
const char* init = parse = bx::strws(bx::strnws(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 texture2DGrad texture2DGradEXT\n"
|
||||||
// "#define texture2DProjGrad texture2DProjGradEXT\n"
|
// "#define texture2DProjGrad texture2DProjGradEXT\n"
|
||||||
// "#define textureCubeGrad textureCubeGradEXT\n"
|
// "#define textureCubeGrad textureCubeGradEXT\n"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue