diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 8ebb406904..a4737dfdd7 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -916,7 +916,7 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { } } - if (device.IsExtProvokingVertexSupported()) { + if (device.IsExtProvokingVertexDynamicStateSupported()) { dynamic_states.push_back(VK_DYNAMIC_STATE_PROVOKING_VERTEX_MODE_EXT); } diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 83d560e8b8..4650e827b3 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -1042,7 +1042,7 @@ void RasterizerVulkan::UpdateDynamicStates() { UpdateLogicOp(regs); } - if (device.IsExtProvokingVertexSupported()) { + if (device.IsExtProvokingVertexDynamicStateSupported()) { UpdateProvokingVertex(regs); } diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 45bbfb80eb..faeee1435b 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -1270,6 +1270,9 @@ void Device::RemoveUnsuitableExtensions() { const bool supports_alpha_to_one = features.extended_dynamic_state3.extendedDynamicState3AlphaToOneEnable && features.features.alphaToOne; + const bool supports_provoking_vertex_mode = + features.extended_dynamic_state3.extendedDynamicState3ProvokingVertexMode && + extensions.provoking_vertex; dynamic_state3_depth_clamp_enable = supports_depth_clamp_enable; dynamic_state3_logic_op_enable = supports_logic_op_enable; @@ -1278,6 +1281,7 @@ void Device::RemoveUnsuitableExtensions() { dynamic_state3_line_stipple_enable = supports_line_stipple_enable; dynamic_state3_alpha_to_coverage = supports_alpha_to_coverage; dynamic_state3_alpha_to_one = supports_alpha_to_one; + dynamic_state3_provoking_vertex_mode = supports_provoking_vertex_mode; dynamic_state3_enables = dynamic_state3_depth_clamp_enable || dynamic_state3_logic_op_enable || dynamic_state3_line_raster_mode || diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 2016649c17..82f925d450 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -715,6 +715,11 @@ public: return extensions.provoking_vertex; } + /// Returns true if provoking vertex can be used as a dynamic state. + bool IsExtProvokingVertexDynamicStateSupported() const { + return dynamic_state3_provoking_vertex_mode; + } + /// Returns true if the device supports VK_KHR_shader_atomic_int64. bool IsExtShaderAtomicInt64Supported() const { return extensions.shader_atomic_int64; @@ -1059,6 +1064,7 @@ private: bool dynamic_state3_line_stipple_enable{}; bool dynamic_state3_alpha_to_coverage{}; bool dynamic_state3_alpha_to_one{}; + bool dynamic_state3_provoking_vertex_mode{}; bool supports_conditional_barriers{}; ///< Allows barriers in conditional control flow. bool supports_dynamic_state{true}; ///< Core Vulkan 1.0 dynamic states size_t sampler_heap_budget{}; ///< Sampler budget for buggy drivers (0 = unlimited).