From aef808cdfc341b4803d54139a1da3e0c9152b171 Mon Sep 17 00:00:00 2001
From: fleroviux <fleroviux@gmail.com>
Date: Sat, 17 Jun 2023 01:35:35 +0200
Subject: [PATCH] [GPU] Cleanup TEV shader code to be less redundant

---
 src/core/renderer_gl/renderer_gl.cpp | 35 +++++++++++-----------------
 1 file changed, 13 insertions(+), 22 deletions(-)

diff --git a/src/core/renderer_gl/renderer_gl.cpp b/src/core/renderer_gl/renderer_gl.cpp
index a3b3cae4..42e78162 100644
--- a/src/core/renderer_gl/renderer_gl.cpp
+++ b/src/core/renderer_gl/renderer_gl.cpp
@@ -167,35 +167,26 @@ const char* fragmentShader = R"(
 	void main() {
 		if ((u_textureConfig & 1u) != 0u) tev_texture_sources[0] = texture(u_tex0, tex0_UVs);
 
-		// TODO: make TEV logic less redundant
-
 		tev_previous_buffer[0] = vec4(0.0);
 		tev_previous_buffer[1] = u_textureEnvBufferColor;
 
-		tev_previous = tev_combine(0);
-		tev_previous_buffer[0] = tev_previous_buffer[1];
-		if ((u_textureEnvUpdateBuffer &  0x100u) != 0u) tev_previous_buffer[1].rgb = tev_previous.rgb;
-		if ((u_textureEnvUpdateBuffer & 0x1000u) != 0u) tev_previous_buffer[1].a   = tev_previous.a;
+		for (int i = 0; i < 6; i++) {
+			tev_previous = tev_combine(i);
 
-		tev_previous = tev_combine(1);
-		tev_previous_buffer[0] = tev_previous_buffer[1];
-		if ((u_textureEnvUpdateBuffer &  0x200u) != 0u) tev_previous_buffer[1].rgb = tev_previous.rgb;
-		if ((u_textureEnvUpdateBuffer & 0x2000u) != 0u) tev_previous_buffer[1].a   = tev_previous.a;
+			tev_previous_buffer[0] = tev_previous_buffer[1];
 
-		tev_previous = tev_combine(2);
-		tev_previous_buffer[0] = tev_previous_buffer[1];
-		if ((u_textureEnvUpdateBuffer &  0x400u) != 0u) tev_previous_buffer[1].rgb = tev_previous.rgb;
-		if ((u_textureEnvUpdateBuffer & 0x4000u) != 0u) tev_previous_buffer[1].a   = tev_previous.a;
+			if (i < 4) {
+				if ((u_textureEnvUpdateBuffer & (0x100u << i)) != 0u) {
+					tev_previous_buffer[1].rgb = tev_previous.rgb;
+				}
 
-		tev_previous = tev_combine(3);
-		tev_previous_buffer[0] = tev_previous_buffer[1];
-		if ((u_textureEnvUpdateBuffer &  0x800u) != 0u) tev_previous_buffer[1].rgb = tev_previous.rgb;
-		if ((u_textureEnvUpdateBuffer & 0x8000u) != 0u) tev_previous_buffer[1].a   = tev_previous.a;
+				if ((u_textureEnvUpdateBuffer & (0x1000u << i)) != 0u) {
+					tev_previous_buffer[1].a = tev_previous.a;
+				}
+			}
+		}
 
-		tev_previous = tev_combine(4);
-		tev_previous_buffer[0] = tev_previous_buffer[1];
-
-		fragColour = tev_combine(5);
+		fragColour = tev_previous;
 
 		if (tev_unimplemented_source) {
 			// fragColour = vec4(1.0, 0.0, 1.0, 1.0);