From f6f0762e81c45faa6293cbb1f0be0b0d9a4b7a7b Mon Sep 17 00:00:00 2001 From: Nguyen Dac Nam Date: Tue, 18 Feb 2020 21:34:01 +0700 Subject: 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(-) (limited to 'src/video_core/renderer_vulkan') 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(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) { -- cgit v1.2.3 From 2ef8af93aa56c132519c1ddb56f97232b76f3c29 Mon Sep 17 00:00:00 2001 From: Nguyen Dac Nam Date: Wed, 19 Feb 2020 10:16:51 +0700 Subject: vk_shader: add Capability StorageImageReadWithoutFormat --- src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/video_core/renderer_vulkan') 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); -- cgit v1.2.3 From 47106ab1520c3878e4880e87f78e668d3c5d42b6 Mon Sep 17 00:00:00 2001 From: Nguyen Dac Nam Date: Wed, 19 Feb 2020 12:55:56 +0700 Subject: vk_device: add check for shaderStorageImageReadWithoutFormat --- src/video_core/renderer_vulkan/vk_device.h | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/video_core/renderer_vulkan') 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. -- cgit v1.2.3 From e61c7e93104a551324e1229b5e8a732288266c83 Mon Sep 17 00:00:00 2001 From: Nguyen Dac Nam Date: Wed, 19 Feb 2020 12:56:36 +0700 Subject: vk_device: setup shaderStorageImageReadWithoutFormat --- src/video_core/renderer_vulkan/vk_device.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/video_core/renderer_vulkan') 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 VKDevice::GetFormatProperti vk::Format::eBc6HUfloatBlock, vk::Format::eBc6HSfloatBlock, vk::Format::eBc1RgbaSrgbBlock, + vk::Format::eBc2SrgbBlock, vk::Format::eBc3SrgbBlock, vk::Format::eBc7SrgbBlock, vk::Format::eAstc4x4SrgbBlock, -- cgit v1.2.3 From 88cb05e6e79e01b4bc2fb29b4d1cb2b3a1c2f6d4 Mon Sep 17 00:00:00 2001 From: Nguyen Dac Nam Date: Wed, 19 Feb 2020 12:57:22 +0700 Subject: 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(+) (limited to 'src/video_core/renderer_vulkan') 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(operation.GetMeta())}; const Id coords = GetCoordinates(operation, Type::Int); -- cgit v1.2.3 From fbbad9584530c186d2a592db8997eb850ba37547 Mon Sep 17 00:00:00 2001 From: Nguyen Dac Nam Date: Thu, 20 Feb 2020 09:28:13 +0700 Subject: shader_decompiler: only add StorageImageReadWithoutFormat when available --- src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/video_core/renderer_vulkan') 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); -- cgit v1.2.3 From ecf275887b0b51622c0c3a06cd438bda32dbfb01 Mon Sep 17 00:00:00 2001 From: Nguyen Dac Nam Date: Thu, 20 Feb 2020 09:39:30 +0700 Subject: clang-format --- src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/video_core/renderer_vulkan') 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); } -- cgit v1.2.3 From c0c4da27d9432e4b8cf812190fd03f6c7b5b0e3d Mon Sep 17 00:00:00 2001 From: Nguyen Dac Nam Date: Fri, 21 Feb 2020 08:56:18 +0700 Subject: vk_device: remove left over from other branch --- src/video_core/renderer_vulkan/vk_device.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/video_core/renderer_vulkan') 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 VKDevice::GetFormatProperti vk::Format::eBc6HUfloatBlock, vk::Format::eBc6HSfloatBlock, vk::Format::eBc1RgbaSrgbBlock, - vk::Format::eBc2SrgbBlock, vk::Format::eBc3SrgbBlock, vk::Format::eBc7SrgbBlock, vk::Format::eAstc4x4SrgbBlock, -- cgit v1.2.3