diff options
| author | 2021-03-23 20:27:17 -0400 | |
|---|---|---|
| committer | 2021-07-22 21:51:24 -0400 | |
| commit | 3d07cef009cf9e287744c7771c67166ef5761ce8 (patch) | |
| tree | 78f4fea18d9facb72850b4c2fe115e96b7af8f26 /src/video_core | |
| parent | vk_pipeline_cache: Fix ReleaseContents order (diff) | |
| download | yuzu-3d07cef009cf9e287744c7771c67166ef5761ce8.tar.gz yuzu-3d07cef009cf9e287744c7771c67166ef5761ce8.tar.xz yuzu-3d07cef009cf9e287744c7771c67166ef5761ce8.zip | |
shader: Implement VOTE
Diffstat (limited to 'src/video_core')
4 files changed, 15 insertions, 1 deletions
diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp index 6684d37a6..8e544d745 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp | |||
| @@ -36,13 +36,18 @@ ComputePipeline::ComputePipeline(const Device& device, VKDescriptorPool& descrip | |||
| 36 | descriptor_update_template = std::move(tuple.descriptor_update_template); | 36 | descriptor_update_template = std::move(tuple.descriptor_update_template); |
| 37 | descriptor_allocator = DescriptorAllocator(descriptor_pool, *descriptor_set_layout); | 37 | descriptor_allocator = DescriptorAllocator(descriptor_pool, *descriptor_set_layout); |
| 38 | 38 | ||
| 39 | const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT subgroup_size_ci{ | ||
| 40 | .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT, | ||
| 41 | .pNext = nullptr, | ||
| 42 | .requiredSubgroupSize = GuestWarpSize, | ||
| 43 | }; | ||
| 39 | pipeline = device.GetLogical().CreateComputePipeline({ | 44 | pipeline = device.GetLogical().CreateComputePipeline({ |
| 40 | .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, | 45 | .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, |
| 41 | .pNext = nullptr, | 46 | .pNext = nullptr, |
| 42 | .flags = 0, | 47 | .flags = 0, |
| 43 | .stage{ | 48 | .stage{ |
| 44 | .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, | 49 | .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, |
| 45 | .pNext = nullptr, | 50 | .pNext = device.IsExtSubgroupSizeControlSupported() ? &subgroup_size_ci : nullptr, |
| 46 | .flags = 0, | 51 | .flags = 0, |
| 47 | .stage = VK_SHADER_STAGE_COMPUTE_BIT, | 52 | .stage = VK_SHADER_STAGE_COMPUTE_BIT, |
| 48 | .module = *spv_module, | 53 | .module = *spv_module, |
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 41fc9588f..bdbc8dd1e 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | |||
| @@ -455,6 +455,8 @@ PipelineCache::PipelineCache(RasterizerVulkan& rasterizer_, Tegra::GPU& gpu_, | |||
| 455 | float_control.shaderSignedZeroInfNanPreserveFloat32 != VK_FALSE, | 455 | float_control.shaderSignedZeroInfNanPreserveFloat32 != VK_FALSE, |
| 456 | .support_fp64_signed_zero_nan_preserve = | 456 | .support_fp64_signed_zero_nan_preserve = |
| 457 | float_control.shaderSignedZeroInfNanPreserveFloat64 != VK_FALSE, | 457 | float_control.shaderSignedZeroInfNanPreserveFloat64 != VK_FALSE, |
| 458 | .support_vote = true, | ||
| 459 | .warp_size_potentially_larger_than_guest = device.IsWarpSizePotentiallyBiggerThanGuest(), | ||
| 458 | .has_broken_spirv_clamp = driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR, | 460 | .has_broken_spirv_clamp = driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR, |
| 459 | }; | 461 | }; |
| 460 | } | 462 | } |
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index f0e5b098c..009b74f12 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -737,6 +737,7 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 737 | subgroup_properties.maxSubgroupSize >= GuestWarpSize) { | 737 | subgroup_properties.maxSubgroupSize >= GuestWarpSize) { |
| 738 | extensions.push_back(VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME); | 738 | extensions.push_back(VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME); |
| 739 | guest_warp_stages = subgroup_properties.requiredSubgroupSizeStages; | 739 | guest_warp_stages = subgroup_properties.requiredSubgroupSizeStages; |
| 740 | ext_subgroup_size_control = true; | ||
| 740 | } | 741 | } |
| 741 | } else { | 742 | } else { |
| 742 | is_warp_potentially_bigger = true; | 743 | is_warp_potentially_bigger = true; |
diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 82bccc8f0..c268a4f8d 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h | |||
| @@ -193,6 +193,11 @@ public: | |||
| 193 | return ext_shader_viewport_index_layer; | 193 | return ext_shader_viewport_index_layer; |
| 194 | } | 194 | } |
| 195 | 195 | ||
| 196 | /// Returns true if the device supports VK_EXT_subgroup_size_control. | ||
| 197 | bool IsExtSubgroupSizeControlSupported() const { | ||
| 198 | return ext_subgroup_size_control; | ||
| 199 | } | ||
| 200 | |||
| 196 | /// Returns true if the device supports VK_EXT_transform_feedback. | 201 | /// Returns true if the device supports VK_EXT_transform_feedback. |
| 197 | bool IsExtTransformFeedbackSupported() const { | 202 | bool IsExtTransformFeedbackSupported() const { |
| 198 | return ext_transform_feedback; | 203 | return ext_transform_feedback; |
| @@ -297,6 +302,7 @@ private: | |||
| 297 | bool ext_depth_range_unrestricted{}; ///< Support for VK_EXT_depth_range_unrestricted. | 302 | bool ext_depth_range_unrestricted{}; ///< Support for VK_EXT_depth_range_unrestricted. |
| 298 | bool ext_shader_viewport_index_layer{}; ///< Support for VK_EXT_shader_viewport_index_layer. | 303 | bool ext_shader_viewport_index_layer{}; ///< Support for VK_EXT_shader_viewport_index_layer. |
| 299 | bool ext_tooling_info{}; ///< Support for VK_EXT_tooling_info. | 304 | bool ext_tooling_info{}; ///< Support for VK_EXT_tooling_info. |
| 305 | bool ext_subgroup_size_control{}; ///< Support for VK_EXT_subgroup_size_control. | ||
| 300 | bool ext_transform_feedback{}; ///< Support for VK_EXT_transform_feedback. | 306 | bool ext_transform_feedback{}; ///< Support for VK_EXT_transform_feedback. |
| 301 | bool ext_custom_border_color{}; ///< Support for VK_EXT_custom_border_color. | 307 | bool ext_custom_border_color{}; ///< Support for VK_EXT_custom_border_color. |
| 302 | bool ext_extended_dynamic_state{}; ///< Support for VK_EXT_extended_dynamic_state. | 308 | bool ext_extended_dynamic_state{}; ///< Support for VK_EXT_extended_dynamic_state. |