From da8dfcce3a52f2de180ead1dd315f6e6cac5fef2 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Thu, 3 Apr 2014 23:11:30 +0200 Subject: [PATCH] Rewrite extension checking. Two big changes: 1. If you're missing some functionality, Movit will now tell you on stderr what you're missing. (We might suppress this later if it turns out that people want to init_movit() but are actually fine with it failing.) 2. Use a table instead of repeated if-then logic, since this started to become a bit messy after we added OpenGL-version-equivalence checks. --- init.cpp | 72 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/init.cpp b/init.cpp index c37614e..a7bd1e3 100644 --- a/init.cpp +++ b/init.cpp @@ -278,6 +278,33 @@ void measure_roundoff_problems() check_error(); } +struct RequiredExtension { + int min_equivalent_gl_version; + const char extension_name[64]; +}; +const RequiredExtension required_extensions[] = { + // We fundamentally need FBOs and floating-point textures. + // FBOs are covered by OpenGL 1.5, and are not an extension there. + // Floating-point textures are part of OpenGL 3.0 and newer. + { 15, "GL_ARB_framebuffer_object" }, + { 30, "GL_ARB_texture_float" }, + + // We assume that we can use non-power-of-two textures without restrictions. + { 20, "GL_ARB_texture_non_power_of_two" }, + + // We also need GLSL fragment shaders. + { 20, "GL_ARB_fragment_shader" }, + { 20, "GL_ARB_shading_language_100" }, + + // FlatInput and YCbCrInput uses PBOs. (They could in theory do without, + // but no modern card would really not provide it.) + { 21, "GL_ARB_pixel_buffer_object" }, + + // ResampleEffect uses RG textures to encode a two-component LUT. + // We also need GL_R several places, for single-channel input. + { 30, "GL_ARB_texture_rg" }, +}; + bool check_extensions() { // GLES generally doesn't use extensions as actively as desktop OpenGL. @@ -287,37 +314,34 @@ bool check_extensions() if (epoxy_gl_version() >= 30) { movit_srgb_textures_supported = true; movit_shader_rounding_supported = true; + return true; } else { + fprintf(stderr, "Movit system requirements: GLES version %.1f is too old (GLES 3.0 needed).\n", + 0.1f * epoxy_gl_version()); + fprintf(stderr, "Movit initialization failed.\n"); return false; } } - // We fundamentally need FBOs and floating-point textures. - // 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_gl_version() < 20 && - !epoxy_has_gl_extension("GL_ARB_texture_non_power_of_two")) return false; - - // We also need GLSL fragment shaders. - 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; + // Check all extensions, and output errors for the ones that we are missing. + bool all_ok = true; + int gl_version = epoxy_gl_version(); + + for (unsigned i = 0; i < sizeof(required_extensions) / sizeof(required_extensions[0]); ++i) { + if (gl_version < required_extensions[i].min_equivalent_gl_version && + !epoxy_has_gl_extension(required_extensions[i].extension_name)) { + fprintf(stderr, "Movit system requirements: Needs extension '%s' or at least OpenGL version %.1f (has version %.1f)\n", + required_extensions[i].extension_name, + 0.1f * required_extensions[i].min_equivalent_gl_version, + 0.1f * gl_version); + all_ok = false; + } } - // FlatInput and YCbCrInput uses PBOs. (They could in theory do without, - // but no modern card would really not provide it.) - 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_gl_version() < 30 && - !epoxy_has_gl_extension("GL_ARB_texture_rg")) return false; + if (!all_ok) { + fprintf(stderr, "Movit initialization failed.\n"); + return false; + } // sRGB texture decode would be nice, but are not mandatory // (GammaExpansionEffect can do the same thing if needed). -- 2.39.2