diff --git a/panda/src/glstuff/glGraphicsBuffer_src.cxx b/panda/src/glstuff/glGraphicsBuffer_src.cxx index 05d8c4b78f..cd40b52384 100644 --- a/panda/src/glstuff/glGraphicsBuffer_src.cxx +++ b/panda/src/glstuff/glGraphicsBuffer_src.cxx @@ -1062,6 +1062,7 @@ attach_tex(int layer, int view, Texture *attach, GLenum attachpoint) { #ifndef OPENGLES if (_rb_size_z != 1) { // Bind all of the layers of the texture. + nassertv(glgsg->_glFramebufferTexture != NULL); glgsg->_glFramebufferTexture(GL_FRAMEBUFFER_EXT, attachpoint, gtc->_index, 0); return; diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index cb7b0e4da3..db342f423a 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -829,13 +829,22 @@ reset() { _supports_2d_texture_array = false; #ifndef OPENGLES - _supports_2d_texture_array = has_extension("GL_EXT_texture_array"); - if (_supports_2d_texture_array) { + if (is_at_least_gl_version(3, 0)) { + _supports_2d_texture_array = true; + + _glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) + get_extension_func("glFramebufferTextureLayer"); + + } else if (has_extension("GL_EXT_texture_array")) { + _supports_2d_texture_array = true; + _glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) get_extension_func("glFramebufferTextureLayerEXT"); - } else { - // ARB_geometry_shader4 also provides a version. - _glFramebufferTextureLayer = NULL; + } + + if (_supports_2d_texture_array && _glFramebufferTextureLayer == NULL) { + GLCAT.warning() + << "Texture arrays advertised as supported by OpenGL runtime, but could not get pointer to glFramebufferTextureLayer function.\n"; } #endif @@ -1263,20 +1272,40 @@ reset() { #endif // HAVE_CG -#ifdef OPENGLES_2 +#if defined(OPENGLES_1) + _supports_glsl = false; + _supports_geometry_shaders = false; + _supports_tessellation_shaders = false; +#elif defined(OPENGLES) _supports_glsl = true; _supports_geometry_shaders = false; _supports_tessellation_shaders = false; #else - #ifdef OPENGLES_1 - _supports_glsl = false; + _supports_glsl = is_at_least_gl_version(2, 0) || has_extension("GL_ARB_shading_language_100"); + _supports_tessellation_shaders = is_at_least_gl_version(4, 0) || has_extension("GL_ARB_tessellation_shader"); + + if (is_at_least_gl_version(3, 2)) { + _supports_geometry_shaders = true; + _glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREARBPROC) + get_extension_func("glFramebufferTexture"); + + } else if (has_extension("GL_ARB_geometry_shader4")) { + _supports_geometry_shaders = true; + _glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREARBPROC) + get_extension_func("glFramebufferTextureARB"); + _glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) + get_extension_func("glProgramParameteriARB"); + + } else if (has_extension("GL_EXT_geometry_shader4")) { + _supports_geometry_shaders = true; + _glFramebufferTexture = NULL; + _glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) + get_extension_func("glProgramParameteriEXT"); + + } else { _supports_geometry_shaders = false; - _supports_tessellation_shaders = false; - #else - _supports_glsl = is_at_least_gl_version(2, 0) || has_extension("GL_ARB_shading_language_100"); - _supports_geometry_shaders = is_at_least_gl_version(3, 2) || has_extension("GL_ARB_geometry_shader4"); - _supports_tessellation_shaders = is_at_least_gl_version(4, 0) || has_extension("GL_ARB_tessellation_shader"); - #endif + _glFramebufferTexture = NULL; + } #endif _shader_caps._supports_glsl = _supports_glsl; @@ -1378,17 +1407,6 @@ reset() { _glVertexAttribLPointer = NULL; } - if (_supports_geometry_shaders) { - _glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) - get_extension_func("glProgramParameteri"); - _glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREARBPROC) - get_extension_func("glFramebufferTextureARB"); - - if (_glFramebufferTextureLayer == NULL) { - _glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) - get_extension_func("glFramebufferTextureLayerARB"); - } - } if (_supports_tessellation_shaders) { _glPatchParameteri = (PFNGLPATCHPARAMETERIPROC) get_extension_func("glPatchParameteri"); @@ -1533,7 +1551,7 @@ reset() { _glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC) get_extension_func("glDrawElementsInstancedARB"); _supports_geometry_instancing = true; - + } else if (has_extension("GL_EXT_draw_instanced")) { _glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) get_extension_func("glDrawArraysInstancedEXT"); @@ -2202,8 +2220,10 @@ reset() { if (is_at_least_gl_version(4, 1) || has_extension("GL_ARB_get_program_binary")) { _glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) get_extension_func("glGetProgramBinary"); + _glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) + get_extension_func("glProgramParameteri"); - if (_glGetProgramBinary != NULL) { + if (_glGetProgramBinary != NULL && _glProgramParameteri != NULL) { _supports_get_program_binary = true; } } diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index bb58a45572..2a67e0ba21 100644 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -212,10 +212,11 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext if (_glsl_parameter_map.size() == 0) { int seqno = 0, texunitno = 0, imgunitno = 0; string noprefix; - GLint param_count, param_maxlength, param_size; + GLint param_count = 0, param_maxlength = 0, param_size; GLenum param_type; _glgsg->_glGetProgramiv(_glsl_program, GL_ACTIVE_UNIFORMS, ¶m_count); _glgsg->_glGetProgramiv(_glsl_program, GL_ACTIVE_UNIFORM_MAX_LENGTH, ¶m_maxlength); + param_maxlength = max(64, param_maxlength); char* param_name_cstr = (char *)alloca(param_maxlength); for (int i = 0; i < param_count; ++i) { @@ -856,6 +857,7 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext // Now we've processed the uniforms, we'll process the attribs. _glgsg->_glGetProgramiv(_glsl_program, GL_ACTIVE_ATTRIBUTES, ¶m_count); _glgsg->_glGetProgramiv(_glsl_program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, ¶m_maxlength); + param_maxlength = max(64, param_maxlength); param_name_cstr = (char *)alloca(param_maxlength); for (int i = 0; i < param_count; ++i) { @@ -1940,13 +1942,13 @@ glsl_compile_and_link() { if (!_shader->get_text(Shader::ST_geometry).empty()) { valid &= glsl_compile_shader(Shader::ST_geometry); - // Set the vertex output limit to the maximum. - // This is slow, but it is probably reasonable to require - // the user to override this in his shader using layout(). - nassertr(_glgsg->_glProgramParameteri != NULL, false); - GLint max_vertices; - glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES, &max_vertices); - _glgsg->_glProgramParameteri(_glsl_program, GL_GEOMETRY_VERTICES_OUT_ARB, max_vertices); + //XXX Actually, it turns out that this is unavailable in the core + // version of geometry shaders. Probably no need to bother with it. + + //nassertr(_glgsg->_glProgramParameteri != NULL, false); + //GLint max_vertices; + //glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES, &max_vertices); + //_glgsg->_glProgramParameteri(_glsl_program, GL_GEOMETRY_VERTICES_OUT_ARB, max_vertices); } #endif