X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=init.cpp;h=b8b3cb4e884de457e57acc854b6ba0c593426df5;hp=129ee4c894d91ea3d5072b35a9812338981707fc;hb=22c2b8fb28b152664d5ad6fe7420e1e37904bf95;hpb=34f5f331bd3b643949ccbb0c3488af2823634d59 diff --git a/init.cpp b/init.cpp index 129ee4c..b8b3cb4 100644 --- a/init.cpp +++ b/init.cpp @@ -1,15 +1,24 @@ +#include +#include + #include "init.h" -#include "opengl.h" #include "util.h" bool movit_initialized = false; +MovitDebugLevel movit_debug_level = MOVIT_DEBUG_ON; float movit_texel_subpixel_precision; +bool movit_srgb_textures_supported; + +// The rules for objects with nontrivial constructors in static scope +// are somewhat convoluted, and easy to mess up. We simply have a +// pointer instead (and never care to clean it up). +std::string *movit_data_directory = NULL; namespace { void measure_texel_subpixel_precision() { - static const unsigned width = 1024; + static const unsigned width = 4096; // Generate a destination texture to render to, and an FBO. GLuint dst_texnum, fbo; @@ -119,19 +128,50 @@ void measure_texel_subpixel_precision() check_error(); } +void check_extensions() +{ + // We fundamentally need FBOs and floating-point textures. + assert(glewIsSupported("GL_ARB_framebuffer_object") != 0); + assert(glewIsSupported("GL_ARB_texture_float") != 0); + + // We assume that we can use non-power-of-two textures without restrictions. + assert(glewIsSupported("GL_ARB_texture_non_power_of_two") != 0); + + // We also need GLSL fragment shaders. + assert(glewIsSupported("GL_ARB_fragment_shader") != 0); + assert(glewIsSupported("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(glewIsSupported("GL_ARB_pixel_buffer_object") != 0); + + // ResampleEffect uses RG textures to encode a two-component LUT. + assert(glewIsSupported("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 = glewIsSupported("GL_EXT_texture_sRGB"); +} + } // namespace -void init_movit() +void init_movit(const std::string& data_directory, MovitDebugLevel debug_level) { if (movit_initialized) { return; } + movit_data_directory = new std::string(data_directory); + movit_debug_level = debug_level; + + glewInit(); + // geez glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); measure_texel_subpixel_precision(); + check_extensions(); movit_initialized = true; }