]> git.sesse.net Git - movit/blobdiff - util.cpp
Merge branch 'master' into epoxy
[movit] / util.cpp
index 9e18e9f71cd4999ddbbda88cf38f4a2568c4d485..01787f013e0a4c70817be2ccf49743cddb7bd254 100644 (file)
--- a/util.cpp
+++ b/util.cpp
@@ -1,4 +1,4 @@
-#include <GL/glew.h>
+#include <epoxy/gl.h>
 #include <assert.h>
 #include <math.h>
 #include <stdio.h>
@@ -9,6 +9,14 @@
 #include "init.h"
 #include "util.h"
 
+#if defined(__DARWIN__)
+#include <OpenGL/OpenGL.h>
+#elif defined(WIN32)
+#include <epoxy/wgl.h>
+#else
+#include <epoxy/glx.h>
+#endif
+
 using namespace std;
 
 namespace movit {
@@ -88,6 +96,19 @@ string read_file(const string &filename)
        return string(buf, len);
 }
 
+string read_version_dependent_file(const string &base, const string &extension)
+{
+       if (movit_shader_model == MOVIT_GLSL_110) {
+               return read_file(base + "." + extension);
+       } else if (movit_shader_model == MOVIT_GLSL_130) {
+               return read_file(base + ".130." + extension);
+       } else if (movit_shader_model == MOVIT_ESSL_300) {
+               return read_file(base + ".300es." + extension);
+       } else {
+               assert(false);
+       }
+}
+
 GLuint compile_shader(const string &shader_src, GLenum type)
 {
        GLuint obj = glCreateShader(type);
@@ -178,4 +199,70 @@ void combine_two_samples(float w1, float w2, float *offset, float *total_weight,
        assert(*offset <= 1.0f);
 }
 
+GLuint fill_vertex_attribute(GLuint glsl_program_num, const string &attribute_name, GLint size, GLenum type, GLsizeiptr data_size, const GLvoid *data)
+{
+       int attrib = glGetAttribLocation(glsl_program_num, attribute_name.c_str());
+       if (attrib == -1) {
+               return -1;
+       }
+
+       GLuint vbo;
+       glGenBuffers(1, &vbo);
+       check_error();
+       glBindBuffer(GL_ARRAY_BUFFER, vbo);
+       check_error();
+       glBufferData(GL_ARRAY_BUFFER, data_size, data, GL_STATIC_DRAW);
+       check_error();
+       glEnableVertexAttribArray(attrib);
+       check_error();
+       glVertexAttribPointer(attrib, size, type, GL_FALSE, 0, BUFFER_OFFSET(0));
+       check_error();
+       glBindBuffer(GL_ARRAY_BUFFER, 0);
+       check_error();
+
+       return vbo;
+}
+
+void cleanup_vertex_attribute(GLuint glsl_program_num, const string &attribute_name, GLuint vbo)
+{
+       int attrib = glGetAttribLocation(glsl_program_num, attribute_name.c_str());
+       if (attrib == -1) {
+               return;
+       }
+
+       glDisableVertexAttribArray(attrib);
+       check_error();
+       glDeleteBuffers(1, &vbo);
+       check_error();
+}
+
+unsigned div_round_up(unsigned a, unsigned b)
+{
+       return (a + b - 1) / b;
+}
+
+// Algorithm from http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2.
+unsigned next_power_of_two(unsigned v)
+{
+       v--;
+       v |= v >> 1;
+       v |= v >> 2;
+       v |= v >> 4;
+       v |= v >> 8;
+       v |= v >> 16;
+       v++;
+       return v;
+}
+
+void *get_gl_context_identifier()
+{
+#if defined(__DARWIN__)
+       return (void *)CGLGetCurrentContext();
+#elif defined(WIN32)
+       return (void *)wglGetCurrentContext();
+#else
+       return (void *)glXGetCurrentContext();
+#endif
+}
+
 }  // namespace movit