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

This commit is contained in:
rdb 2009-10-21 17:12:32 +00:00
parent 1095c84621
commit c6796739e9
3 changed files with 36 additions and 11 deletions

View File

@ -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;

View File

@ -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;

View File

@ -23,8 +23,14 @@
TypeHandle CLP(ShaderContext)::_type_handle; TypeHandle CLP(ShaderContext)::_type_handle;
#ifndef GL_GEOMETRY_SHADER #ifndef GL_GEOMETRY_SHADER_EXT
#define GL_GEOMETRY_SHADER 0x8DD9 #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, 4) == "p3d_") {
if (inputname->get_name().substr(0, 3) == "gl_") noprefix = inputname->get_name().substr(3); noprefix = inputname->get_name().substr(4);
else 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.