From Colin McDonald, "An earlier fix in OSG 3.2 has been inadvertently lost in 3.3.x. The glGenerateMipMap function is part of the GL_EXT_framebuffer_object extension. Just checking if the function is present before using it for texture mipmaps is not sufficient, as on remote X-windows displays the client side capability may be different from the display server. This can lead to mipmapped textures failing to render. I've restored a fbo extension check. I've also tided up the GL version checking a little."

git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14907 16af8721-9629-0410-8352-f15c8da7e697
This commit is contained in:
Robert Osfield
2015-06-10 16:47:15 +00:00
parent d2e0081690
commit e76c91ed78
2 changed files with 20 additions and 18 deletions

View File

@@ -465,7 +465,7 @@ GLExtensions::GLExtensions(unsigned int contextID)
isCubeMapSupported = OSG_GLES2_FEATURES || OSG_GL3_FEATURES ||
isGLExtensionSupported(contextID,"GL_ARB_texture_cube_map") ||
isGLExtensionSupported(contextID,"GL_EXT_texture_cube_map") ||
strncmp((const char*)glGetString(GL_VERSION),"1.3",3)>=0;;
(glVersion >= 1.3f);
@@ -686,7 +686,7 @@ GLExtensions::GLExtensions(unsigned int contextID)
// BlendFunc extensions
isBlendFuncSeparateSupported = OSG_GLES2_FEATURES || OSG_GL3_FEATURES ||
osg::isGLExtensionSupported(contextID, "GL_EXT_blend_func_separate") ||
strncmp((const char*)glGetString(GL_VERSION), "1.4", 3) >= 0;
(glVersion >= 1.4f);
setGLExtensionFuncPtr(glBlendFuncSeparate, "glBlendFuncSeparate", "glBlendFuncSeparateEXT");
@@ -765,7 +765,7 @@ GLExtensions::GLExtensions(unsigned int contextID)
// SampleMaski functionality
isTextureMultisampleSupported = isGLExtensionSupported(contextID, "GL_ARB_texture_multisample");
isOpenGL32upported = getGLVersionNumber() >= 3.2;
isOpenGL32upported = (glVersion >= 3.2f);
// function pointers
setGLExtensionFuncPtr(glSampleMaski, "glSampleMaski");
@@ -866,7 +866,7 @@ GLExtensions::GLExtensions(unsigned int contextID)
setGLExtensionFuncPtr(glBindImageTexture, "glBindImageTexture", "glBindImageTextureARB");
isTextureMaxLevelSupported = ( getGLVersionNumber() >= 1.2f );
isTextureMaxLevelSupported = (glVersion >= 1.2f);
isTextureStorageEnabled = isTexStorage2DSupported();
if ( (ptr = getenv("OSG_GL_TEXTURE_STORAGE")) != 0 && isTexStorage2DSupported())
@@ -880,7 +880,7 @@ GLExtensions::GLExtensions(unsigned int contextID)
isTexture3DFast = OSG_GL3_FEATURES || isGLExtensionSupported(contextID,"GL_EXT_texture3D");
if (isTexture3DFast) isTexture3DSupported = true;
else isTexture3DSupported = strncmp((const char*)glGetString(GL_VERSION),"1.2",3)>=0;
else isTexture3DSupported = (glVersion >= 1.2f);
maxTexture3DSize = 0;
glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, &maxTexture3DSize);
@@ -903,19 +903,19 @@ GLExtensions::GLExtensions(unsigned int contextID)
// Blending
isBlendColorSupported = OSG_GLES2_FEATURES || OSG_GL3_FEATURES ||
isGLExtensionSupported(contextID,"GL_EXT_blend_color") ||
strncmp((const char*)glGetString(GL_VERSION),"1.2",3)>=0;
(glVersion >= 1.2f);
setGLExtensionFuncPtr(glBlendColor, "glBlendColor", "glBlendColorEXT");
bool bultInSupport = OSG_GLES2_FEATURES || OSG_GL3_FEATURES;
isBlendEquationSupported = bultInSupport ||
isGLExtensionSupported(contextID, "GL_EXT_blend_equation") ||
strncmp((const char*)glGetString(GL_VERSION), "1.2", 3) >= 0;
(glVersion >= 1.2f);
isBlendEquationSeparateSupported = bultInSupport ||
isGLExtensionSupported(contextID, "GL_EXT_blend_equation_separate") ||
strncmp((const char*)glGetString(GL_VERSION), "2.0", 3) >= 0;
(glVersion >= 2.0f);
isSGIXMinMaxSupported = isGLExtensionSupported(contextID, "GL_SGIX_blend_alpha_minmax");
@@ -936,7 +936,7 @@ GLExtensions::GLExtensions(unsigned int contextID)
// Stencil`
isStencilWrapSupported = isGLExtensionOrVersionSupported(contextID, "GL_EXT_stencil_wrap", 1.4f);
isStencilTwoSidedSupported = isGLExtensionSupported(contextID, "GL_EXT_stencil_two_side");
isOpenGL20Supported = getGLVersionNumber() >= 2.0;
isOpenGL20Supported = (glVersion >= 2.0f);
isSeparateStencilSupported = isGLExtensionSupported(contextID, "GL_ATI_separate_stencil");
// function pointers
@@ -954,7 +954,7 @@ GLExtensions::GLExtensions(unsigned int contextID)
// ClampColor
isClampColorSupported = OSG_GL3_FEATURES ||
isGLExtensionSupported(contextID,"GL_ARB_color_buffer_float") ||
strncmp((const char*)glGetString(GL_VERSION),"2.0",3)>=0;
(glVersion >= 2.0f);
setGLExtensionFuncPtr(glClampColor, "glClampColor", "glClampColorARB");
@@ -964,15 +964,14 @@ GLExtensions::GLExtensions(unsigned int contextID)
// Point
isPointParametersSupported = OSG_GL3_FEATURES ||
strncmp((const char*)glGetString(GL_VERSION),"1.4",3)>=0 ||
isPointParametersSupported = OSG_GL3_FEATURES || (glVersion >= 1.4f) ||
isGLExtensionSupported(contextID,"GL_ARB_point_parameters") ||
isGLExtensionSupported(contextID,"GL_EXT_point_parameters") ||
isGLExtensionSupported(contextID,"GL_SGIS_point_parameters");
isPointSpriteSupported = OSG_GL3_FEATURES || isGLExtensionSupported(contextID, "GL_ARB_point_sprite") || isGLExtensionSupported(contextID, "GL_OES_point_sprite") || isGLExtensionSupported(contextID, "GL_NV_point_sprite");
isPointSpriteCoordOriginSupported = OSG_GL3_FEATURES || strncmp((const char*)glGetString(GL_VERSION),"2.0",3)>=0;
isPointSpriteCoordOriginSupported = OSG_GL3_FEATURES || (glVersion >= 2.0f);
setGLExtensionFuncPtr(glPointParameteri, "glPointParameteri", "glPointParameteriARB");
@@ -1028,7 +1027,9 @@ GLExtensions::GLExtensions(unsigned int contextID)
glFramebufferTexture2D != 0 &&
glFramebufferRenderbuffer != 0 &&
glGenerateMipmap != 0 &&
glGetRenderbufferParameteriv != 0;
glGetRenderbufferParameteriv != 0 &&
( OSG_GLES1_FEATURES || isGLExtensionOrVersionSupported(contextID, "GL_EXT_framebuffer_object",3.0f) );
isPackedDepthStencilSupported = OSG_GL3_FEATURES ||
(isGLExtensionSupported(contextID, "GL_EXT_packed_depth_stencil")) ||

