summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar GPUCode2023-06-05 19:27:36 +0300
committerGravatar bunnei2023-06-27 18:00:09 -0700
commitb8c96cee5f2eb0bd5ba9ef46746daec78ee3bb44 (patch)
tree2d3a0f346a361f14d46af1b9e16ca284056876e0
parentrenderer_vulkan: Don't assume debug tool with debug renderer (diff)
downloadyuzu-b8c96cee5f2eb0bd5ba9ef46746daec78ee3bb44.tar.gz
yuzu-b8c96cee5f2eb0bd5ba9ef46746daec78ee3bb44.tar.xz
yuzu-b8c96cee5f2eb0bd5ba9ef46746daec78ee3bb44.zip
renderer_vulkan: Add more feature checking
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.cpp7
-rw-r--r--src/video_core/vulkan_common/vulkan_device.cpp4
-rw-r--r--src/video_core/vulkan_common/vulkan_device.h16
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{};