1$input v_color0, v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3
2
3// license:LGPL-2.1+
4// copyright-holders:Jules Blok,Cameron Zemek,Maxim Stepin
5
6#include "common.sh"
7
8// Autos
9uniform vec4 u_tex_size0;
10
11// Samplers
12SAMPLER2D(decal, 0);
13SAMPLER2D(LUT, 1);
14
15#define trY 48.0
16#define trU 7.0
17#define trV 6.0
18
19#define SCALE 4.0
20
21float diff(vec3 yuv1, vec3 yuv2)
22{
23	vec3 yuv_threshold = vec3(trY / 255.0, trU / 255.0, trV / 255.0);
24	vec3 yuv_offset = vec3(0, 0.5, 0.5);
25	float res_x = (abs((yuv1.x + 0.0) - (yuv2.x + 0.0)) > (trY / 255.0)) ? 1.0 : 0.0;
26	float res_y = (abs((yuv1.y + 0.5) - (yuv2.y + 0.5)) > (trU / 255.0)) ? 1.0 : 0.0;
27	float res_z = (abs((yuv1.z + 0.5) - (yuv2.z + 0.5)) > (trV / 255.0)) ? 1.0 : 0.0;
28	return (res_x > 0.0) ? 1.0 : ((res_y > 0.0) ? 1.0 : ((res_z > 0.0) ? 1.0 : 0.0));
29}
30
31void main()
32{
33	mat3 yuv = mat3(0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081);
34
35	vec2 fp = fract(v_texcoord0 * u_tex_size0.xy);
36	vec2 quad = sign(-0.5 + fp);
37	vec2 ps = vec2(1.0, 1.0) / u_tex_size0.xy;
38
39	float dx = ps.x;
40	float dy = ps.y;
41	vec4 p1 = texture2D(decal, v_texcoord0);
42	vec4 p2 = texture2D(decal, v_texcoord0 + ps * quad);
43	vec4 p3 = texture2D(decal, v_texcoord0 + vec2(dx, 0) * quad);
44	vec4 p4 = texture2D(decal, v_texcoord0 + vec2(0, dy) * quad);
45
46	vec3 w1  = instMul(texture2D(decal, v_texcoord1.xw).rgb, yuv);
47	vec3 w2  = instMul(texture2D(decal, v_texcoord1.yw).rgb, yuv);
48	vec3 w3  = instMul(texture2D(decal, v_texcoord1.zw).rgb, yuv);
49
50	vec3 w4  = instMul(texture2D(decal, v_texcoord2.xw).rgb, yuv);
51	vec3 w5  = instMul(p1.rgb, yuv);
52	vec3 w6  = instMul(texture2D(decal, v_texcoord2.zw).rgb, yuv);
53
54	vec3 w7  = instMul(texture2D(decal, v_texcoord3.xw).rgb, yuv);
55	vec3 w8  = instMul(texture2D(decal, v_texcoord3.yw).rgb, yuv);
56	vec3 w9  = instMul(texture2D(decal, v_texcoord3.zw).rgb, yuv);
57
58	mat3 pattern = mat3(diff(w5, w1), diff(w5, w2), diff(w5, w3), diff(w5, w4), 0.0, diff(w5, w6), diff(w5, w7), diff(w5, w8), diff(w5, w9));
59	vec4 cross = vec4(diff(w4, w2), diff(w2, w6), diff(w8, w4), diff(w6, w8));
60
61	vec2 index;
62	index.x = dot(pattern[0], vec3( 1.0,  2.0,   4.0)) +
63	          dot(pattern[1], vec3( 8.0,  0.0,  16.0)) +
64	          dot(pattern[2], vec3(32.0, 64.0, 128.0));
65	index.y = dot(cross, vec4(1.0, 2.0, 4.0, 8.0)) * SCALE * SCALE + dot(floor(fp * vec2(SCALE, SCALE)), vec2(1.0, SCALE));
66
67	vec2 step = vec2(1.0, 1.0) / vec2(256.0, 16.0 * (SCALE * SCALE));
68	vec2 offset = step / vec2(2.0, 2.0);
69	vec4 weights = texture2D(LUT, index * step + offset);
70	float sum = dot(weights, vec4(1.0, 1.0, 1.0, 1.0));
71	mat4 transposed = mat4(vec4(p1.x, p2.x, p3.x, p4.x), vec4(p1.y, p2.y, p3.y, p4.y), vec4(p1.z, p2.z, p3.z, p4.z), vec4(p1.w, p2.w, p3.w, p4.w));
72	vec4 res = instMul(weights / vec4(sum, sum, sum, sum), transposed);
73
74	gl_FragColor = vec4(res.rgb, 1.0);
75}
76