From f6f0762e81c45faa6293cbb1f0be0b0d9a4b7a7b Mon Sep 17 00:00:00 2001
From: Nguyen Dac Nam <nam.kazt.91@gmail.com>
Date: Tue, 18 Feb 2020 21:34:01 +0700
Subject: [PATCH 1/8] vk_shader: Implement function ImageLoad (Used by Kirby
 Start Allies)

 Please enter the commit message for your changes. Lines starting
---
 src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
index 24a658dce..070c98eef 100644
--- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
+++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
@@ -1748,8 +1748,12 @@ private:
     }
 
     Expression ImageLoad(Operation operation) {
-        UNIMPLEMENTED();
-        return {};
+        const auto& meta{std::get<MetaImage>(operation.GetMeta())};
+
+        const Id coords = GetCoordinates(operation, Type::Int);
+        const Id texel = OpImageRead(t_uint4, GetImage(operation), coords);
+
+        return {OpCompositeExtract(t_uint, texel, meta.element), Type::Uint};
     }
 
     Expression ImageStore(Operation operation) {

From 2ef8af93aa56c132519c1ddb56f97232b76f3c29 Mon Sep 17 00:00:00 2001
From: Nguyen Dac Nam <nam.kazt.91@gmail.com>
Date: Wed, 19 Feb 2020 10:16:51 +0700
Subject: [PATCH 2/8] vk_shader: add Capability StorageImageReadWithoutFormat

---
 src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
index 070c98eef..925d068ee 100644
--- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
+++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
@@ -274,6 +274,7 @@ public:
         AddCapability(spv::Capability::ImageBuffer);
         AddCapability(spv::Capability::ImageGatherExtended);
         AddCapability(spv::Capability::SampledBuffer);
+        AddCapability(spv::Capability::StorageImageReadWithoutFormat);
         AddCapability(spv::Capability::StorageImageWriteWithoutFormat);
         AddCapability(spv::Capability::SubgroupBallotKHR);
         AddCapability(spv::Capability::SubgroupVoteKHR);

From 47106ab1520c3878e4880e87f78e668d3c5d42b6 Mon Sep 17 00:00:00 2001
From: Nguyen Dac Nam <nam.kazt.91@gmail.com>
Date: Wed, 19 Feb 2020 12:55:56 +0700
Subject: [PATCH 3/8] vk_device: add check for
 shaderStorageImageReadWithoutFormat

---
 src/video_core/renderer_vulkan/vk_device.h | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/video_core/renderer_vulkan/vk_device.h b/src/video_core/renderer_vulkan/vk_device.h
index 72603f9f6..2c27ad730 100644
--- a/src/video_core/renderer_vulkan/vk_device.h
+++ b/src/video_core/renderer_vulkan/vk_device.h
@@ -122,6 +122,11 @@ public:
         return properties.limits.maxPushConstantsSize;
     }
 
