bool movit_srgb_textures_supported;
int movit_num_wrongly_rounded;
bool movit_shader_rounding_supported;
+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
glViewport(0, 0, width, 1);
GLuint glsl_program_num = resource_pool.compile_glsl_program(
- read_file("vs.vert"), read_file("texture1d.frag"));
+ read_version_dependent_file("vs", "vert"),
+ read_version_dependent_file("texture1d", "frag"));
glUseProgram(glsl_program_num);
check_error();
glUniform1i(glGetUniformLocation(glsl_program_num, "tex"), 0); // Bind the 2D sampler.
glViewport(0, 0, 512, 1);
GLuint glsl_program_num = resource_pool.compile_glsl_program(
- read_file("vs.vert"), read_file("texture1d.frag"));
+ read_version_dependent_file("vs", "vert"),
+ read_version_dependent_file("texture1d", "frag"));
glUseProgram(glsl_program_num);
check_error();
glUniform1i(glGetUniformLocation(glsl_program_num, "tex"), 0); // Bind the 2D sampler.
bool check_extensions()
{
+ // GLES generally doesn't use extensions as actively as desktop OpenGL.
+ // For now, we say that for GLES, we require GLES 3, which has everything
+ // we need.
+ if (!epoxy_is_desktop_gl()) {
+ if (epoxy_gl_version() >= 30) {
+ movit_srgb_textures_supported = true;
+ movit_shader_rounding_supported = true;
+ } else {
+ return false;
+ }
+ }
+
// We fundamentally need FBOs and floating-point textures.
// FBOs are covered by OpenGL 1.5, and are not an extension there.
// Floating-point textures are part of OpenGL 3.0 and newer.
return true;
}
+double get_glsl_version()
+{
+ char *glsl_version_str = strdup((const char *)glGetString(GL_SHADING_LANGUAGE_VERSION));
+
+ // Skip past the first period.
+ char *ptr = strchr(glsl_version_str, '.');
+ assert(ptr != NULL);
+ ++ptr;
+
+ // Now cut the string off at the next period or space, whatever comes first
+ // (unless the string ends first).
+ while (*ptr && *ptr != '.' && *ptr != ' ') {
+ ++ptr;
+ }
+ *ptr = '\0';
+
+ // Now we have something on the form X.YY. We convert it to a float, and hope
+ // that if it's inexact (e.g. 1.30), atof() will round the same way the
+ // compiler will.
+ float glsl_version = atof(glsl_version_str);
+ free(glsl_version_str);
+
+ return glsl_version;
+}
+
+void APIENTRY debug_callback(GLenum source,
+ GLenum type,
+ GLuint id,
+ GLenum severity,
+ GLsizei length,
+ const char *message,
+ const void *userParam)
+{
+ printf("Debug: %s\n", message);
+}
+
} // namespace
bool init_movit(const string& data_directory, MovitDebugLevel debug_level)
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glDisable(GL_DITHER);
+ // 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);
+ // glDebugMessageControlARB(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, 0, GL_TRUE);
+
if (!check_extensions()) {
return false;
}
+
+ // Find out what shader model we should compile for.
+ if (epoxy_is_desktop_gl()) {
+ if (get_glsl_version() >= 1.30) {
+ movit_shader_model = MOVIT_GLSL_130;
+ } else {
+ movit_shader_model = MOVIT_GLSL_110;
+ }
+ } else {
+ movit_shader_model = MOVIT_ESSL_300;
+ }
+
measure_texel_subpixel_precision();
measure_roundoff_problems();