Convert a loop to range-based for.
[movit] / init.cpp
index d312cd8..5e6c642 100644 (file)
--- a/init.cpp
+++ b/init.cpp
@@ -15,14 +15,14 @@ namespace movit {
 bool movit_initialized = false;
 MovitDebugLevel movit_debug_level = MOVIT_DEBUG_ON;
 float movit_texel_subpixel_precision;
-bool movit_timer_queries_supported;
+bool movit_timer_queries_supported, movit_compute_shaders_supported;
 int movit_num_wrongly_rounded;
 MovitShaderModel movit_shader_model;
 
 // 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).
-string *movit_data_directory = NULL;
+string *movit_data_directory = nullptr;
 
 namespace {
 
@@ -38,7 +38,7 @@ void measure_texel_subpixel_precision()
        check_error();
        glBindTexture(GL_TEXTURE_2D, dst_texnum);
        check_error();
-       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, 1, 0, GL_RGBA, GL_FLOAT, NULL);
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, 1, 0, GL_RGBA, GL_FLOAT, nullptr);
        check_error();
 
        glGenFramebuffers(1, &fbo);
@@ -166,7 +166,7 @@ void measure_roundoff_problems()
        check_error();
        glBindTexture(GL_TEXTURE_2D, dst_texnum);
        check_error();
-       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 512, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 512, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
        check_error();
 
        glGenFramebuffers(1, &fbo);
@@ -310,6 +310,17 @@ bool check_extensions()
        movit_timer_queries_supported =
                (epoxy_gl_version() >= 33 || epoxy_has_gl_extension("GL_ARB_timer_query"));
 
+       // Certain effects have compute shader implementations, which may be
+       // more efficient than the normal fragment shader versions.
+       // GLSL 3.10 supposedly also has compute shaders, but I haven't tested them,
+       // so we require desktop OpenGL.
+       movit_compute_shaders_supported =
+               (epoxy_is_desktop_gl() &&
+                (epoxy_gl_version() >= 43 ||
+                 (epoxy_has_gl_extension("GL_ARB_compute_shader") &&
+                  epoxy_has_gl_extension("GL_ARB_shader_image_load_store") &&
+                  epoxy_has_gl_extension("GL_ARB_shader_image_size"))));
+
        return true;
 }
 
@@ -319,7 +330,7 @@ double get_glsl_version()
 
        // Skip past the first period.
        char *ptr = strchr(glsl_version_str, '.');
-       assert(ptr != NULL);
+       assert(ptr != nullptr);
        ++ptr;
 
        // Now cut the string off at the next period or space, whatever comes first
@@ -341,6 +352,18 @@ double get_glsl_version()
        return glsl_version;
 }
 
+void APIENTRY debug_callback(GLenum source,
+                             GLenum type,
+                             GLuint id,
+                             GLenum severity,
+                             GLsizei length,
+                             const char *message,
+                             const void *userParam)
+#ifdef __GNUC__
+       __attribute__((unused))
+#endif
+;
+
 void APIENTRY debug_callback(GLenum source,
                              GLenum type,
                              GLuint id,
@@ -371,7 +394,7 @@ bool init_movit(const string& data_directory, MovitDebugLevel debug_level)
        // You can turn this on if you want detailed debug messages from the driver.
        // You should probably also ask for a debug context (see gtest_sdl_main.cpp),
        // or you might not get much data back.
-       // glDebugMessageCallbackARB(callback, NULL);
+       // glDebugMessageCallbackARB(callback, nullptr);
        // glDebugMessageControlARB(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, 0, GL_TRUE);
 
        if (!check_extensions()) {