summaryrefslogtreecommitdiffstats
path: root/video/out/opengl/video.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-09-23 22:13:03 +0200
committerwm4 <wm4@nowhere>2015-09-23 22:13:03 +0200
commit17cd6798a69ca2fea1d7e7df692c71172183731f (patch)
tree9708d64e0d52379ad80b489c45c145194033e33a /video/out/opengl/video.c
parentd8d4e188352160a2eac0e004d341ab5c3f997e6e (diff)
downloadmpv-17cd6798a69ca2fea1d7e7df692c71172183731f.tar.bz2
mpv-17cd6798a69ca2fea1d7e7df692c71172183731f.tar.xz
vo_opengl: move shader file caching to video.c
It's just about loading and cachign small files, not does not necessarily have anything to do with shaders. Move it to video.c where it's used.
Diffstat (limited to 'video/out/opengl/video.c')
-rw-r--r--video/out/opengl/video.c44
1 files changed, 41 insertions, 3 deletions
diff --git a/video/out/opengl/video.c b/video/out/opengl/video.c
index 8d6776ce0e..45528d138a 100644
--- a/video/out/opengl/video.c
+++ b/video/out/opengl/video.c
@@ -37,6 +37,7 @@
#include "utils.h"
#include "hwdec.h"
#include "osd.h"
+#include "stream/stream.h"
#include "video_shaders.h"
#include "video/out/filter_kernels.h"
#include "video/out/aspect.h"
@@ -118,6 +119,11 @@ struct src_tex {
struct mp_rect_f src;
};
+struct cached_file {
+ char *path;
+ char *body;
+};
+
struct gl_video {
GL *gl;
@@ -197,6 +203,9 @@ struct gl_video {
int last_dither_matrix_size;
float *last_dither_matrix;
+ struct cached_file files[10];
+ int num_files;
+
struct gl_hwdec *hwdec;
bool hwdec_active;
};
@@ -472,6 +481,35 @@ static const struct fmt_entry *find_tex_format(GL *gl, int bytes_per_comp,
return &fmts[n_channels - 1 + (bytes_per_comp - 1) * 4];
}
+static const char *load_cached_file(struct gl_video *p, const char *path)
+{
+ if (!path || !path[0])
+ return NULL;
+ for (int n = 0; n < p->num_files; n++) {
+ if (strcmp(p->files[n].path, path) == 0)
+ return p->files[n].body;
+ }
+ // not found -> load it
+ if (p->num_files == MP_ARRAY_SIZE(p->files)) {
+ // empty cache when it overflows
+ for (int n = 0; n < p->num_files; n++) {
+ talloc_free(p->files[n].path);
+ talloc_free(p->files[n].body);
+ }
+ p->num_files = 0;
+ }
+ struct bstr s = stream_read_file(path, p, p->global, 100000); // 100 kB
+ if (s.len) {
+ struct cached_file *new = &p->files[p->num_files++];
+ *new = (struct cached_file) {
+ .path = talloc_strdup(p, path),
+ .body = s.start
+ };
+ return new->body;
+ }
+ return NULL;
+}
+
static void debug_check_gl(struct gl_video *p, const char *msg)
{
if (p->gl_debug)
@@ -868,7 +906,7 @@ static bool apply_shaders(struct gl_video *p, char **shaders,
bool success = false;
int tex = 0;
for (int n = 0; shaders[n]; n++) {
- const char *body = gl_sc_loadfile(p->sc, shaders[n]);
+ const char *body = load_cached_file(p, shaders[n]);
if (!body)
continue;
finish_pass_fbo(p, &textures[tex], w, h, tex_num, 0);
@@ -1067,7 +1105,7 @@ static void pass_sample(struct gl_video *p, int src_tex, struct scaler *scaler,
} else if (strcmp(name, "oversample") == 0) {
pass_sample_oversample(p->sc, scaler, w, h);
} else if (strcmp(name, "custom") == 0) {
- const char *body = gl_sc_loadfile(p->sc, p->opts.scale_shader);
+ const char *body = load_cached_file(p, p->opts.scale_shader);
if (body) {
load_shader(p, body);
GLSLF("// custom scale-shader\n");
@@ -2390,7 +2428,7 @@ struct gl_video *gl_video_init(GL *gl, struct mp_log *log, struct mpv_global *g)
.gl_target = GL_TEXTURE_2D,
.texture_16bit_depth = 16,
.scaler = {{.index = 0}, {.index = 1}, {.index = 2}, {.index = 3}},
- .sc = gl_sc_create(gl, log, g),
+ .sc = gl_sc_create(gl, log),
};
gl_video_set_debug(p, true);
init_gl(p);