View File

@@ -2699,7 +2699,8 @@ bool Texture::isHardwareMipmapGenerationEnabled(const State& state) const
return true;
}
if (extensions->glGenerateMipmap)
// FrameBufferObjects are required for glGenerateMipmap
if (extensions->isFrameBufferObjectSupported && extensions->glGenerateMipmap)
{
return true;
}
@@ -2717,7 +2718,7 @@ Texture::GenerateMipmapMode Texture::mipmapBeforeTexImage(const State& state, bo
#else
const GLExtensions* extensions = state.get<GLExtensions>();
bool useGenerateMipMap = extensions->glGenerateMipmap!=0;
bool useGenerateMipMap = extensions->isFrameBufferObjectSupported && extensions->glGenerateMipmap;
if (useGenerateMipMap)
{
@@ -2788,8 +2789,8 @@ void Texture::generateMipmap(State& state) const
// get fbo extension which provides us with the glGenerateMipmapEXT function
osg::GLExtensions* ext = state.get<GLExtensions>();
// check if the function is supported
if (ext->glGenerateMipmap)
// FrameBufferObjects are required for glGenerateMipmap
if (ext->isFrameBufferObjectSupported && ext->glGenerateMipmap)
{
textureObject->bind();
ext->glGenerateMipmap(textureObject->target());