From 6c00151d17050861e76677c219296fb35bf76214 Mon Sep 17 00:00:00 2001
From: Fernando Sahmkow <fsahmkow27@gmail.com>
Date: Sat, 18 Dec 2021 07:03:13 +0100
Subject: [PATCH] Vulkan: Fix the checks for primitive restart extension.

---
 .../renderer_vulkan/vk_graphics_pipeline.cpp  |  7 ++++--
 .../vulkan_common/vulkan_device.cpp           | 25 ++++++++++---------
 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.