mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
Fixes for geometry shaders in GLSL, and fixes for nvidia's implementation of GLSL
This commit is contained in:
parent
1095c84621
commit
c6796739e9
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user