From fc0db612abedbba8245f94d03049f65d78819b26 Mon Sep 17 00:00:00 2001
From: ameerj <52414509+ameerj@users.noreply.github.com>
Date: Mon, 7 Jun 2021 18:29:13 -0400
Subject: [PATCH] glsl: Conditionally use GL_EXT_shader_image_load_formatted

Fix for SULD.D
---
 .../backend/glsl/emit_context.cpp             | 20 +++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/shader_recompiler/backend/glsl/emit_context.cpp b/src/shader_recompiler/backend/glsl/emit_context.cpp
index 50a7a7447..8cbb2ec57 100644
--- a/src/shader_recompiler/backend/glsl/emit_context.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_context.cpp
@@ -206,6 +206,20 @@ void SetupOutPerVertex(EmitContext& ctx, std::string& header) {
         header += "out int gl_ViewportIndex;";
     }
 }
+
+bool UsesTyplessImage(const Info& info) {
+    for (const auto& desc : info.image_buffer_descriptors) {
+        if (desc.format == ImageFormat::Typeless) {
+            return true;
+        }
+    }
+    for (const auto& desc : info.image_descriptors) {
+        if (desc.format == ImageFormat::Typeless) {
+            return true;
+        }
+    }
+    return false;
+}
 } // Anonymous namespace
 
 EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile& profile_,
@@ -281,8 +295,7 @@ EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile
 
 void EmitContext::SetupExtensions(std::string&) {
     // TODO: track this usage
-    header += "#extension GL_ARB_sparse_texture2 : enable\n"
-              "#extension GL_EXT_shader_image_load_formatted : enable\n";
+    header += "#extension GL_ARB_sparse_texture2 : enable\n";
     if (profile.support_gl_texture_shadow_lod) {
         header += "#extension GL_EXT_texture_shadow_lod : enable\n";
     }
@@ -318,6 +331,9 @@ void EmitContext::SetupExtensions(std::string&) {
         stage != Stage::Geometry) {
         header += "#extension GL_ARB_shader_viewport_layer_array : enable\n";
     }
+    if (UsesTyplessImage(info)) {
+        header += "#extension GL_EXT_shader_image_load_formatted : enable\n";
+    }
 }
 
 void EmitContext::DefineConstantBuffers(Bindings& bindings) {