mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2024-11-28 18:45:54 -05:00
Pass precision qualifier from varying.def.sc to shader.
This commit is contained in:
parent
3273b04f6f
commit
3e3de1e35a
2 changed files with 40 additions and 9 deletions
Binary file not shown.
|
@ -388,6 +388,7 @@ private:
|
||||||
|
|
||||||
struct Varying
|
struct Varying
|
||||||
{
|
{
|
||||||
|
std::string m_precision;
|
||||||
std::string m_name;
|
std::string m_name;
|
||||||
std::string m_type;
|
std::string m_type;
|
||||||
std::string m_init;
|
std::string m_init;
|
||||||
|
@ -507,7 +508,10 @@ bool compileGLSLShader(bx::CommandLine& _cmdLine, const std::string& _code, bx::
|
||||||
{
|
{
|
||||||
const glslopt_shader_type type = tolower(_cmdLine.findOption('\0', "type")[0]) == 'f' ? kGlslOptShaderFragment : kGlslOptShaderVertex;
|
const glslopt_shader_type type = tolower(_cmdLine.findOption('\0', "type")[0]) == 'f' ? kGlslOptShaderFragment : kGlslOptShaderVertex;
|
||||||
|
|
||||||
glslopt_ctx* ctx = glslopt_initialize(false);
|
const char* profile = _cmdLine.findOption('p', "profile");
|
||||||
|
bool gles = NULL == profile;
|
||||||
|
|
||||||
|
glslopt_ctx* ctx = glslopt_initialize(gles);
|
||||||
|
|
||||||
glslopt_shader* shader = glslopt_optimize(ctx, type, _code.c_str(), 0);
|
glslopt_shader* shader = glslopt_optimize(ctx, type, _code.c_str(), 0);
|
||||||
|
|
||||||
|
@ -521,8 +525,7 @@ bool compileGLSLShader(bx::CommandLine& _cmdLine, const std::string& _code, bx::
|
||||||
|
|
||||||
const char* optimizedShader = glslopt_get_output(shader);
|
const char* optimizedShader = glslopt_get_output(shader);
|
||||||
|
|
||||||
const char* profile = _cmdLine.findOption('p', "profile");
|
if (gles)
|
||||||
if (NULL == profile)
|
|
||||||
{
|
{
|
||||||
writef(_writer, "#ifdef GL_ES\n");
|
writef(_writer, "#ifdef GL_ES\n");
|
||||||
writef(_writer, "precision highp float;\n");
|
writef(_writer, "precision highp float;\n");
|
||||||
|
@ -1037,7 +1040,7 @@ bool compileHLSLShaderDx11(bx::CommandLine& _cmdLine, const std::string& _code,
|
||||||
|
|
||||||
struct Preprocessor
|
struct Preprocessor
|
||||||
{
|
{
|
||||||
Preprocessor(const char* _filePath, const char* _includeDir = NULL)
|
Preprocessor(const char* _filePath, bool _gles, const char* _includeDir = NULL)
|
||||||
: m_tagptr(m_tags)
|
: m_tagptr(m_tags)
|
||||||
, m_scratchPos(0)
|
, m_scratchPos(0)
|
||||||
, m_fgetsPos(0)
|
, m_fgetsPos(0)
|
||||||
|
@ -1079,7 +1082,10 @@ struct Preprocessor
|
||||||
addInclude(_includeDir);
|
addInclude(_includeDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_default = "#define lowp\n#define mediump\n#define highp\n";
|
if (!_gles)
|
||||||
|
{
|
||||||
|
m_default = "#define lowp\n#define mediump\n#define highp\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setDefine(const char* _define)
|
void setDefine(const char* _define)
|
||||||
|
@ -1379,6 +1385,7 @@ int main(int _argc, const char* _argv[])
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t gles = 0;
|
||||||
uint32_t hlsl = 2;
|
uint32_t hlsl = 2;
|
||||||
const char* profile = cmdLine.findOption('p', "profile");
|
const char* profile = cmdLine.findOption('p', "profile");
|
||||||
if (NULL != profile)
|
if (NULL != profile)
|
||||||
|
@ -1396,6 +1403,10 @@ int main(int _argc, const char* _argv[])
|
||||||
hlsl = 5;
|
hlsl = 5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gles = 2;
|
||||||
|
}
|
||||||
|
|
||||||
const char* bin2c = NULL;
|
const char* bin2c = NULL;
|
||||||
if (cmdLine.hasArg("bin2c") )
|
if (cmdLine.hasArg("bin2c") )
|
||||||
|
@ -1428,7 +1439,7 @@ int main(int _argc, const char* _argv[])
|
||||||
bool preprocessOnly = cmdLine.hasArg("preprocess");
|
bool preprocessOnly = cmdLine.hasArg("preprocess");
|
||||||
const char* includeDir = cmdLine.findOption('i');
|
const char* includeDir = cmdLine.findOption('i');
|
||||||
|
|
||||||
Preprocessor preprocessor(filePath, includeDir);
|
Preprocessor preprocessor(filePath, 0 != gles, includeDir);
|
||||||
|
|
||||||
std::string dir;
|
std::string dir;
|
||||||
{
|
{
|
||||||
|
@ -1544,7 +1555,16 @@ int main(int _argc, const char* _argv[])
|
||||||
const char* eol = strchr(parse, ';');
|
const char* eol = strchr(parse, ';');
|
||||||
if (NULL != eol)
|
if (NULL != eol)
|
||||||
{
|
{
|
||||||
|
const char* precision = NULL;
|
||||||
const char* type = parse;
|
const char* type = parse;
|
||||||
|
|
||||||
|
if (0 == strncmp(type, "lowp", 4)
|
||||||
|
|| 0 == strncmp(type, "mediump", 7)
|
||||||
|
|| 0 == strncmp(type, "highp", 5) )
|
||||||
|
{
|
||||||
|
precision = 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) );
|
||||||
|
@ -1558,6 +1578,10 @@ int main(int _argc, const char* _argv[])
|
||||||
&& semantics < eol)
|
&& semantics < eol)
|
||||||
{
|
{
|
||||||
Varying var;
|
Varying var;
|
||||||
|
if (NULL != precision)
|
||||||
|
{
|
||||||
|
var.m_precision.assign(precision, bx::strword(precision)-precision);
|
||||||
|
}
|
||||||
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);
|
||||||
|
@ -1630,7 +1654,6 @@ int main(int _argc, const char* _argv[])
|
||||||
"#define ivec4 vec4\n"
|
"#define ivec4 vec4\n"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
for (InOut::const_iterator it = shaderInputs.begin(), itEnd = shaderInputs.end(); it != itEnd; ++it)
|
for (InOut::const_iterator it = shaderInputs.begin(), itEnd = shaderInputs.end(); it != itEnd; ++it)
|
||||||
{
|
{
|
||||||
VaryingMap::const_iterator varyingIt = varyingMap.find(*it);
|
VaryingMap::const_iterator varyingIt = varyingMap.find(*it);
|
||||||
|
@ -1641,11 +1664,19 @@ int main(int _argc, const char* _argv[])
|
||||||
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;\n", var.m_type.c_str(), name);
|
preprocessor.writef("attribute %s %s %s;\n"
|
||||||
|
, var.m_precision.c_str()
|
||||||
|
, var.m_type.c_str()
|
||||||
|
, name
|
||||||
|
);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
preprocessor.writef("varying %s %s;\n", var.m_type.c_str(), name);
|
preprocessor.writef("varying %s %s %s;\n"
|
||||||
|
, var.m_precision.c_str()
|
||||||
|
, var.m_type.c_str()
|
||||||
|
, name
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue