diff options
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp | 7 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 25 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.h | 17 | 
3 files changed, 28 insertions, 21 deletions
| diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 7fe735e75..d514b71d0 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -605,8 +605,11 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) {          .flags = 0,          .topology = input_assembly_topology,          .primitiveRestartEnable = key.state.primitive_restart_enable != 0 && -                                  (device.IsExtPrimitiveTopologyListRestartSupported() || -                                   SupportsPrimitiveRestart(input_assembly_topology)), +                                  ((input_assembly_topology != VK_PRIMITIVE_TOPOLOGY_PATCH_LIST && +                                    device.IsTopologyListPrimitiveRestartSupported()) || +                                   SupportsPrimitiveRestart(input_assembly_topology) || +                                   (input_assembly_topology == VK_PRIMITIVE_TOPOLOGY_PATCH_LIST && +                                    device.IsPatchListPrimitiveRestartSupported())),      };      const VkPipelineTessellationStateCreateInfo tessellation_ci{          .sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 2413e72ba..9862b815b 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -1129,6 +1129,19 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) {              khr_pipeline_executable_properties = true;          }      } +    if (has_ext_primitive_topology_list_restart) { +        VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT primitive_topology_list_restart{}; +        primitive_topology_list_restart.sType = +            VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT; +        primitive_topology_list_restart.pNext = nullptr; +        features.pNext = &primitive_topology_list_restart; +        physical.GetFeatures2KHR(features); + +        is_topology_list_restart_supported = +            primitive_topology_list_restart.primitiveTopologyListRestart; +        is_patch_list_restart_supported = +            primitive_topology_list_restart.primitiveTopologyPatchListRestart; +    }      if (has_khr_image_format_list && has_khr_swapchain_mutable_format) {          extensions.push_back(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME);          extensions.push_back(VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME); @@ -1144,18 +1157,6 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) {          max_push_descriptors = push_descriptor.maxPushDescriptors;      } -    if (has_ext_primitive_topology_list_restart) { -        VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT primitive_topology_list_restart{}; -        primitive_topology_list_restart.sType = -            VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT; -        primitive_topology_list_restart.pNext = nullptr; -        physical_properties.pNext = &primitive_topology_list_restart; -        physical.GetProperties2KHR(physical_properties); -        is_topology_list_restart_supported = -            primitive_topology_list_restart.primitiveTopologyListRestart; -        is_patch_list_restart_supported = -            primitive_topology_list_restart.primitiveTopologyPatchListRestart; -    }      return extensions;  } diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index ed7782d42..4c9d86aad 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -238,14 +238,19 @@ public:          return khr_workgroup_memory_explicit_layout;      } -    /// Returns true if the device supports VK_EXT_index_type_uint8. -    bool IsExtIndexTypeUint8Supported() const { -        return ext_index_type_uint8; +    /// Returns true if the device supports VK_EXT_primitive_topology_list_restart. +    bool IsTopologyListPrimitiveRestartSupported() const { +        return is_topology_list_restart_supported;      }      /// Returns true if the device supports VK_EXT_primitive_topology_list_restart. -    bool IsExtPrimitiveTopologyListRestartSupported() const { -        return ext_primitive_topology_list_restart; +    bool IsPatchListPrimitiveRestartSupported() const { +        return is_patch_list_restart_supported; +    } + +    /// Returns true if the device supports VK_EXT_index_type_uint8. +    bool IsExtIndexTypeUint8Supported() const { +        return ext_index_type_uint8;      }      /// Returns true if the device supports VK_EXT_sampler_filter_minmax. @@ -419,8 +424,6 @@ private:      bool khr_pipeline_executable_properties{};   ///< Support for executable properties.      bool khr_swapchain_mutable_format{};         ///< Support for VK_KHR_swapchain_mutable_format.      bool ext_index_type_uint8{};                 ///< Support for VK_EXT_index_type_uint8. -    bool ext_primitive_topology_list_restart{};  ///< Support for -                                                 ///< VK_EXT_primitive_topology_list_restart.      bool ext_sampler_filter_minmax{};            ///< Support for VK_EXT_sampler_filter_minmax.      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. | 
