From 92a125283575c41554019e51402b8859477b220e Mon Sep 17 00:00:00 2001
From: wwylele <wwylele@gmail.com>
Date: Sat, 19 May 2018 00:36:33 +0300
Subject: [PATCH] gl_shader_gen: rearrange function definition to avoid
 suprious warnings

---
 .../renderer_opengl/gl_shader_gen.cpp         | 29 ++++++++++++-------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/src/video_core/renderer_opengl/gl_shader_gen.cpp b/src/video_core/renderer_opengl/gl_shader_gen.cpp
index 17c1b7e92..cea74a36f 100644
--- a/src/video_core/renderer_opengl/gl_shader_gen.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_gen.cpp
@@ -1640,6 +1640,24 @@ uint vertex_id = 0u;
 bool prim_emit = false;
 bool winding = false;
 
+void setemit(uint vertex_id_, bool prim_emit_, bool winding_);
+void emit();
+
+void main() {
+)";
+    for (u32 i = 0; i < config.state.num_outputs; ++i) {
+        out +=
+            "    output_buffer.attributes[" + std::to_string(i) + "] = vec4(0.0, 0.0, 0.0, 1.0);\n";
+    }
+
+    // execute shader
+    out += "\n    exec_shader();\n\n";
+
+    out += "}\n\n";
+
+    // Put the definition of setemit and emit after main to avoid spurious warning about
+    // uninitialized output_buffer in some drivers
+    out += R"(
 void setemit(uint vertex_id_, bool prim_emit_, bool winding_) {
     vertex_id = vertex_id_;
     prim_emit = prim_emit_;
@@ -1658,18 +1676,7 @@ void emit() {
         }
     }
 }
-
-void main() {
 )";
-    for (u32 i = 0; i < config.state.num_outputs; ++i) {
-        out +=
-            "    output_buffer.attributes[" + std::to_string(i) + "] = vec4(0.0, 0.0, 0.0, 1.0);\n";
-    }
-
-    // execute shader
-    out += "\n    exec_shader();\n\n";
-
-    out += "}\n\n";
 
     out += program_source;