From 99547d2656ee8e84b684794fa8e013b146f15284 Mon Sep 17 00:00:00 2001
From: Fernando Sahmkow <fsahmkow27@gmail.com>
Date: Sat, 23 Oct 2021 00:23:50 +0200
Subject: [PATCH] HostShader: Fix gaussian and add attribution.

---
 .../host_shaders/present_gaussian.frag        | 42 +++++++++----------
 1 file changed, 19 insertions(+), 23 deletions(-)

diff --git a/src/video_core/host_shaders/present_gaussian.frag b/src/video_core/host_shaders/present_gaussian.frag
index d5e2b1781..a9558548f 100644
--- a/src/video_core/host_shaders/present_gaussian.frag
+++ b/src/video_core/host_shaders/present_gaussian.frag
@@ -2,6 +2,10 @@
 // Licensed under GPLv2 or any later version
 // Refer to the license.txt file included.
 
+// Code obtained from this 2 sources:
+// - https://learnopengl.com/Advanced-Lighting/Bloom
+// - https://www.rastergrid.com/blog/2010/09/efficient-gaussian-blur-with-linear-sampling/
+
 #version 460 core
 
 #ifdef VULKAN
@@ -14,50 +18,40 @@
 
 #endif
 
-layout (location = 0) in vec2 frag_tex_coord;
+layout(location = 0) in vec2 frag_tex_coord;
 
-layout (location = 0) out vec4 color;
+layout(location = 0) out vec4 color;
 
-layout (binding = BINDING_COLOR_TEXTURE) uniform sampler2D color_texture;
+layout(binding = BINDING_COLOR_TEXTURE) uniform sampler2D color_texture;
 
 const float offset[3] = float[](0.0, 1.3846153846, 3.2307692308);
 const float weight[3] = float[](0.2270270270, 0.3162162162, 0.0702702703);
 
 vec4 blurVertical(sampler2D textureSampler, vec2 coord, vec2 norm) {
     vec4 result = vec4(0.0f);
-    for (int i=1; i<3; i++) {
-        result +=
-            texture(textureSampler, vec2(coord) + (vec2(0.0, offset[i]) * norm))
-                * weight[i];
-        result +=
-            texture(textureSampler, vec2(coord) - (vec2(0.0, offset[i]) * norm))
-                * weight[i];
+    for (int i = 1; i < 3; i++) {
+        result += texture(textureSampler, vec2(coord) + (vec2(0.0, offset[i]) * norm)) * weight[i];
+        result += texture(textureSampler, vec2(coord) - (vec2(0.0, offset[i]) * norm)) * weight[i];
     }
     return result;
 }
 
 vec4 blurHorizontal(sampler2D textureSampler, vec2 coord, vec2 norm) {
     vec4 result = vec4(0.0f);
-    for (int i=1; i<3; i++) {
-        result +=
-            texture(textureSampler, vec2(coord) + (vec2(offset[i], 0.0) * norm))
-                * weight[i];
-        result +=
-            texture(textureSampler, vec2(coord) - (vec2(offset[i], 0.0) * norm))
-                * weight[i];
+    for (int i = 1; i < 3; i++) {
+        result += texture(textureSampler, vec2(coord) + (vec2(offset[i], 0.0) * norm)) * weight[i];
+        result += texture(textureSampler, vec2(coord) - (vec2(offset[i], 0.0) * norm)) * weight[i];
     }
     return result;
 }
 
 vec4 blurDiagonal(sampler2D textureSampler, vec2 coord, vec2 norm) {
     vec4 result = vec4(0.0f);
-    for (int i=1; i<3; i++) {
+    for (int i = 1; i < 3; i++) {
         result +=
-            texture(textureSampler, vec2(coord) + (vec2(offset[i], offset[i]) * norm))
-                * weight[i];
+            texture(textureSampler, vec2(coord) + (vec2(offset[i], offset[i]) * norm)) * weight[i];
         result +=
-            texture(textureSampler, vec2(coord) - (vec2(offset[i], offset[i]) * norm))
-                * weight[i];
+            texture(textureSampler, vec2(coord) - (vec2(offset[i], offset[i]) * norm)) * weight[i];
     }
     return result;
 }
@@ -65,10 +59,12 @@ vec4 blurDiagonal(sampler2D textureSampler, vec2 coord, vec2 norm) {
 void main() {
     vec3 base = texture(color_texture, vec2(frag_tex_coord)).rgb * weight[0];
     vec2 tex_offset = 1.0f / textureSize(color_texture, 0);
+
+    // TODO(Blinkhawk): This code can be optimized through shader group instructions.
     vec3 horizontal = blurHorizontal(color_texture, frag_tex_coord, tex_offset).rgb;
     vec3 vertical = blurVertical(color_texture, frag_tex_coord, tex_offset).rgb;
     vec3 diagonalA = blurVertical(color_texture, frag_tex_coord, tex_offset).rgb;
-    vec3 diagonalB = blurVertical(color_texture, frag_tex_coord, -tex_offset).rgb;
+    vec3 diagonalB = blurVertical(color_texture, frag_tex_coord, tex_offset * vec2(1.0, -1.0)).rgb;
     vec3 combination = mix(mix(horizontal, vertical, 0.5f), mix(diagonalA, diagonalB, 0.5f), 0.5f);
     color = vec4(combination + base, 1.0f);
 }