Improve GLSL error reporting, fix GLSL ES shader loading

This commit is contained in:
rdb 2015-04-04 20:52:44 +02:00
parent 41184b1189
commit 059f67d1b5
3 changed files with 28 additions and 13 deletions

View File

@ -1382,7 +1382,7 @@ reset() {
// if it failed to compile. This default shader just outputs // if it failed to compile. This default shader just outputs
// a red color, indicating that something went wrong. // a red color, indicating that something went wrong.
if (_default_shader == NULL) { if (_default_shader == NULL) {
_default_shader = Shader::load(Shader::SL_GLSL, default_vshader, default_fshader); _default_shader = Shader::make(Shader::SL_GLSL, default_vshader, default_fshader);
} }
#endif #endif
@ -2997,6 +2997,14 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader,
} }
#endif // NDEBUG #endif // NDEBUG
#ifdef OPENGLES_2
// We can't draw without a shader bound in OpenGL ES 2. This shouldn't
// happen anyway unless the default shader failed to compile somehow.
if (_current_shader_context == NULL) {
return false;
}
#endif
if (!GraphicsStateGuardian::begin_draw_primitives(geom_reader, munger, data_reader, force)) { if (!GraphicsStateGuardian::begin_draw_primitives(geom_reader, munger, data_reader, force)) {
return false; return false;
} }

View File

@ -1593,7 +1593,7 @@ update_shader_texture_bindings(ShaderContext *prev) {
// Description: This subroutine prints the infolog for a shader. // Description: This subroutine prints the infolog for a shader.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void CLP(ShaderContext):: void CLP(ShaderContext)::
glsl_report_shader_errors(GLuint shader, Shader::ShaderType type) { glsl_report_shader_errors(GLuint shader, Shader::ShaderType type, bool fatal) {
char *info_log; char *info_log;
GLint length = 0; GLint length = 0;
GLint num_chars = 0; GLint num_chars = 0;
@ -1642,6 +1642,9 @@ glsl_report_shader_errors(GLuint shader, Shader::ShaderType type) {
GLCAT.error(false) GLCAT.error(false)
<< fn << "(" << lineno << ") : " << (line.c_str() + prefixlen) << "\n"; << fn << "(" << lineno << ") : " << (line.c_str() + prefixlen) << "\n";
} else if (!fatal) {
GLCAT.warning(false) << line << "\n";
} else { } else {
GLCAT.error(false) << line << "\n"; GLCAT.error(false) << line << "\n";
} }
@ -1654,7 +1657,7 @@ glsl_report_shader_errors(GLuint shader, Shader::ShaderType type) {
// Description: This subroutine prints the infolog for a program. // Description: This subroutine prints the infolog for a program.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void CLP(ShaderContext):: void CLP(ShaderContext)::
glsl_report_program_errors(GLuint program) { glsl_report_program_errors(GLuint program, bool fatal) {
char *info_log; char *info_log;
GLint length = 0; GLint length = 0;
GLint num_chars = 0; GLint num_chars = 0;
@ -1664,8 +1667,13 @@ glsl_report_program_errors(GLuint program) {
if (length > 1) { if (length > 1) {
info_log = (char *) alloca(length); info_log = (char *) alloca(length);
_glgsg->_glGetProgramInfoLog(program, length, &num_chars, info_log); _glgsg->_glGetProgramInfoLog(program, length, &num_chars, info_log);
if (strcmp(info_log, "Success.\n") != 0 && strcmp(info_log, "No errors.\n") != 0) { if (strcmp(info_log, "Success.\n") != 0 && strcmp(info_log, "No errors.\n") != 0) {
GLCAT.error(false) << info_log << "\n"; if (!fatal) {
GLCAT.warning(false) << info_log << "\n";
} else {
GLCAT.error(false) << info_log << "\n";
}
} }
} }
} }
@ -1733,7 +1741,7 @@ glsl_compile_shader(Shader::ShaderType type) {
GLCAT.error() GLCAT.error()
<< "An error occurred while compiling GLSL shader " << "An error occurred while compiling GLSL shader "
<< _shader->get_filename(type) << ":\n"; << _shader->get_filename(type) << ":\n";
glsl_report_shader_errors(handle, type); glsl_report_shader_errors(handle, type, true);
_glgsg->_glDeleteShader(handle); _glgsg->_glDeleteShader(handle);
_glgsg->report_my_gl_errors(); _glgsg->report_my_gl_errors();
return false; return false;
@ -1743,7 +1751,7 @@ glsl_compile_shader(Shader::ShaderType type) {
_glsl_shaders.push_back(handle); _glsl_shaders.push_back(handle);
// There might be warnings, so report those. // There might be warnings, so report those.
glsl_report_shader_errors(handle, type); glsl_report_shader_errors(handle, type, false);
return true; return true;
} }
@ -1776,9 +1784,8 @@ glsl_compile_and_link() {
valid &= glsl_compile_shader(Shader::ST_fragment); valid &= glsl_compile_shader(Shader::ST_fragment);
} }
#ifdef OPENGLES // OpenGL ES has no geometry shaders.
nassertr(false, false); // OpenGL ES has no geometry shaders. #ifndef OPENGLES
#else
if (!_shader->get_text(Shader::ST_geometry).empty()) { if (!_shader->get_text(Shader::ST_geometry).empty()) {
valid &= glsl_compile_shader(Shader::ST_geometry); valid &= glsl_compile_shader(Shader::ST_geometry);
@ -1823,12 +1830,12 @@ glsl_compile_and_link() {
_glgsg->_glGetProgramiv(_glsl_program, GL_LINK_STATUS, &status); _glgsg->_glGetProgramiv(_glsl_program, GL_LINK_STATUS, &status);
if (status != GL_TRUE) { if (status != GL_TRUE) {
GLCAT.error() << "An error occurred while linking GLSL shader program!\n"; GLCAT.error() << "An error occurred while linking GLSL shader program!\n";
glsl_report_program_errors(_glsl_program); glsl_report_program_errors(_glsl_program, true);
return false; return false;
} }
// Report any warnings. // Report any warnings.
glsl_report_program_errors(_glsl_program); glsl_report_program_errors(_glsl_program, false);
// Dump the binary if requested. // Dump the binary if requested.
#if !defined(NDEBUG) && !defined(OPENGLES) #if !defined(NDEBUG) && !defined(OPENGLES)

View File

@ -73,8 +73,8 @@ private:
bool _uses_standard_vertex_arrays; bool _uses_standard_vertex_arrays;
void glsl_report_shader_errors(GLuint shader, Shader::ShaderType type); void glsl_report_shader_errors(GLuint shader, Shader::ShaderType type, bool fatal);
void glsl_report_program_errors(GLuint program); void glsl_report_program_errors(GLuint program, bool fatal);
bool glsl_compile_shader(Shader::ShaderType type); bool glsl_compile_shader(Shader::ShaderType type);
bool glsl_compile_and_link(); bool glsl_compile_and_link();
bool parse_and_set_short_hand_shader_vars(Shader::ShaderArgId &arg_id, Shader *s); bool parse_and_set_short_hand_shader_vars(Shader::ShaderArgId &arg_id, Shader *s);