瀏覽代碼

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.

rdb 16 年之前
父節點
當前提交
30a2c57cb3
共有 2 個文件被更改,包括 16 次插入19 次删除
  1. 16 18
      panda/src/glstuff/glShaderContext_src.cxx
  2. 0 1
      panda/src/glstuff/glShaderContext_src.h

+ 16 - 18
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

+ 0 - 1
panda/src/glstuff/glShaderContext_src.h

@@ -58,7 +58,6 @@ private:
   CGprogram _cg_gprogram;
 
   pvector <CGparameter> _cg_parameter_map;
-  void cg_report_errors();
 #endif
   
   GLuint _glsl_program;