// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // Copyright 2023 Citra Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #version 460 core layout(location = 0) in vec2 tex_coord; layout(location = 0) out vec4 frag_color; layout(binding = 0) uniform sampler2D tex; #define src(x, y) texture(tex, coord + vec2(x, y) * 1.0 / source_size) float luma(vec4 col) { return dot(col.rgb, vec3(0.2126, 0.7152, 0.0722)) * (1.0 - col.a); } bool same(vec4 B, vec4 A0) { return all(equal(B, A0)); } bool notsame(vec4 B, vec4 A0) { return any(notEqual(B, A0)); } bool all_eq2(vec4 B, vec4 A0, vec4 A1) { return (same(B,A0) && same(B,A1)); } bool all_eq3(vec4 B, vec4 A0, vec4 A1, vec4 A2) { return (same(B,A0) && same(B,A1) && same(B,A2)); } bool all_eq4(vec4 B, vec4 A0, vec4 A1, vec4 A2, vec4 A3) { return (same(B,A0) && same(B,A1) && same(B,A2) && same(B,A3)); } bool any_eq3(vec4 B, vec4 A0, vec4 A1, vec4 A2) { return (same(B,A0) || same(B,A1) || same(B,A2)); } bool none_eq2(vec4 B, vec4 A0, vec4 A1) { return (notsame(B,A0) && notsame(B,A1)); } bool none_eq4(vec4 B, vec4 A0, vec4 A1, vec4 A2, vec4 A3) { return (notsame(B,A0) && notsame(B,A1) && notsame(B,A2) && notsame(B,A3)); } void main() { vec2 source_size = vec2(textureSize(tex, 0)); vec2 pos = fract(tex_coord * source_size) - vec2(0.5, 0.5); vec2 coord = tex_coord - pos / source_size; vec4 E = src(0.0,0.0); vec4 A = src(-1.0,-1.0); vec4 B = src(0.0,-1.0); vec4 C = src(1.0,-1.0); vec4 D = src(-1.0,0.0); vec4 F = src(1.0,0.0); vec4 G = src(-1.0,1.0); vec4 H = src(0.0,1.0); vec4 I = src(1.0,1.0); vec4 J = E; vec4 K = E; vec4 L = E; vec4 M = E; frag_color = E; if(same(E,A) && same(E,B) && same(E,C) && same(E,D) && same(E,F) && same(E,G) && same(E,H) && same(E,I)) return; vec4 P = src(0.0,2.0); vec4 Q = src(-2.0,0.0); vec4 R = src(2.0,0.0); vec4 S = src(0.0,2.0); float Bl = luma(B); float Dl = luma(D); float El = luma(E); float Fl = luma(F); float Hl = luma(H); if (((same(D,B) && notsame(D,H) && notsame(D,F))) && ((El>=Dl) || same(E,A)) && any_eq3(E,A,C,G) && ((El=Bl) || same(E,C)) && any_eq3(E,A,C,I) && ((El=Hl) || same(E,G)) && any_eq3(E,A,G,I) && ((El=Fl) || same(E,I)) && any_eq3(E,C,G,I) && ((El