diff options
4 files changed, 23 insertions, 0 deletions
diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst
index 0f59392feb..f13d02673d 100644
--- a/DOCS/man/options.rst
+++ b/DOCS/man/options.rst
@@ -4271,6 +4271,17 @@ The following video options are currently all specific to ``--vo=opengl`` and
should be stored in the texture, up to 4 (rgba). By default, this value
is equal to the number of components in HOOKED.
+ COMPUTE bw bh
+ Specifies that this shader should be treated as a compute shader, with
+ the block size bw and bh. The compute shader will be dispatched with
+ however many blocks are necessary to completely tile over the output.
+ Compute shaders in mpv are treated similarly to fragment shaders, and
+ are still required to produce an output color. In addition, mpv
+ provides a special function NAME_map(id) to map from the global ID
+ space to the texture coordinates for all bound textures. The only real
+ difference is the fact that you can use shared memory inside compute
+ shaders.
Each bound texture (via ``BIND``) will make available the following
definitions to that shader pass, where NAME is the name of the bound
diff --git a/video/out/opengl/user_shaders.c b/video/out/opengl/user_shaders.c
index 427295b0ad..718034fa2d 100644
--- a/video/out/opengl/user_shaders.c
+++ b/video/out/opengl/user_shaders.c
@@ -269,6 +269,14 @@ bool parse_user_shader_pass(struct mp_log *log, struct bstr *body,
+ if (bstr_eatstart0(&line, "COMPUTE")) {
+ if (bstr_sscanf(line, "%d %d", &out->compute_w, &out->compute_h) != 2) {
+ mp_err(log, "Error while parsing COMPUTE!\n");
+ return false;
+ }
+ continue;
+ }
// Unknown command type
mp_err(log, "Unrecognized command '%.*s'!\n", BSTR_P(line));
return false;
diff --git a/video/out/opengl/user_shaders.h b/video/out/opengl/user_shaders.h
index 458e925bc4..3b7913f236 100644
--- a/video/out/opengl/user_shaders.h
+++ b/video/out/opengl/user_shaders.h
@@ -66,6 +66,8 @@ struct gl_user_shader {
struct szexp height[MAX_SZEXP_SIZE];
struct szexp cond[MAX_SZEXP_SIZE];
int components;
+ int compute_w;
+ int compute_h;
// Parse the next shader pass from 'body'. Returns false if the end of the
diff --git a/video/out/opengl/video.c b/video/out/opengl/video.c
index 5a4d17e454..d4f746e3a2 100644
--- a/video/out/opengl/video.c
+++ b/video/out/opengl/video.c
@@ -1339,6 +1339,7 @@ static void hook_prelude(struct gl_video *p, const char *name, int id,
GLSLHF("#define %s_size texture_size%d\n", name, id);
GLSLHF("#define %s_rot texture_rot%d\n", name, id);
GLSLHF("#define %s_pt pixel_size%d\n", name, id);
+ GLSLHF("#define %s_map texmap%d\n", name, id);
GLSLHF("#define %s_mul %f\n", name, tex.multiplier);
// Set up the sampling functions
@@ -1903,6 +1904,7 @@ static void user_hook(struct gl_video *p, struct img_tex tex,
pass_describe(p, "user shader: %.*s (%s)", BSTR_P(shader->desc),
+ compute_size_minimum(p, shader->compute_w, shader->compute_h);
load_shader(p, shader->pass_body);
GLSLF("color = hook();\n");