From 30a2c57cb303aee96dbe6659b5d95112f9e2c356 Mon Sep 17 00:00:00 2001 From: rdb Date: Sat, 19 Sep 2009 09:55:05 +0000 Subject: [PATCH] Fix an issue with programs being destroyed and then reused by different copies of the same shader. Also, added better error reporting system for Cg errors. --- panda/src/glstuff/glShaderContext_src.cxx | 34 +++++++++++------------ panda/src/glstuff/glShaderContext_src.h | 1 - 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index 9e3e96475e..646488fc4b 100755 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -27,6 +27,18 @@ TypeHandle CLP(ShaderContext)::_type_handle; #define GL_GEOMETRY_SHADER 0x8DD9 #endif +#ifdef HAVE_CG +#ifndef NDEBUG +#define cg_report_errors() { \ + CGerror err = cgGetError(); \ + if (err != CG_NO_ERROR) { \ + GLCAT.error() << __FILE__ ", line " << __LINE__ << ": " << cgGetErrorString(err) << "\n"; \ + } } +#else +#define cg_report_errors() +#endif +#endif + //////////////////////////////////////////////////////////////////// // Function: GLShaderContext::Constructor // Access: Public @@ -354,9 +366,10 @@ release_resources(GSG *gsg) { if (_cg_context) { cgDestroyContext(_cg_context); _cg_context = 0; - if (_cg_vprogram != 0) cgDestroyProgram(_cg_vprogram); - if (_cg_fprogram != 0) cgDestroyProgram(_cg_fprogram); - if (_cg_gprogram != 0) cgDestroyProgram(_cg_gprogram); + // Do *NOT* destroy the programs here! It causes problems. +// if (_cg_vprogram != 0) cgDestroyProgram(_cg_vprogram); +// if (_cg_fprogram != 0) cgDestroyProgram(_cg_fprogram); +// if (_cg_gprogram != 0) cgDestroyProgram(_cg_gprogram); _cg_vprogram = 0; _cg_fprogram = 0; _cg_gprogram = 0; @@ -838,21 +851,6 @@ update_shader_texture_bindings(CLP(ShaderContext) *prev, GSG *gsg) { gsg->report_my_gl_errors(); } -//////////////////////////////////////////////////////////////////// -// Function: GLShaderContext::cg_report_errors -// Access: Public -// Description: Report any Cg errors that were not previously caught. -//////////////////////////////////////////////////////////////////// -#ifdef HAVE_CG -void CLP(ShaderContext):: - cg_report_errors() { - CGerror err = cgGetError(); - if (err != CG_NO_ERROR) { - GLCAT.error() << cgGetErrorString(err) << "\n"; - } -} -#endif - //////////////////////////////////////////////////////////////////// // Function: Shader::glsl_report_shader_errors // Access: Private diff --git a/panda/src/glstuff/glShaderContext_src.h b/panda/src/glstuff/glShaderContext_src.h index 8e2b23f8f4..6a4cffecc8 100755 --- a/panda/src/glstuff/glShaderContext_src.h +++ b/panda/src/glstuff/glShaderContext_src.h @@ -58,7 +58,6 @@ private: CGprogram _cg_gprogram; pvector _cg_parameter_map; - void cg_report_errors(); #endif GLuint _glsl_program;