diff options
author | Błażej Szczygieł <spaz16@wp.pl> | 2016-09-25 12:57:56 +0200 |
---|---|---|
committer | Błażej Szczygieł <spaz16@wp.pl> | 2016-09-25 12:58:22 +0200 |
commit | a27fafb2736a530a8a04f887dd8d6e67da3d8972 (patch) | |
tree | bc7e969859da465e65d22a4826afecafc8ec6856 /drivers | |
parent | 20c7b65b7e3630ada9f2e8b6b64926ec05d68c4c (diff) |
Add compatibility with old OpenGL 2.1 drivers
If ARB_framebuffer_object is not supported, try to fall-back to
EXT_framebuffer_object if present.
In current version of godot, the way framebuffers are used is backward
compatible with the older EXT_framebuffer_object extension.
Fixes #6591
Done with SuperUserNameMan
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gles2/rasterizer_gles2.cpp | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index 56489cf4df..cb137294d8 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -10809,8 +10809,46 @@ void RasterizerGLES2::init() { print_line(String("GLES2: Using GLEW ") + (const char*) glewGetString(GLEW_VERSION)); } + // Godot makes use of functions from ARB_framebuffer_object extension which is not implemented by all drivers. + // On the other hand, these drivers might implement the older EXT_framebuffer_object extension + // with which current source code is backward compatible. + + bool framebuffer_object_is_supported = glewIsSupported("GL_ARB_framebuffer_object"); + + if ( !framebuffer_object_is_supported ) { + WARN_PRINT("GL_ARB_framebuffer_object not supported by your graphics card."); + + if ( glewIsSupported("GL_EXT_framebuffer_object") ) { + // falling-back to the older EXT function if present + WARN_PRINT("Falling-back to GL_EXT_framebuffer_object."); + + glIsRenderbuffer = glIsRenderbufferEXT; + glBindRenderbuffer = glBindRenderbufferEXT; + glDeleteRenderbuffers = glDeleteRenderbuffersEXT; + glGenRenderbuffers = glGenRenderbuffersEXT; + glRenderbufferStorage = glRenderbufferStorageEXT; + glGetRenderbufferParameteriv = glGetRenderbufferParameterivEXT; + glIsFramebuffer = glIsFramebufferEXT; + glBindFramebuffer = glBindFramebufferEXT; + glDeleteFramebuffers = glDeleteFramebuffersEXT; + glGenFramebuffers = glGenFramebuffersEXT; + glCheckFramebufferStatus = glCheckFramebufferStatusEXT; + glFramebufferTexture1D = glFramebufferTexture1DEXT; + glFramebufferTexture2D = glFramebufferTexture2DEXT; + glFramebufferTexture3D = glFramebufferTexture3DEXT; + glFramebufferRenderbuffer = glFramebufferRenderbufferEXT; + glGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameterivEXT; + glGenerateMipmap = glGenerateMipmapEXT; + + framebuffer_object_is_supported = true; + } + else { + ERR_PRINT("Framebuffer Object is not supported by your graphics card."); + } + } + // Check for GL 2.1 compatibility, if not bail out - if (!glewIsSupported("GL_VERSION_2_1")) { + if (!(glewIsSupported("GL_VERSION_2_1") && framebuffer_object_is_supported)) { ERR_PRINT("Your system's graphic drivers seem not to support OpenGL 2.1 / GLES 2.0, sorry :(\n" "Try a drivers update, buy a new GPU or try software rendering on Linux; Godot will now crash with a segmentation fault."); OS::get_singleton()->alert("Your system's graphic drivers seem not to support OpenGL 2.1 / GLES 2.0, sorry :(\n" |