diff options
| author | 2023-06-05 19:27:36 +0300 | |
|---|---|---|
| committer | 2023-06-27 18:00:09 -0700 | |
| commit | b8c96cee5f2eb0bd5ba9ef46746daec78ee3bb44 (patch) | |
| tree | 2d3a0f346a361f14d46af1b9e16ca284056876e0 /src | |
| parent | renderer_vulkan: Don't assume debug tool with debug renderer (diff) | |
| download | yuzu-b8c96cee5f2eb0bd5ba9ef46746daec78ee3bb44.tar.gz yuzu-b8c96cee5f2eb0bd5ba9ef46746daec78ee3bb44.tar.xz yuzu-b8c96cee5f2eb0bd5ba9ef46746daec78ee3bb44.zip | |
renderer_vulkan: Add more feature checking
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 7 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.h | 16 |
3 files changed, 24 insertions, 3 deletions
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 9f316113c..d600c4e61 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | |||
| @@ -309,7 +309,7 @@ PipelineCache::PipelineCache(RasterizerVulkan& rasterizer_, const Device& device | |||
| 309 | .support_int16 = device.IsShaderInt16Supported(), | 309 | .support_int16 = device.IsShaderInt16Supported(), |
| 310 | .support_int64 = device.IsShaderInt64Supported(), | 310 | .support_int64 = device.IsShaderInt64Supported(), |
| 311 | .support_vertex_instance_id = false, | 311 | .support_vertex_instance_id = false, |
| 312 | .support_float_controls = true, | 312 | .support_float_controls = device.IsKhrShaderFloatControlsSupported(), |
| 313 | .support_separate_denorm_behavior = | 313 | .support_separate_denorm_behavior = |
| 314 | float_control.denormBehaviorIndependence == VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL, | 314 | float_control.denormBehaviorIndependence == VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL, |
| 315 | .support_separate_rounding_mode = | 315 | .support_separate_rounding_mode = |
| @@ -325,12 +325,13 @@ PipelineCache::PipelineCache(RasterizerVulkan& rasterizer_, const Device& device | |||
| 325 | .support_fp64_signed_zero_nan_preserve = | 325 | .support_fp64_signed_zero_nan_preserve = |
| 326 | float_control.shaderSignedZeroInfNanPreserveFloat64 != VK_FALSE, | 326 | float_control.shaderSignedZeroInfNanPreserveFloat64 != VK_FALSE, |
| 327 | .support_explicit_workgroup_layout = device.IsKhrWorkgroupMemoryExplicitLayoutSupported(), | 327 | .support_explicit_workgroup_layout = device.IsKhrWorkgroupMemoryExplicitLayoutSupported(), |
| 328 | .support_vote = true, | 328 | .support_vote = device.IsSubgroupFeatureSupported(VK_SUBGROUP_FEATURE_VOTE_BIT), |
| 329 | .support_viewport_index_layer_non_geometry = | 329 | .support_viewport_index_layer_non_geometry = |
| 330 | device.IsExtShaderViewportIndexLayerSupported(), | 330 | device.IsExtShaderViewportIndexLayerSupported(), |
| 331 | .support_viewport_mask = device.IsNvViewportArray2Supported(), | 331 | .support_viewport_mask = device.IsNvViewportArray2Supported(), |
| 332 | .support_typeless_image_loads = device.IsFormatlessImageLoadSupported(), | 332 | .support_typeless_image_loads = device.IsFormatlessImageLoadSupported(), |
| 333 | .support_demote_to_helper_invocation = true, | 333 | .support_demote_to_helper_invocation = |
| 334 | device.IsExtShaderDemoteToHelperInvocationSupported(), | ||
| 334 | .support_int64_atomics = device.IsExtShaderAtomicInt64Supported(), | 335 | .support_int64_atomics = device.IsExtShaderAtomicInt64Supported(), |
| 335 | .support_derivative_control = true, | 336 | .support_derivative_control = true, |
| 336 | .support_geometry_shader_passthrough = device.IsNvGeometryShaderPassthroughSupported(), | 337 | .support_geometry_shader_passthrough = device.IsNvGeometryShaderPassthroughSupported(), |
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 9743a82f5..70436cf1c 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -905,6 +905,10 @@ bool Device::GetSuitability(bool requires_swapchain) { | |||
| 905 | properties.driver.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES; | 905 | properties.driver.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES; |
| 906 | SetNext(next, properties.driver); | 906 | SetNext(next, properties.driver); |
| 907 | 907 | ||
| 908 | // Retrieve subgroup properties. | ||
| 909 | properties.subgroup_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES; | ||
| 910 | SetNext(next, properties.subgroup_properties); | ||
| 911 | |||
| 908 | // Retrieve relevant extension properties. | 912 | // Retrieve relevant extension properties. |
| 909 | if (extensions.shader_float_controls) { | 913 | if (extensions.shader_float_controls) { |
| 910 | properties.float_controls.sType = | 914 | properties.float_controls.sType = |
diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 7be631122..e05d04db3 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h | |||
| @@ -323,6 +323,11 @@ public: | |||
| 323 | return properties.subgroup_size_control.requiredSubgroupSizeStages & stage; | 323 | return properties.subgroup_size_control.requiredSubgroupSizeStages & stage; |
| 324 | } | 324 | } |
| 325 | 325 | ||
| 326 | /// Returns true if the device supports the provided subgroup feature. | ||
| 327 | bool IsSubgroupFeatureSupported(VkSubgroupFeatureFlagBits feature) const { | ||
| 328 | return properties.subgroup_properties.supportedOperations & feature; | ||
| 329 | } | ||
| 330 | |||
| 326 | /// Returns the maximum number of push descriptors. | 331 | /// Returns the maximum number of push descriptors. |
| 327 | u32 MaxPushDescriptors() const { | 332 | u32 MaxPushDescriptors() const { |
| 328 | return properties.push_descriptor.maxPushDescriptors; | 333 | return properties.push_descriptor.maxPushDescriptors; |
| @@ -388,6 +393,11 @@ public: | |||
| 388 | return extensions.swapchain_mutable_format; | 393 | return extensions.swapchain_mutable_format; |
| 389 | } | 394 | } |
| 390 | 395 | ||
| 396 | /// Returns true if VK_KHR_shader_float_controls is enabled. | ||
| 397 | bool IsKhrShaderFloatControlsSupported() const { | ||
| 398 | return extensions.shader_float_controls; | ||
| 399 | } | ||
| 400 | |||
| 391 | /// Returns true if the device supports VK_KHR_workgroup_memory_explicit_layout. | 401 | /// Returns true if the device supports VK_KHR_workgroup_memory_explicit_layout. |
| 392 | bool IsKhrWorkgroupMemoryExplicitLayoutSupported() const { | 402 | bool IsKhrWorkgroupMemoryExplicitLayoutSupported() const { |
| 393 | return extensions.workgroup_memory_explicit_layout; | 403 | return extensions.workgroup_memory_explicit_layout; |
| @@ -487,6 +497,11 @@ public: | |||
| 487 | return extensions.shader_stencil_export; | 497 | return extensions.shader_stencil_export; |
| 488 | } | 498 | } |
| 489 | 499 | ||
| 500 | /// Returns true if the device supports VK_EXT_shader_demote_to_helper_invocation | ||
| 501 | bool IsExtShaderDemoteToHelperInvocationSupported() const { | ||
| 502 | return extensions.shader_demote_to_helper_invocation; | ||
| 503 | } | ||
| 504 | |||
| 490 | /// Returns true if the device supports VK_EXT_conservative_rasterization. | 505 | /// Returns true if the device supports VK_EXT_conservative_rasterization. |
| 491 | bool IsExtConservativeRasterizationSupported() const { | 506 | bool IsExtConservativeRasterizationSupported() const { |
| 492 | return extensions.conservative_rasterization; | 507 | return extensions.conservative_rasterization; |
| @@ -684,6 +699,7 @@ private: | |||
| 684 | 699 | ||
| 685 | struct Properties { | 700 | struct Properties { |
| 686 | VkPhysicalDeviceDriverProperties driver{}; | 701 | VkPhysicalDeviceDriverProperties driver{}; |
| 702 | VkPhysicalDeviceSubgroupProperties subgroup_properties{}; | ||
| 687 | VkPhysicalDeviceFloatControlsProperties float_controls{}; | 703 | VkPhysicalDeviceFloatControlsProperties float_controls{}; |
| 688 | VkPhysicalDevicePushDescriptorPropertiesKHR push_descriptor{}; | 704 | VkPhysicalDevicePushDescriptorPropertiesKHR push_descriptor{}; |
| 689 | VkPhysicalDeviceSubgroupSizeControlProperties subgroup_size_control{}; | 705 | VkPhysicalDeviceSubgroupSizeControlProperties subgroup_size_control{}; |