summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBin Jin <bjin@ctrl-d.org>2019-03-07 15:06:24 +0000
committersfan5 <sfan5@live.de>2019-03-09 12:56:11 +0100
commit1d0349d3b5d9a263251fcb3b0d7e135d4731bfd0 (patch)
tree92614a4e6d04276d8a543e178376854da8b3af66
parentb3cbd4650984902548432f15be9f267f9cb2230e (diff)
downloadmpv-1d0349d3b5d9a263251fcb3b0d7e135d4731bfd0.tar.bz2
mpv-1d0349d3b5d9a263251fcb3b0d7e135d4731bfd0.tar.xz
vo_gpu: add two useful operators to user shader
modulo operator could be used to check if size is multiple of a certain number. equal operator could be used to verify if size of different textures aligns.
-rw-r--r--video/out/gpu/user_shaders.c5
-rw-r--r--video/out/gpu/user_shaders.h2
2 files changed, 7 insertions, 0 deletions
diff --git a/video/out/gpu/user_shaders.c b/video/out/gpu/user_shaders.c
index 446941b03f..0613eb93f6 100644
--- a/video/out/gpu/user_shaders.c
+++ b/video/out/gpu/user_shaders.c
@@ -16,6 +16,7 @@
*/
#include <assert.h>
+#include <math.h>
#include "common/msg.h"
#include "misc/ctype.h"
@@ -52,9 +53,11 @@ static bool parse_rpn_szexpr(struct bstr line, struct szexp out[MAX_SZEXP_SIZE])
case '-': exp->tag = SZEXP_OP2; exp->val.op = SZEXP_OP_SUB; continue;
case '*': exp->tag = SZEXP_OP2; exp->val.op = SZEXP_OP_MUL; continue;
case '/': exp->tag = SZEXP_OP2; exp->val.op = SZEXP_OP_DIV; continue;
+ case '%': exp->tag = SZEXP_OP2; exp->val.op = SZEXP_OP_MOD; continue;
case '!': exp->tag = SZEXP_OP1; exp->val.op = SZEXP_OP_NOT; continue;
case '>': exp->tag = SZEXP_OP2; exp->val.op = SZEXP_OP_GT; continue;
case '<': exp->tag = SZEXP_OP2; exp->val.op = SZEXP_OP_LT; continue;
+ case '=': exp->tag = SZEXP_OP2; exp->val.op = SZEXP_OP_EQ; continue;
}
if (mp_isdigit(word.start[0])) {
@@ -118,8 +121,10 @@ bool eval_szexpr(struct mp_log *log, void *priv,
case SZEXP_OP_SUB: res = op1 - op2; break;
case SZEXP_OP_MUL: res = op1 * op2; break;
case SZEXP_OP_DIV: res = op1 / op2; break;
+ case SZEXP_OP_MOD: res = fmodf(op1, op2); break;
case SZEXP_OP_GT: res = op1 > op2; break;
case SZEXP_OP_LT: res = op1 < op2; break;
+ case SZEXP_OP_EQ: res = op1 == op2; break;
default: abort();
}
diff --git a/video/out/gpu/user_shaders.h b/video/out/gpu/user_shaders.h
index 8d8cc6bde0..a477e3ce3d 100644
--- a/video/out/gpu/user_shaders.h
+++ b/video/out/gpu/user_shaders.h
@@ -30,9 +30,11 @@ enum szexp_op {
SZEXP_OP_SUB,
SZEXP_OP_MUL,
SZEXP_OP_DIV,
+ SZEXP_OP_MOD,
SZEXP_OP_NOT,
SZEXP_OP_GT,
SZEXP_OP_LT,
+ SZEXP_OP_EQ,
};
enum szexp_tag {