]> git.sesse.net Git - movit/blobdiff - util.cpp
Compile shaders into the library.
[movit] / util.cpp
index 9b018825d333e269e3e0007b0300165af563b28f..085461988ed5f40440f1f2a478f704982d7f6a9d 100644 (file)
--- a/util.cpp
+++ b/util.cpp
@@ -9,6 +9,7 @@
 #include <string>
 #include <Eigen/Core>
 
+#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 == 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);