From fefe87ec1337736a16e652e8a71026e531de6638 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 9 Sep 2013 13:33:11 +0000 Subject: [PATCH] osg uses osg::FBOExtensions to check if Frame Buffer Objects are available. But this just checks if the fbo functions can be called. It doesn't check if the OpenGL renderer supports fbos. For indirect rendering on linux the client side capability may be different from the display server, which can lead to mipmapped textures failing to render. I've added a fbo extension check. --- src/osg/FrameBufferObject.cpp | 3 ++- src/osg/Texture.cpp | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/osg/FrameBufferObject.cpp b/src/osg/FrameBufferObject.cpp index ec570d14e..ee06df812 100644 --- a/src/osg/FrameBufferObject.cpp +++ b/src/osg/FrameBufferObject.cpp @@ -105,7 +105,8 @@ FBOExtensions::FBOExtensions(unsigned int contextID) #if !defined(OSG_GLES1_AVAILABLE) && !defined(OSG_GLES2_AVAILABLE) _supported = _supported && glFramebufferTexture1D != 0 && - glFramebufferTexture3D != 0; + glFramebufferTexture3D != 0 && + isGLExtensionOrVersionSupported(contextID, "GL_EXT_framebuffer_object",3.0f); #endif LOAD_FBO_EXT(glBlitFramebuffer); diff --git a/src/osg/Texture.cpp b/src/osg/Texture.cpp index 89eea7f53..3569d16f3 100644 --- a/src/osg/Texture.cpp +++ b/src/osg/Texture.cpp @@ -2351,7 +2351,7 @@ bool Texture::isHardwareMipmapGenerationEnabled(const State& state) const const FBOExtensions* fbo_ext = FBOExtensions::instance(contextID,true); - if (fbo_ext->glGenerateMipmap) + if (fbo_ext->isSupported() && fbo_ext->glGenerateMipmap) { return true; } @@ -2368,7 +2368,8 @@ Texture::GenerateMipmapMode Texture::mipmapBeforeTexImage(const State& state, bo return GENERATE_MIPMAP; #else - bool useGenerateMipMap = FBOExtensions::instance(state.getContextID(), true)->glGenerateMipmap!=0; + FBOExtensions* fbo_ext = FBOExtensions::instance(state.getContextID(),true); + bool useGenerateMipMap = fbo_ext->isSupported() && fbo_ext->glGenerateMipmap; if (useGenerateMipMap) { @@ -2440,7 +2441,7 @@ void Texture::generateMipmap(State& state) const osg::FBOExtensions* fbo_ext = osg::FBOExtensions::instance(state.getContextID(), true); // check if the function is supported - if (fbo_ext->glGenerateMipmap) + if (fbo_ext->isSupported() && fbo_ext->glGenerateMipmap) { textureObject->bind(); fbo_ext->glGenerateMipmap(textureObject->target());