Check for core OpenGL versions, not just extensions.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 8 Mar 2014 16:57:33 +0000 (17:57 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 9 Mar 2014 00:44:12 +0000 (01:44 +0100)
Several extensions have been accepted over the years into the core OpenGL
spec, and occasionally, we might see a situation where something implements
the core spec but _not_ the extension. In particular, some extensions seem
to disappear when we ask Mesa for an OpenGL 3.1 forward-compatible context.

init.cpp

index 944685c..3c781e1 100644 (file)
--- a/init.cpp
+++ b/init.cpp
@@ -284,32 +284,43 @@ void measure_roundoff_problems()
 bool check_extensions()
 {
        // We fundamentally need FBOs and floating-point textures.
-       if (!epoxy_has_gl_extension("GL_ARB_framebuffer_object")) return false;
-       if (!epoxy_has_gl_extension("GL_ARB_texture_float")) return false;
+       // FBOs are covered by OpenGL 1.5, and are not an extension there.
+       // Floating-point textures are part of OpenGL 3.0 and newer.
+       if (epoxy_gl_version() < 15 &&
+           !epoxy_has_gl_extension("GL_ARB_framebuffer_object")) return false;
+       if (epoxy_gl_version() < 30 &&
+           !epoxy_has_gl_extension("GL_ARB_texture_float")) return false;
 
        // We assume that we can use non-power-of-two textures without restrictions.
-       if (!epoxy_has_gl_extension("GL_ARB_texture_non_power_of_two")) return false;
+       if (epoxy_gl_version() < 20 &&
+           !epoxy_has_gl_extension("GL_ARB_texture_non_power_of_two")) return false;
 
        // We also need GLSL fragment shaders.
-       if (!epoxy_has_gl_extension("GL_ARB_fragment_shader")) return false;
-       if (!epoxy_has_gl_extension("GL_ARB_shading_language_100")) return false;
+       if (epoxy_gl_version() < 20) {
+               if (!epoxy_has_gl_extension("GL_ARB_fragment_shader")) return false;
+               if (!epoxy_has_gl_extension("GL_ARB_shading_language_100")) return false;
+       }
 
        // FlatInput and YCbCrInput uses PBOs. (They could in theory do without,
        // but no modern card would really not provide it.)
-       if (!epoxy_has_gl_extension("GL_ARB_pixel_buffer_object")) return false;
+       if (epoxy_gl_version() < 21 &&
+           !epoxy_has_gl_extension("GL_ARB_pixel_buffer_object")) return false;
 
        // ResampleEffect uses RG textures to encode a two-component LUT.
-       if (!epoxy_has_gl_extension("GL_ARB_texture_rg")) return false;
+       if (epoxy_gl_version() < 30 &&
+           !epoxy_has_gl_extension("GL_ARB_texture_rg")) return false;
 
        // sRGB texture decode would be nice, but are not mandatory
        // (GammaExpansionEffect can do the same thing if needed).
-       movit_srgb_textures_supported = epoxy_has_gl_extension("GL_EXT_texture_sRGB");
+       movit_srgb_textures_supported =
+               (epoxy_gl_version() >= 21 || epoxy_has_gl_extension("GL_EXT_texture_sRGB"));
 
        // We may want to use round() at the end of the final shader,
        // if supported. We need either GLSL 1.30 or this extension to do that,
        // and 1.30 brings with it other things that we don't want to demand
        // for now.
-       movit_shader_rounding_supported = epoxy_has_gl_extension("GL_EXT_gpu_shader4");
+       movit_shader_rounding_supported =
+               (epoxy_gl_version() >= 30 || epoxy_has_gl_extension("GL_EXT_gpu_shader4"));
 
        return true;
 }