diff options
| author | 2021-06-25 05:25:19 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:39 -0400 | |
| commit | f94f0be5215369a6985247ad936d9d9f43c9b140 (patch) | |
| tree | 595b68392144a74b76a658b6c6ea2d898b6c6152 /src/video_core/vulkan_common | |
| parent | vk_graphics_pipeline: Implement line width (diff) | |
| download | yuzu-f94f0be5215369a6985247ad936d9d9f43c9b140.tar.gz yuzu-f94f0be5215369a6985247ad936d9d9f43c9b140.tar.xz yuzu-f94f0be5215369a6985247ad936d9d9f43c9b140.zip | |
vk_graphics_pipeline: Implement smooth lines
Diffstat (limited to 'src/video_core/vulkan_common')
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 41 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.h | 6 |
2 files changed, 42 insertions, 5 deletions
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 912e03c5c..4fa1470e8 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -416,6 +416,23 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | |||
| 416 | LOG_INFO(Render_Vulkan, "Device doesn't support extended dynamic state"); | 416 | LOG_INFO(Render_Vulkan, "Device doesn't support extended dynamic state"); |
| 417 | } | 417 | } |
| 418 | 418 | ||
| 419 | VkPhysicalDeviceLineRasterizationFeaturesEXT line_raster; | ||
| 420 | if (ext_line_rasterization) { | ||
| 421 | line_raster = { | ||
| 422 | .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, | ||
| 423 | .pNext = nullptr, | ||
| 424 | .rectangularLines = VK_TRUE, | ||
| 425 | .bresenhamLines = VK_FALSE, | ||
| 426 | .smoothLines = VK_TRUE, | ||
| 427 | .stippledRectangularLines = VK_FALSE, | ||
| 428 | .stippledBresenhamLines = VK_FALSE, | ||
| 429 | .stippledSmoothLines = VK_FALSE, | ||
| 430 | }; | ||
| 431 | SetNext(next, line_raster); | ||
| 432 | } else { | ||
| 433 | LOG_INFO(Render_Vulkan, "Device doesn't support smooth lines"); | ||
| 434 | } | ||
| 435 | |||
| 419 | if (!ext_conservative_rasterization) { | 436 | if (!ext_conservative_rasterization) { |
| 420 | LOG_INFO(Render_Vulkan, "Device doesn't support conservative rasterization"); | 437 | LOG_INFO(Render_Vulkan, "Device doesn't support conservative rasterization"); |
| 421 | } | 438 | } |
| @@ -757,6 +774,7 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 757 | bool has_ext_shader_atomic_int64{}; | 774 | bool has_ext_shader_atomic_int64{}; |
| 758 | bool has_ext_provoking_vertex{}; | 775 | bool has_ext_provoking_vertex{}; |
| 759 | bool has_ext_vertex_input_dynamic_state{}; | 776 | bool has_ext_vertex_input_dynamic_state{}; |
| 777 | bool has_ext_line_rasterization{}; | ||
| 760 | for (const VkExtensionProperties& extension : physical.EnumerateDeviceExtensionProperties()) { | 778 | for (const VkExtensionProperties& extension : physical.EnumerateDeviceExtensionProperties()) { |
| 761 | const auto test = [&](std::optional<std::reference_wrapper<bool>> status, const char* name, | 779 | const auto test = [&](std::optional<std::reference_wrapper<bool>> status, const char* name, |
| 762 | bool push) { | 780 | bool push) { |
| @@ -798,6 +816,7 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 798 | test(has_ext_shader_atomic_int64, VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME, false); | 816 | test(has_ext_shader_atomic_int64, VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME, false); |
| 799 | test(has_khr_workgroup_memory_explicit_layout, | 817 | test(has_khr_workgroup_memory_explicit_layout, |
| 800 | VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME, false); | 818 | VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME, false); |
| 819 | test(has_ext_line_rasterization, VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, false); | ||
| 801 | if (Settings::values.enable_nsight_aftermath) { | 820 | if (Settings::values.enable_nsight_aftermath) { |
| 802 | test(nv_device_diagnostics_config, VK_NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME, | 821 | test(nv_device_diagnostics_config, VK_NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME, |
| 803 | true); | 822 | true); |
| @@ -918,17 +937,29 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 918 | } | 937 | } |
| 919 | } | 938 | } |
| 920 | if (has_ext_extended_dynamic_state) { | 939 | if (has_ext_extended_dynamic_state) { |
| 921 | VkPhysicalDeviceExtendedDynamicStateFeaturesEXT dynamic_state; | 940 | VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extended_dynamic_state; |
| 922 | dynamic_state.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT; | 941 | extended_dynamic_state.sType = |
| 923 | dynamic_state.pNext = nullptr; | 942 | VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT; |
| 924 | features.pNext = &dynamic_state; | 943 | extended_dynamic_state.pNext = nullptr; |
| 944 | features.pNext = &extended_dynamic_state; | ||
| 925 | physical.GetFeatures2KHR(features); | 945 | physical.GetFeatures2KHR(features); |
| 926 | 946 | ||
| 927 | if (dynamic_state.extendedDynamicState) { | 947 | if (extended_dynamic_state.extendedDynamicState) { |
| 928 | extensions.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); | 948 | extensions.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); |
| 929 | ext_extended_dynamic_state = true; | 949 | ext_extended_dynamic_state = true; |
| 930 | } | 950 | } |
| 931 | } | 951 | } |
| 952 | if (has_ext_line_rasterization) { | ||
| 953 | VkPhysicalDeviceLineRasterizationFeaturesEXT line_raster; | ||
| 954 | line_raster.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT; | ||
| 955 | line_raster.pNext = nullptr; | ||
| 956 | features.pNext = &line_raster; | ||
| 957 | physical.GetFeatures2KHR(features); | ||
| 958 | if (line_raster.rectangularLines && line_raster.smoothLines) { | ||
| 959 | extensions.push_back(VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME); | ||
| 960 | ext_line_rasterization = true; | ||
| 961 | } | ||
| 962 | } | ||
| 932 | if (has_khr_workgroup_memory_explicit_layout) { | 963 | if (has_khr_workgroup_memory_explicit_layout) { |
| 933 | VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR layout; | 964 | VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR layout; |
| 934 | layout.sType = | 965 | layout.sType = |
diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index d0adc0127..26100166f 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h | |||
| @@ -259,6 +259,11 @@ public: | |||
| 259 | return ext_extended_dynamic_state; | 259 | return ext_extended_dynamic_state; |
| 260 | } | 260 | } |
| 261 | 261 | ||
| 262 | /// Returns true if the device supports VK_EXT_line_rasterization. | ||
| 263 | bool IsExtLineRasterizationSupported() const { | ||
| 264 | return ext_line_rasterization; | ||
| 265 | } | ||
| 266 | |||
| 262 | /// Returns true if the device supports VK_EXT_vertex_input_dynamic_state. | 267 | /// Returns true if the device supports VK_EXT_vertex_input_dynamic_state. |
| 263 | bool IsExtVertexInputDynamicStateSupported() const { | 268 | bool IsExtVertexInputDynamicStateSupported() const { |
| 264 | return ext_vertex_input_dynamic_state; | 269 | return ext_vertex_input_dynamic_state; |
| @@ -382,6 +387,7 @@ private: | |||
| 382 | bool ext_transform_feedback{}; ///< Support for VK_EXT_transform_feedback. | 387 | bool ext_transform_feedback{}; ///< Support for VK_EXT_transform_feedback. |
| 383 | bool ext_custom_border_color{}; ///< Support for VK_EXT_custom_border_color. | 388 | bool ext_custom_border_color{}; ///< Support for VK_EXT_custom_border_color. |
| 384 | bool ext_extended_dynamic_state{}; ///< Support for VK_EXT_extended_dynamic_state. | 389 | bool ext_extended_dynamic_state{}; ///< Support for VK_EXT_extended_dynamic_state. |
| 390 | bool ext_line_rasterization{}; ///< Support for VK_EXT_line_rasterization. | ||
| 385 | bool ext_vertex_input_dynamic_state{}; ///< Support for VK_EXT_vertex_input_dynamic_state. | 391 | bool ext_vertex_input_dynamic_state{}; ///< Support for VK_EXT_vertex_input_dynamic_state. |
| 386 | bool ext_shader_stencil_export{}; ///< Support for VK_EXT_shader_stencil_export. | 392 | bool ext_shader_stencil_export{}; ///< Support for VK_EXT_shader_stencil_export. |
| 387 | bool ext_shader_atomic_int64{}; ///< Support for VK_KHR_shader_atomic_int64. | 393 | bool ext_shader_atomic_int64{}; ///< Support for VK_KHR_shader_atomic_int64. |