X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=util.cpp;h=085461988ed5f40440f1f2a478f704982d7f6a9d;hp=401664424fe2149cb97c4f9718d341f1f8dfa812;hb=HEAD;hpb=919101c59390dbbe380af7cc77102819e515a632 diff --git a/util.cpp b/util.cpp index 4016644..0854619 100644 --- a/util.cpp +++ b/util.cpp @@ -9,6 +9,7 @@ #include #include +#include "bundled_shaders.h" #include "fp16.h" #include "init.h" #include "util.h" @@ -84,18 +85,49 @@ void hsv2rgb_normalized(float h, float s, float v, float *r, float *g, float *b) } } +string read_file_from_bundle(const string &filename) +{ + for (const BundledShader *shader = bundled_shaders; shader->filename != nullptr; ++shader) { + if (shader->filename == filename) { + return string(shader_bundle + shader->offset, shader->length); + } + } + return ""; // Not found. +} + string read_file(const string &filename) { + string contents_from_bundle = read_file_from_bundle(filename); + + // If no data directory has been given, we read only from the bundle. + if (*movit_data_directory == "") { + if (contents_from_bundle.empty()) { + fprintf(stderr, "%s: Shader not compiled in, and no data directory has been given.\n", filename.c_str()); + exit(1); + } else { + return contents_from_bundle; + } + } + + // If we're given a data directory, we still support reading from the bundle, + // but a successful read from the file system takes priority. const string full_pathname = *movit_data_directory + "/" + filename; FILE *fp = fopen(full_pathname.c_str(), "r"); - if (fp == NULL) { + if (fp == nullptr) { + if (!contents_from_bundle.empty()) { + return contents_from_bundle; + } perror(full_pathname.c_str()); exit(1); } int ret = fseek(fp, 0, SEEK_END); if (ret == -1) { + if (!contents_from_bundle.empty()) { + fclose(fp); + return contents_from_bundle; + } perror("fseek(SEEK_END)"); exit(1); } @@ -104,6 +136,10 @@ string read_file(const string &filename) ret = fseek(fp, 0, SEEK_SET); if (ret == -1) { + if (!contents_from_bundle.empty()) { + fclose(fp); + return contents_from_bundle; + } perror("fseek(SEEK_SET)"); exit(1); } @@ -112,10 +148,18 @@ string read_file(const string &filename) str.resize(size); ret = fread(&str[0], size, 1, fp); if (ret == -1) { + if (!contents_from_bundle.empty()) { + fclose(fp); + return contents_from_bundle; + } perror("fread"); exit(1); } if (ret == 0) { + if (!contents_from_bundle.empty()) { + fclose(fp); + return contents_from_bundle; + } fprintf(stderr, "Short read when trying to read %d bytes from %s\n", size, full_pathname.c_str()); exit(1); @@ -157,7 +201,19 @@ GLuint compile_shader(const string &shader_src, GLenum type) GLint status; glGetShaderiv(obj, GL_COMPILE_STATUS, &status); if (status == GL_FALSE) { - fprintf(stderr, "Failed to compile shader: %s\n", shader_src.c_str()); + // Add some line numbers to easier identify compile errors. + string src_with_lines = "/* 1 */ "; + size_t lineno = 1; + for (char ch : shader_src) { + src_with_lines.push_back(ch); + if (ch == '\n') { + char buf[32]; + snprintf(buf, sizeof(buf), "/* %3zu */ ", ++lineno); + src_with_lines += buf; + } + } + + fprintf(stderr, "Failed to compile shader:\n%s\n", src_with_lines.c_str()); exit(1); } @@ -294,7 +350,7 @@ void *get_gl_context_identifier() return (void *)wglGetCurrentContext(); #else void *ret = (void *)eglGetCurrentContext(); - if (ret != NULL) { + if (ret != nullptr) { return ret; } return (void *)glXGetCurrentContext();