]> git.sesse.net Git - movit/blobdiff - effect_util.cpp
Use UBOs instead of glUniform. Work in progress; no clear wins seen yet.
[movit] / effect_util.cpp
index e57a562f870da38f93a07243caf801fa11d48b58..4036caf6a49ecb684a4af50a509de1bb3413b674 100644 (file)
@@ -1,16 +1,38 @@
-#include <GL/glew.h>
+#include <epoxy/gl.h>
 #include <Eigen/Core>
 #include <stddef.h>
 #include <string>
 #include "util.h"
 
 #include <Eigen/Core>
 #include <stddef.h>
 #include <string>
 #include "util.h"
 
-GLint get_uniform_location(GLuint glsl_program_num, const std::string &prefix, const std::string &key)
+using namespace std;
+
+namespace movit {
+
+GLint get_uniform_location(GLuint glsl_program_num, const string &prefix, const string &key)
 {
 {
-       std::string name = prefix + "_" + key;
+       string name = prefix + "_" + key;
        return glGetUniformLocation(glsl_program_num, name.c_str());
 }
 
        return glGetUniformLocation(glsl_program_num, name.c_str());
 }
 
-void set_uniform_int(GLuint glsl_program_num, const std::string &prefix, const std::string &key, int value)
+void get_uniform_offset_and_size(GLuint glsl_program_num, const string &prefix, const string &key, GLint *offset, GLint *size)
+{
+       string name = prefix + "_" + key;
+       GLuint index;
+       const GLchar *name_cstr = name.c_str();
+       glGetUniformIndices(glsl_program_num, 1, &name_cstr, &index);
+       check_error();
+       if (index == GL_INVALID_INDEX) {
+               *offset = -1;
+               *size = 0;
+               return;
+       }
+       glGetActiveUniformsiv(glsl_program_num, 1, &index, GL_UNIFORM_OFFSET, offset);
+       check_error();
+       glGetActiveUniformsiv(glsl_program_num, 1, &index, GL_UNIFORM_SIZE, size);
+       check_error();
+}
+
+void set_uniform_int(GLuint glsl_program_num, const string &prefix, const string &key, int value)
 {
        GLint location = get_uniform_location(glsl_program_num, prefix, key);
        if (location == -1) {
 {
        GLint location = get_uniform_location(glsl_program_num, prefix, key);
        if (location == -1) {
@@ -21,7 +43,7 @@ void set_uniform_int(GLuint glsl_program_num, const std::string &prefix, const s
        check_error();
 }
 
        check_error();
 }
 
-void set_uniform_float(GLuint glsl_program_num, const std::string &prefix, const std::string &key, float value)
+void set_uniform_float(GLuint glsl_program_num, const string &prefix, const string &key, float value)
 {
        GLint location = get_uniform_location(glsl_program_num, prefix, key);
        if (location == -1) {
 {
        GLint location = get_uniform_location(glsl_program_num, prefix, key);
        if (location == -1) {
@@ -32,7 +54,7 @@ void set_uniform_float(GLuint glsl_program_num, const std::string &prefix, const
        check_error();
 }
 
        check_error();
 }
 
-void set_uniform_vec2(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const float *values)
+void set_uniform_vec2(GLuint glsl_program_num, const string &prefix, const string &key, const float *values)
 {
        GLint location = get_uniform_location(glsl_program_num, prefix, key);
        if (location == -1) {
 {
        GLint location = get_uniform_location(glsl_program_num, prefix, key);
        if (location == -1) {
@@ -43,7 +65,7 @@ void set_uniform_vec2(GLuint glsl_program_num, const std::string &prefix, const
        check_error();
 }
 
        check_error();
 }
 
-void set_uniform_vec3(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const float *values)
+void set_uniform_vec3(GLuint glsl_program_num, const string &prefix, const string &key, const float *values)
 {
        GLint location = get_uniform_location(glsl_program_num, prefix, key);
        if (location == -1) {
 {
        GLint location = get_uniform_location(glsl_program_num, prefix, key);
        if (location == -1) {
@@ -54,7 +76,7 @@ void set_uniform_vec3(GLuint glsl_program_num, const std::string &prefix, const
        check_error();
 }
 
        check_error();
 }
 
-void set_uniform_vec4(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const float *values)
+void set_uniform_vec4(GLuint glsl_program_num, const string &prefix, const string &key, const float *values)
 {
        GLint location = get_uniform_location(glsl_program_num, prefix, key);
        if (location == -1) {
 {
        GLint location = get_uniform_location(glsl_program_num, prefix, key);
        if (location == -1) {
@@ -65,7 +87,18 @@ void set_uniform_vec4(GLuint glsl_program_num, const std::string &prefix, const
        check_error();
 }
 
        check_error();
 }
 
-void set_uniform_vec4_array(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const float *values, size_t num_values)
+void set_uniform_vec2_array(GLuint glsl_program_num, const string &prefix, const string &key, const float *values, size_t num_values)
+{
+       GLint location = get_uniform_location(glsl_program_num, prefix, key);
+       if (location == -1) {
+               return;
+       }
+       check_error();
+       glUniform2fv(location, num_values, values);
+       check_error();
+}
+
+void set_uniform_vec4_array(GLuint glsl_program_num, const string &prefix, const string &key, const float *values, size_t num_values)
 {
        GLint location = get_uniform_location(glsl_program_num, prefix, key);
        if (location == -1) {
 {
        GLint location = get_uniform_location(glsl_program_num, prefix, key);
        if (location == -1) {
@@ -76,7 +109,7 @@ void set_uniform_vec4_array(GLuint glsl_program_num, const std::string &prefix,
        check_error();
 }
 
        check_error();
 }
 
-void set_uniform_mat3(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const Eigen::Matrix3d& matrix)
+void set_uniform_mat3(GLuint glsl_program_num, const string &prefix, const string &key, const Eigen::Matrix3d& matrix)
 {
        GLint location = get_uniform_location(glsl_program_num, prefix, key);
        if (location == -1) {
 {
        GLint location = get_uniform_location(glsl_program_num, prefix, key);
        if (location == -1) {
@@ -95,3 +128,5 @@ void set_uniform_mat3(GLuint glsl_program_num, const std::string &prefix, const
        glUniformMatrix3fv(location, 1, GL_FALSE, matrixf);
        check_error();
 }
        glUniformMatrix3fv(location, 1, GL_FALSE, matrixf);
        check_error();
 }
+
+}  // namespace movit