X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=init.cpp;h=ac52aa2ce3d7eee956e6cc629912e699bb6553b1;hp=129ee4c894d91ea3d5072b35a9812338981707fc;hb=38fca90c6ffde05e3459c7021e823cef0b3b27ac;hpb=17195eb5da34f03778cde297eb77c486fa0c51bc diff --git a/init.cpp b/init.cpp index 129ee4c..ac52aa2 100644 --- a/init.cpp +++ b/init.cpp @@ -2,8 +2,12 @@ #include "opengl.h" #include "util.h" +#include +#include + bool movit_initialized = false; float movit_texel_subpixel_precision; +bool movit_srgb_textures_supported; namespace { @@ -119,6 +123,43 @@ void measure_texel_subpixel_precision() check_error(); } +void get_extensions(std::set *extensions) +{ + char *str = strdup(reinterpret_cast(glGetString(GL_EXTENSIONS))); + for (char *ptr = strtok(str, " "); ptr != NULL; ptr = strtok(NULL, " ")) { + extensions->insert(ptr); + } + free(str); +} + +void check_extensions() +{ + std::set extensions; + get_extensions(&extensions); + + // We fundamentally need FBOs and floating-point textures. + assert(extensions.count("GL_ARB_framebuffer_object") != 0); + assert(extensions.count("GL_ARB_texture_float") != 0); + + // We assume that we can use non-power-of-two textures without restrictions. + assert(extensions.count("GL_ARB_texture_non_power_of_two") != 0); + + // We also need GLSL fragment shaders. + assert(extensions.count("GL_ARB_fragment_shader") != 0); + assert(extensions.count("GL_ARB_shading_language_100") != 0); + + // FlatInput and YCbCrInput uses PBOs. (They could in theory do without, + // but no modern card would really not provide it.) + assert(extensions.count("GL_ARB_pixel_buffer_object") != 0); + + // ResampleEffect uses RG textures to encode a two-component LUT. + assert(extensions.count("GL_ARB_texture_rg") != 0); + + // sRGB texture decode would be nice, but are not mandatory + // (GammaExpansionEffect can do the same thing if needed). + movit_srgb_textures_supported = extensions.count("GL_EXT_texture_sRGB"); +} + } // namespace void init_movit() @@ -132,6 +173,7 @@ void init_movit() glPixelStorei(GL_UNPACK_ALIGNMENT, 1); measure_texel_subpixel_precision(); + check_extensions(); movit_initialized = true; }