From d3172015d5061ec00c9d5dabd392a205a960b802 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 1 May 2016 22:53:20 +0200 Subject: [PATCH] Allow setting custom filename on shader, fix diagnostics for Mesa GLES2 --- panda/src/glstuff/glShaderContext_src.cxx | 13 ++++++++-- panda/src/gobj/shader.I | 30 +++++++++++++++++++++++ panda/src/gobj/shader.h | 1 + 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index 46c8da2d3b..fbf1e4e1a0 100644 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -2666,10 +2666,10 @@ glsl_report_shader_errors(GLuint shader, Shader::ShaderType type, bool fatal) { istringstream log(info_log); string line; while (getline(log, line)) { - int fileno, lineno; + int fileno, lineno, colno; int prefixlen = 0; - // First is AMDIntel driver syntax, second is NVIDIA syntax. + // This first format is used by the majority of compilers. if (sscanf(line.c_str(), "ERROR: %d:%d: %n", &fileno, &lineno, &prefixlen) == 2 && prefixlen > 0) { @@ -2688,10 +2688,19 @@ glsl_report_shader_errors(GLuint shader, Shader::ShaderType type, bool fatal) { } else if (sscanf(line.c_str(), "%d(%d) : %n", &fileno, &lineno, &prefixlen) == 2 && prefixlen > 0) { + // This is the format NVIDIA uses. Filename fn = _shader->get_filename_from_index(fileno, type); GLCAT.error(false) << fn << "(" << lineno << ") : " << (line.c_str() + prefixlen) << "\n"; + } else if (sscanf(line.c_str(), "%d:%d(%d): %n", &fileno, &lineno, &colno, &prefixlen) == 3 + && prefixlen > 0) { + + // This is the format for Mesa's OpenGL ES 2 implementation. + Filename fn = _shader->get_filename_from_index(fileno, type); + GLCAT.error(false) + << fn << ":" << lineno << "(" << colno << "): " << (line.c_str() + prefixlen) << "\n"; + } else if (!fatal) { GLCAT.warning(false) << line << "\n"; diff --git a/panda/src/gobj/shader.I b/panda/src/gobj/shader.I index f1fb1dabf2..43aade9b95 100644 --- a/panda/src/gobj/shader.I +++ b/panda/src/gobj/shader.I @@ -50,6 +50,36 @@ get_filename(ShaderType type) const { } } +/** + * Sets the Shader's filename for the given shader type. Useful for + * associating a shader created with Shader.make with a name for diagnostics. + */ +INLINE void Shader:: +set_filename(ShaderType type, const Filename &filename) { + switch (type) { + case ST_vertex: + _filename._vertex = filename; + break; + case ST_fragment: + _filename._fragment = filename; + break; + case ST_geometry: + _filename._geometry = filename; + break; + case ST_tess_control: + _filename._tess_control = filename; + break; + case ST_tess_evaluation: + _filename._tess_evaluation = filename; + break; + case ST_compute: + _filename._compute = filename; + break; + default: + _filename._shared = filename; + } +} + /** * Return the Shader's text for the given shader type. */ diff --git a/panda/src/gobj/shader.h b/panda/src/gobj/shader.h index dbdde6f5ba..106350066a 100644 --- a/panda/src/gobj/shader.h +++ b/panda/src/gobj/shader.h @@ -98,6 +98,7 @@ PUBLISHED: static PT(Shader) make_compute(ShaderLanguage lang, const string &body); INLINE Filename get_filename(ShaderType type = ST_none) const; + INLINE void set_filename(ShaderType type, const Filename &filename); INLINE const string &get_text(ShaderType type = ST_none) const; INLINE bool get_error_flag() const; INLINE ShaderLanguage get_language() const;