From c6796739e92c9d686e5f3b4e889a1d97ecb7d2e8 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 21 Oct 2009 17:12:32 +0000 Subject: [PATCH] Fixes for geometry shaders in GLSL, and fixes for nvidia's implementation of GLSL --- .../glstuff/glGraphicsStateGuardian_src.cxx | 11 ++++++++ .../src/glstuff/glGraphicsStateGuardian_src.h | 10 +++++-- panda/src/glstuff/glShaderContext_src.cxx | 26 ++++++++++++------- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index 074da2a5dd..6e6bfe4b77 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -943,6 +943,17 @@ reset() { } #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 _glAttachShader = glAttachShader; _glBindAttribLocation = glBindAttribLocation; diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.h b/panda/src/glstuff/glGraphicsStateGuardian_src.h index 35ccddd6d2..56fb249f7d 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.h +++ b/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 PFNGLVALIDATEPROGRAMPROC) (GLuint program); 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__ //////////////////////////////////////////////////////////////////// @@ -619,7 +622,10 @@ public: PFNGLUNIFORMMATRIX4FVPROC _glUniformMatrix4fv; PFNGLVALIDATEPROGRAMPROC _glValidateProgram; PFNGLVERTEXATTRIBPOINTERPROC _glVertexAttribPointer; -#endif +#endif // OPENGLES_1 +#ifndef OPENGLES + PFNGLPROGRAMPARAMETERIEXTPROC _glProgramParameteri; +#endif // OPENGLES GLenum _edge_clamp; GLenum _border_clamp; diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index 646488fc4b..6488f1e64a 100755 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -23,8 +23,14 @@ 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 #ifdef HAVE_CG @@ -288,9 +294,8 @@ CLP(ShaderContext)(Shader *s, GSG *gsg) : ShaderContext(s) { for (int i = 0; i < param_count; ++i) { gsg->_glGetActiveAttrib(_glsl_program, i, param_maxlength, NULL, ¶m_size, ¶m_type, 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::ShaderArgId arg_id; arg_id._name = param_name; @@ -913,7 +918,7 @@ glsl_compile_entry_point(GSG *gsg, Shader::ShaderType type) { handle = gsg->_glCreateShader(GL_FRAGMENT_SHADER); break; case Shader::ST_geometry: - handle = gsg->_glCreateShader(GL_GEOMETRY_SHADER); + handle = gsg->_glCreateShader(GL_GEOMETRY_SHADER_EXT); break; default: return 0; @@ -942,9 +947,6 @@ glsl_compile_entry_point(GSG *gsg, Shader::ShaderType type) { //////////////////////////////////////////////////////////////////// bool CLP(ShaderContext):: 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(); if (!_glsl_program) return false; @@ -964,6 +966,12 @@ glsl_compile_shader(GSG *gsg) { _glsl_gshader = glsl_compile_entry_point(gsg, Shader::ST_geometry); if (!_glsl_gshader) return false; 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.