소스 검색

Fixes for geometry shaders in GLSL, and fixes for nvidia's implementation of GLSL

rdb 16 년 전
부모
커밋
c6796739e9
3개의 변경된 파일36개의 추가작업 그리고 11개의 파일을 삭제
  1. 11 0
      panda/src/glstuff/glGraphicsStateGuardian_src.cxx
  2. 8 2
      panda/src/glstuff/glGraphicsStateGuardian_src.h
  3. 17 9
      panda/src/glstuff/glShaderContext_src.cxx

+ 11 - 0
panda/src/glstuff/glGraphicsStateGuardian_src.cxx

@@ -943,6 +943,17 @@ reset() {
   }
   }
 #endif
 #endif
 
 
+#ifndef OPENGLES
+  if (has_extension("GL_EXT_geometry_shader4")) {
+    _glProgramParameteri = (PFNGLPROGRAMPARAMETERIEXTPROC)
+      get_extension_func(GLPREFIX_QUOTED, "ProgramParameteriEXT");
+  } else {
+    _glProgramParameteri = NULL;
+  }
+#else
+  _glProgramParameteri = NULL;
+#endif
+
 #ifdef OPENGLES_2
 #ifdef OPENGLES_2
   _glAttachShader = glAttachShader;
   _glAttachShader = glAttachShader;
   _glBindAttribLocation = glBindAttribLocation;
   _glBindAttribLocation = glBindAttribLocation;

+ 8 - 2
panda/src/glstuff/glGraphicsStateGuardian_src.h

@@ -145,7 +145,10 @@ typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, con
 typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
 typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
 typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program);
 typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program);
 typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
 typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
-#endif
+#endif  // OPENGLES_1
+#ifndef OPENGLES
+typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value);
+#endif  // OPENGLES
 #endif  // __EDG__
 #endif  // __EDG__
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -619,7 +622,10 @@ public:
   PFNGLUNIFORMMATRIX4FVPROC _glUniformMatrix4fv;
   PFNGLUNIFORMMATRIX4FVPROC _glUniformMatrix4fv;
   PFNGLVALIDATEPROGRAMPROC _glValidateProgram;
   PFNGLVALIDATEPROGRAMPROC _glValidateProgram;
   PFNGLVERTEXATTRIBPOINTERPROC _glVertexAttribPointer;
   PFNGLVERTEXATTRIBPOINTERPROC _glVertexAttribPointer;
-#endif
+#endif  // OPENGLES_1
+#ifndef OPENGLES
+  PFNGLPROGRAMPARAMETERIEXTPROC _glProgramParameteri;
+#endif  // OPENGLES
 
 
   GLenum _edge_clamp;
   GLenum _edge_clamp;
   GLenum _border_clamp;
   GLenum _border_clamp;

+ 17 - 9
panda/src/glstuff/glShaderContext_src.cxx

@@ -23,8 +23,14 @@
 
 
 TypeHandle CLP(ShaderContext)::_type_handle;
 TypeHandle CLP(ShaderContext)::_type_handle;
 
 
-#ifndef GL_GEOMETRY_SHADER
-#define GL_GEOMETRY_SHADER 0x8DD9
+#ifndef GL_GEOMETRY_SHADER_EXT
+#define GL_GEOMETRY_SHADER_EXT 0x8DD9
+#endif
+#ifndef GL_GEOMETRY_VERTICES_OUT_EXT
+#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA
+#endif
+#ifndef GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0
 #endif
 #endif
 
 
 #ifdef HAVE_CG
 #ifdef HAVE_CG
@@ -288,9 +294,8 @@ CLP(ShaderContext)(Shader *s, GSG *gsg) : ShaderContext(s) {
       for (int i = 0; i < param_count; ++i) {
       for (int i = 0; i < param_count; ++i) {
         gsg->_glGetActiveAttrib(_glsl_program, i, param_maxlength, NULL, &param_size, &param_type, param_name);
         gsg->_glGetActiveAttrib(_glsl_program, i, param_maxlength, NULL, &param_size, &param_type, param_name);
         PT(InternalName) inputname = InternalName::make(param_name);
         PT(InternalName) inputname = InternalName::make(param_name);
-        if (inputname->get_name().substr(0, 4) == "p3d_" || inputname->get_name().substr(0, 3) == "gl_") {
-          if (inputname->get_name().substr(0, 3) == "gl_") noprefix = inputname->get_name().substr(3);
-          else noprefix = inputname->get_name().substr(4);
+        if (inputname->get_name().substr(0, 4) == "p3d_") {
+          noprefix = inputname->get_name().substr(4);
           Shader::ShaderVarSpec bind;
           Shader::ShaderVarSpec bind;
           Shader::ShaderArgId arg_id;
           Shader::ShaderArgId arg_id;
           arg_id._name  = param_name;
           arg_id._name  = param_name;
@@ -913,7 +918,7 @@ glsl_compile_entry_point(GSG *gsg, Shader::ShaderType type) {
       handle = gsg->_glCreateShader(GL_FRAGMENT_SHADER);
       handle = gsg->_glCreateShader(GL_FRAGMENT_SHADER);
       break;
       break;
     case Shader::ST_geometry:
     case Shader::ST_geometry:
-      handle = gsg->_glCreateShader(GL_GEOMETRY_SHADER);
+      handle = gsg->_glCreateShader(GL_GEOMETRY_SHADER_EXT);
       break;
       break;
     default:
     default:
       return 0;
       return 0;
@@ -942,9 +947,6 @@ glsl_compile_entry_point(GSG *gsg, Shader::ShaderType type) {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 bool CLP(ShaderContext)::
 bool CLP(ShaderContext)::
 glsl_compile_shader(GSG *gsg) {
 glsl_compile_shader(GSG *gsg) {
-  // Terribly hacky. I hope this will go away when we
-  // add support for separated shader programs later.
-
   _glsl_program = gsg->_glCreateProgram();
   _glsl_program = gsg->_glCreateProgram();
   if (!_glsl_program) return false;
   if (!_glsl_program) return false;
 
 
@@ -964,6 +966,12 @@ glsl_compile_shader(GSG *gsg) {
     _glsl_gshader = glsl_compile_entry_point(gsg, Shader::ST_geometry);
     _glsl_gshader = glsl_compile_entry_point(gsg, Shader::ST_geometry);
     if (!_glsl_gshader) return false;
     if (!_glsl_gshader) return false;
     gsg->_glAttachShader(_glsl_program, _glsl_gshader);
     gsg->_glAttachShader(_glsl_program, _glsl_gshader);
+    
+    // Set the vertex output limit to the maximum
+    nassertr(gsg->_glProgramParameteri != NULL, false);
+    int max_vertices;
+    glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT, &max_vertices);
+    gsg->_glProgramParameteri(_glsl_program, GL_GEOMETRY_VERTICES_OUT_EXT, max_vertices); 
   }
   }
   
   
   // There might be warnings. Only report them for one shader program.
   // There might be warnings. Only report them for one shader program.