+    /// Returns true if Shader storage Image Read Without Format supported.
+    bool IsShaderStorageImageReadWithoutFormatSupported() const {
+        return is_shader_storage_img_read_without_format_supported;
+    }
+
     /// Returns true if ASTC is natively supported.
     bool IsOptimalAstcSupported() const {
         return is_optimal_astc_supported;
@@ -227,6 +232,8 @@ private:
     bool ext_depth_range_unrestricted{};       ///< Support for VK_EXT_depth_range_unrestricted.
     bool ext_shader_viewport_index_layer{};    ///< Support for VK_EXT_shader_viewport_index_layer.
     bool nv_device_diagnostic_checkpoints{};   ///< Support for VK_NV_device_diagnostic_checkpoints.
+    bool is_shader_storage_img_read_without_format_supported{}; ///< Support for shader storage
+                                                                ///< image read without format
 
     // Telemetry parameters
     std::string vendor_name;                      ///< Device's driver name.

From e61c7e93104a551324e1229b5e8a732288266c83 Mon Sep 17 00:00:00 2001
From: Nguyen Dac Nam <nam.kazt.91@gmail.com>
Date: Wed, 19 Feb 2020 12:56:36 +0700
Subject: [PATCH 4/8] vk_device: setup shaderStorageImageReadWithoutFormat

---
 src/video_core/renderer_vulkan/vk_device.cpp | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/src/video_core/renderer_vulkan/vk_device.cpp b/src/video_core/renderer_vulkan/vk_device.cpp
index 9840f26e5..5df6441d3 100644
--- a/src/video_core/renderer_vulkan/vk_device.cpp
+++ b/src/video_core/renderer_vulkan/vk_device.cpp
@@ -106,6 +106,8 @@ bool VKDevice::Create(const vk::DispatchLoaderDynamic& dldi, vk::Instance instan
     features.tessellationShader = true;
     features.fragmentStoresAndAtomics = true;
     features.shaderImageGatherExtended = true;
+    features.shaderStorageImageReadWithoutFormat =
+        is_shader_storage_img_read_without_format_supported;
     features.shaderStorageImageWriteWithoutFormat = true;
     features.textureCompressionASTC_LDR = is_optimal_astc_supported;
 
@@ -457,6 +459,8 @@ void VKDevice::SetupFamilies(const vk::DispatchLoaderDynamic& dldi, vk::SurfaceK
 
 void VKDevice::SetupFeatures(const vk::DispatchLoaderDynamic& dldi) {
     const auto supported_features{physical.getFeatures(dldi)};
+    is_shader_storage_img_read_without_format_supported =
+        supported_features.shaderStorageImageReadWithoutFormat;
     is_optimal_astc_supported = IsOptimalAstcSupported(supported_features, dldi);
 }
 
@@ -530,6 +534,7 @@ std::unordered_map<vk::Format, vk::FormatProperties> VKDevice::GetFormatProperti
                                         vk::Format::eBc6HUfloatBlock,
                                         vk::Format::eBc6HSfloatBlock,
                                         vk::Format::eBc1RgbaSrgbBlock,
+                                        vk::Format::eBc2SrgbBlock,
                                         vk::Format::eBc3SrgbBlock,
                                         vk::Format::eBc7SrgbBlock,
                                         vk::Format::eAstc4x4SrgbBlock,

From 88cb05e6e79e01b4bc2fb29b4d1cb2b3a1c2f6d4 Mon Sep 17 00:00:00 2001
From: Nguyen Dac Nam <nam.kazt.91@gmail.com>
Date: Wed, 19 Feb 2020 12:57:22 +0700
Subject: [PATCH 5/8] shader_decompiler: add check in case of device not
 support ShaderStorageImageReadWithoutFormat

---
 src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
index 925d068ee..c02306d69 100644
--- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
+++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
@@ -1749,6 +1749,10 @@ private:
     }
 
     Expression ImageLoad(Operation operation) {
+        if (!device.IsShaderStorageImageReadWithoutFormatSupported()) {
+            return {v_float_zero, Type::Float};
+        }
+
         const auto& meta{std::get<MetaImage>(operation.GetMeta())};
 
         const Id coords = GetCoordinates(operation, Type::Int);

From fbbad9584530c186d2a592db8997eb850ba37547 Mon Sep 17 00:00:00 2001
From: Nguyen Dac Nam <nam.kazt.91@gmail.com>
Date: Thu, 20 Feb 2020 09:28:13 +0700
Subject: [PATCH 6/8] shader_decompiler: only add StorageImageReadWithoutFormat
 when available

---
 src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
index c02306d69..6cd5fae30 100644
--- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
+++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
@@ -274,7 +274,6 @@ public:
         AddCapability(spv::Capability::ImageBuffer);
         AddCapability(spv::Capability::ImageGatherExtended);
         AddCapability(spv::Capability::SampledBuffer);
-        AddCapability(spv::Capability::StorageImageReadWithoutFormat);
         AddCapability(spv::Capability::StorageImageWriteWithoutFormat);
         AddCapability(spv::Capability::SubgroupBallotKHR);
         AddCapability(spv::Capability::SubgroupVoteKHR);
@@ -290,6 +289,10 @@ public:
                 AddCapability(spv::Capability::ShaderViewportIndexLayerEXT);
             }
         }
+        
+        if (device.IsShaderStorageImageReadWithoutFormatSupported()) {
+            AddCapability(spv::Capability::StorageImageReadWithoutFormat);
+        }
 
         if (device.IsFloat16Supported()) {
             AddCapability(spv::Capability::Float16);

From ecf275887b0b51622c0c3a06cd438bda32dbfb01 Mon Sep 17 00:00:00 2001
From: Nguyen Dac Nam <nam.kazt.91@gmail.com>
Date: Thu, 20 Feb 2020 09:39:30 +0700
Subject: [PATCH 7/8] clang-format

---
 src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
index 6cd5fae30..77ea7b441 100644
--- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
+++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
@@ -289,7 +289,7 @@ public:
                 AddCapability(spv::Capability::ShaderViewportIndexLayerEXT);
             }
         }
-        
+
         if (device.IsShaderStorageImageReadWithoutFormatSupported()) {
             AddCapability(spv::Capability::StorageImageReadWithoutFormat);
         }

From c0c4da27d9432e4b8cf812190fd03f6c7b5b0e3d Mon Sep 17 00:00:00 2001
From: Nguyen Dac Nam <nam.kazt.91@gmail.com>
Date: Fri, 21 Feb 2020 08:56:18 +0700
Subject: [PATCH 8/8] vk_device: remove left over from other branch

---
 src/video_core/renderer_vulkan/vk_device.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/video_core/renderer_vulkan/vk_device.cpp b/src/video_core/renderer_vulkan/vk_device.cpp
index 5df6441d3..cbe36369b 100644
--- a/src/video_core/renderer_vulkan/vk_device.cpp
+++ b/src/video_core/renderer_vulkan/vk_device.cpp
@@ -534,7 +534,6 @@ std::unordered_map<vk::Format, vk::FormatProperties> VKDevice::GetFormatProperti
                                         vk::Format::eBc6HUfloatBlock,
                                         vk::Format::eBc6HSfloatBlock,
                                         vk::Format::eBc1RgbaSrgbBlock,
-                                        vk::Format::eBc2SrgbBlock,
                                         vk::Format::eBc3SrgbBlock,
                                         vk::Format::eBc7SrgbBlock,
                                         vk::Format::eAstc4x4SrgbBlock,