diff options
| author | 2021-06-16 21:14:57 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:38 -0400 | |
| commit | ca67077ca87772b4b4ac61d08f5b2c60616348e0 (patch) | |
| tree | 2a861de6f5be92cbed1542f115a99e646a1793c9 | |
| parent | glsl: Fix cbuf component indexing bug falback (diff) | |
| download | yuzu-ca67077ca87772b4b4ac61d08f5b2c60616348e0.tar.gz yuzu-ca67077ca87772b4b4ac61d08f5b2c60616348e0.tar.xz yuzu-ca67077ca87772b4b4ac61d08f5b2c60616348e0.zip | |
vk_graphics_pipeline: Use VK_KHR_push_descriptor when available
~51% faster on Nvidia compared to previous method.
| -rw-r--r-- | src/video_core/renderer_vulkan/pipeline_helper.h | 32 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_compute_pipeline.cpp | 8 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp | 28 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_graphics_pipeline.h | 1 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 11 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.h | 12 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_wrapper.cpp | 1 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_wrapper.h | 31 |
8 files changed, 88 insertions, 36 deletions
diff --git a/src/video_core/renderer_vulkan/pipeline_helper.h b/src/video_core/renderer_vulkan/pipeline_helper.h index c6e5e059b..4847db6b6 100644 --- a/src/video_core/renderer_vulkan/pipeline_helper.h +++ b/src/video_core/renderer_vulkan/pipeline_helper.h | |||
| @@ -16,38 +16,50 @@ | |||
| 16 | #include "video_core/texture_cache/texture_cache.h" | 16 | #include "video_core/texture_cache/texture_cache.h" |
| 17 | #include "video_core/texture_cache/types.h" | 17 | #include "video_core/texture_cache/types.h" |
| 18 | #include "video_core/textures/texture.h" | 18 | #include "video_core/textures/texture.h" |
| 19 | #include "video_core/vulkan_common/vulkan_device.h" | ||
| 19 | 20 | ||
| 20 | namespace Vulkan { | 21 | namespace Vulkan { |
| 21 | 22 | ||
| 22 | class DescriptorLayoutBuilder { | 23 | class DescriptorLayoutBuilder { |
| 23 | public: | 24 | public: |
| 24 | DescriptorLayoutBuilder(const vk::Device& device_) : device{&device_} {} | 25 | DescriptorLayoutBuilder(const Device& device_) : device{&device_} {} |
| 25 | 26 | ||
| 26 | vk::DescriptorSetLayout CreateDescriptorSetLayout() const { | 27 | bool CanUsePushDescriptor() const noexcept { |
| 28 | return device->IsKhrPushDescriptorSupported() && | ||
| 29 | num_descriptors <= device->MaxPushDescriptors(); | ||
| 30 | } | ||
| 31 | |||
| 32 | vk::DescriptorSetLayout CreateDescriptorSetLayout(bool use_push_descriptor) const { | ||
| 27 | if (bindings.empty()) { | 33 | if (bindings.empty()) { |
| 28 | return nullptr; | 34 | return nullptr; |
| 29 | } | 35 | } |
| 30 | return device->CreateDescriptorSetLayout({ | 36 | const VkDescriptorSetLayoutCreateFlags flags = |
| 37 | use_push_descriptor ? VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR : 0; | ||
| 38 | return device->GetLogical().CreateDescriptorSetLayout({ | ||
| 31 | .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, | 39 | .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, |
| 32 | .pNext = nullptr, | 40 | .pNext = nullptr, |
| 33 | .flags = 0, | 41 | .flags = flags, |
| 34 | .bindingCount = static_cast<u32>(bindings.size()), | 42 | .bindingCount = static_cast<u32>(bindings.size()), |
| 35 | .pBindings = bindings.data(), | 43 | .pBindings = bindings.data(), |
| 36 | }); | 44 | }); |
| 37 | } | 45 | } |
| 38 | 46 | ||
| 39 | vk::DescriptorUpdateTemplateKHR CreateTemplate(VkDescriptorSetLayout descriptor_set_layout, | 47 | vk::DescriptorUpdateTemplateKHR CreateTemplate(VkDescriptorSetLayout descriptor_set_layout, |
| 40 | VkPipelineLayout pipeline_layout) const { | 48 | VkPipelineLayout pipeline_layout, |
| 49 | bool use_push_descriptor) const { | ||
| 41 | if (entries.empty()) { | 50 | if (entries.empty()) { |
| 42 | return nullptr; | 51 | return nullptr; |
| 43 | } | 52 | } |
| 44 | return device->CreateDescriptorUpdateTemplateKHR({ | 53 | const VkDescriptorUpdateTemplateType type = |
| 54 | use_push_descriptor ? VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR | ||
| 55 | : VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR; | ||
| 56 | return device->GetLogical().CreateDescriptorUpdateTemplateKHR({ | ||
| 45 | .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR, | 57 | .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR, |
| 46 | .pNext = nullptr, | 58 | .pNext = nullptr, |
| 47 | .flags = 0, | 59 | .flags = 0, |
| 48 | .descriptorUpdateEntryCount = static_cast<u32>(entries.size()), | 60 | .descriptorUpdateEntryCount = static_cast<u32>(entries.size()), |
| 49 | .pDescriptorUpdateEntries = entries.data(), | 61 | .pDescriptorUpdateEntries = entries.data(), |
| 50 | .templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR, | 62 | .templateType = type, |
| 51 | .descriptorSetLayout = descriptor_set_layout, | 63 | .descriptorSetLayout = descriptor_set_layout, |
| 52 | .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, | 64 | .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, |
| 53 | .pipelineLayout = pipeline_layout, | 65 | .pipelineLayout = pipeline_layout, |
| @@ -56,7 +68,7 @@ public: | |||
| 56 | } | 68 | } |
| 57 | 69 | ||
| 58 | vk::PipelineLayout CreatePipelineLayout(VkDescriptorSetLayout descriptor_set_layout) const { | 70 | vk::PipelineLayout CreatePipelineLayout(VkDescriptorSetLayout descriptor_set_layout) const { |
| 59 | return device->CreatePipelineLayout({ | 71 | return device->GetLogical().CreatePipelineLayout({ |
| 60 | .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, | 72 | .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, |
| 61 | .pNext = nullptr, | 73 | .pNext = nullptr, |
| 62 | .flags = 0, | 74 | .flags = 0, |
| @@ -97,14 +109,16 @@ private: | |||
| 97 | .stride = sizeof(DescriptorUpdateEntry), | 109 | .stride = sizeof(DescriptorUpdateEntry), |
| 98 | }); | 110 | }); |
| 99 | ++binding; | 111 | ++binding; |
| 112 | num_descriptors += descriptors[i].count; | ||
| 100 | offset += sizeof(DescriptorUpdateEntry); | 113 | offset += sizeof(DescriptorUpdateEntry); |
| 101 | } | 114 | } |
| 102 | } | 115 | } |
| 103 | 116 | ||
| 104 | const vk::Device* device{}; | 117 | const Device* device{}; |
| 105 | boost::container::small_vector<VkDescriptorSetLayoutBinding, 32> bindings; | 118 | boost::container::small_vector<VkDescriptorSetLayoutBinding, 32> bindings; |
| 106 | boost::container::small_vector<VkDescriptorUpdateTemplateEntryKHR, 32> entries; | 119 | boost::container::small_vector<VkDescriptorUpdateTemplateEntryKHR, 32> entries; |
| 107 | u32 binding{}; | 120 | u32 binding{}; |
| 121 | u32 num_descriptors{}; | ||
| 108 | size_t offset{}; | 122 | size_t offset{}; |
| 109 | }; | 123 | }; |
| 110 | 124 | ||
diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp index cc855a62e..70b84c7a6 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp | |||
| @@ -37,15 +37,14 @@ ComputePipeline::ComputePipeline(const Device& device_, DescriptorPool& descript | |||
| 37 | uniform_buffer_sizes.begin()); | 37 | uniform_buffer_sizes.begin()); |
| 38 | 38 | ||
| 39 | auto func{[this, &descriptor_pool, shader_notify] { | 39 | auto func{[this, &descriptor_pool, shader_notify] { |
| 40 | DescriptorLayoutBuilder builder{device.GetLogical()}; | 40 | DescriptorLayoutBuilder builder{device}; |
| 41 | builder.Add(info, VK_SHADER_STAGE_COMPUTE_BIT); | 41 | builder.Add(info, VK_SHADER_STAGE_COMPUTE_BIT); |
| 42 | 42 | ||
| 43 | descriptor_set_layout = builder.CreateDescriptorSetLayout(); | 43 | descriptor_set_layout = builder.CreateDescriptorSetLayout(false); |
| 44 | pipeline_layout = builder.CreatePipelineLayout(*descriptor_set_layout); | 44 | pipeline_layout = builder.CreatePipelineLayout(*descriptor_set_layout); |
| 45 | descriptor_update_template = | 45 | descriptor_update_template = |
| 46 | builder.CreateTemplate(*descriptor_set_layout, *pipeline_layout); | 46 | builder.CreateTemplate(*descriptor_set_layout, *pipeline_layout, false); |
| 47 | descriptor_allocator = descriptor_pool.Allocator(*descriptor_set_layout, info); | 47 | descriptor_allocator = descriptor_pool.Allocator(*descriptor_set_layout, info); |
| 48 | |||
| 49 | const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT subgroup_size_ci{ | 48 | const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT subgroup_size_ci{ |
| 50 | .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT, | 49 | .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT, |
| 51 | .pNext = nullptr, | 50 | .pNext = nullptr, |
| @@ -186,7 +185,6 @@ void ComputePipeline::Configure(Tegra::Engines::KeplerCompute& kepler_compute, | |||
| 186 | const void* const descriptor_data{update_descriptor_queue.UpdateData()}; | 185 | const void* const descriptor_data{update_descriptor_queue.UpdateData()}; |
| 187 | scheduler.Record([this, descriptor_data](vk::CommandBuffer cmdbuf) { | 186 | scheduler.Record([this, descriptor_data](vk::CommandBuffer cmdbuf) { |
| 188 | cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline); | 187 | cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline); |
| 189 | |||
| 190 | if (!descriptor_set_layout) { | 188 | if (!descriptor_set_layout) { |
| 191 | return; | 189 | return; |
| 192 | } | 190 | } |
diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index e02b1b7ab..2b59a9d88 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp | |||
| @@ -40,7 +40,7 @@ constexpr size_t NUM_STAGES = Maxwell::MaxShaderStage; | |||
| 40 | constexpr size_t MAX_IMAGE_ELEMENTS = 64; | 40 | constexpr size_t MAX_IMAGE_ELEMENTS = 64; |
| 41 | 41 | ||
| 42 | DescriptorLayoutBuilder MakeBuilder(const Device& device, std::span<const Shader::Info> infos) { | 42 | DescriptorLayoutBuilder MakeBuilder(const Device& device, std::span<const Shader::Info> infos) { |
| 43 | DescriptorLayoutBuilder builder{device.GetLogical()}; | 43 | DescriptorLayoutBuilder builder{device}; |
| 44 | for (size_t index = 0; index < infos.size(); ++index) { | 44 | for (size_t index = 0; index < infos.size(); ++index) { |
| 45 | static constexpr std::array stages{ | 45 | static constexpr std::array stages{ |
| 46 | VK_SHADER_STAGE_VERTEX_BIT, | 46 | VK_SHADER_STAGE_VERTEX_BIT, |
| @@ -229,12 +229,15 @@ GraphicsPipeline::GraphicsPipeline( | |||
| 229 | } | 229 | } |
| 230 | auto func{[this, shader_notify, &render_pass_cache, &descriptor_pool] { | 230 | auto func{[this, shader_notify, &render_pass_cache, &descriptor_pool] { |
| 231 | DescriptorLayoutBuilder builder{MakeBuilder(device, stage_infos)}; | 231 | DescriptorLayoutBuilder builder{MakeBuilder(device, stage_infos)}; |
| 232 | descriptor_set_layout = builder.CreateDescriptorSetLayout(); | 232 | uses_push_descriptor = builder.CanUsePushDescriptor(); |
| 233 | descriptor_allocator = descriptor_pool.Allocator(*descriptor_set_layout, stage_infos); | 233 | descriptor_set_layout = builder.CreateDescriptorSetLayout(uses_push_descriptor); |
| 234 | 234 | if (!uses_push_descriptor) { | |
| 235 | descriptor_allocator = descriptor_pool.Allocator(*descriptor_set_layout, stage_infos); | ||
| 236 | } | ||
| 235 | const VkDescriptorSetLayout set_layout{*descriptor_set_layout}; | 237 | const VkDescriptorSetLayout set_layout{*descriptor_set_layout}; |
| 236 | pipeline_layout = builder.CreatePipelineLayout(set_layout); | 238 | pipeline_layout = builder.CreatePipelineLayout(set_layout); |
| 237 | descriptor_update_template = builder.CreateTemplate(set_layout, *pipeline_layout); | 239 | descriptor_update_template = |
| 240 | builder.CreateTemplate(set_layout, *pipeline_layout, uses_push_descriptor); | ||
| 238 | 241 | ||
| 239 | const VkRenderPass render_pass{render_pass_cache.Get(MakeRenderPassKey(key.state))}; | 242 | const VkRenderPass render_pass{render_pass_cache.Get(MakeRenderPassKey(key.state))}; |
| 240 | Validate(); | 243 | Validate(); |
| @@ -462,11 +465,16 @@ void GraphicsPipeline::ConfigureDraw() { | |||
| 462 | if (!descriptor_set_layout) { | 465 | if (!descriptor_set_layout) { |
| 463 | return; | 466 | return; |
| 464 | } | 467 | } |
| 465 | const VkDescriptorSet descriptor_set{descriptor_allocator.Commit()}; | 468 | if (uses_push_descriptor) { |
| 466 | const vk::Device& dev{device.GetLogical()}; | 469 | cmdbuf.PushDescriptorSetWithTemplateKHR(*descriptor_update_template, *pipeline_layout, |
| 467 | dev.UpdateDescriptorSet(descriptor_set, *descriptor_update_template, descriptor_data); | 470 | 0, descriptor_data); |
| 468 | cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline_layout, 0, | 471 | } else { |
| 469 | descriptor_set, nullptr); | 472 | const VkDescriptorSet descriptor_set{descriptor_allocator.Commit()}; |
| 473 | const vk::Device& dev{device.GetLogical()}; | ||
| 474 | dev.UpdateDescriptorSet(descriptor_set, *descriptor_update_template, descriptor_data); | ||
| 475 | cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline_layout, 0, | ||
| 476 | descriptor_set, nullptr); | ||
| 477 | } | ||
| 470 | }); | 478 | }); |
| 471 | } | 479 | } |
| 472 | 480 | ||
diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h index 40d1edabd..622267147 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h | |||
| @@ -148,6 +148,7 @@ private: | |||
| 148 | std::condition_variable build_condvar; | 148 | std::condition_variable build_condvar; |
| 149 | std::mutex build_mutex; | 149 | std::mutex build_mutex; |
| 150 | std::atomic_bool is_built{false}; | 150 | std::atomic_bool is_built{false}; |
| 151 | bool uses_push_descriptor{false}; | ||
| 151 | }; | 152 | }; |
| 152 | 153 | ||
| 153 | } // namespace Vulkan | 154 | } // namespace Vulkan |
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 0d8c6cd08..9d918de8d 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -767,6 +767,7 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 767 | test(khr_uniform_buffer_standard_layout, | 767 | test(khr_uniform_buffer_standard_layout, |
| 768 | VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, true); | 768 | VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, true); |
| 769 | test(khr_spirv_1_4, VK_KHR_SPIRV_1_4_EXTENSION_NAME, true); | 769 | test(khr_spirv_1_4, VK_KHR_SPIRV_1_4_EXTENSION_NAME, true); |
| 770 | test(khr_push_descriptor, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, true); | ||
| 770 | test(has_khr_shader_float16_int8, VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, false); | 771 | test(has_khr_shader_float16_int8, VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, false); |
| 771 | test(ext_depth_range_unrestricted, VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME, true); | 772 | test(ext_depth_range_unrestricted, VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME, true); |
| 772 | test(ext_index_type_uint8, VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, true); | 773 | test(ext_index_type_uint8, VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, true); |
| @@ -932,6 +933,16 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 932 | khr_workgroup_memory_explicit_layout = true; | 933 | khr_workgroup_memory_explicit_layout = true; |
| 933 | } | 934 | } |
| 934 | } | 935 | } |
| 936 | if (khr_push_descriptor) { | ||
| 937 | VkPhysicalDevicePushDescriptorPropertiesKHR push_descriptor; | ||
| 938 | push_descriptor.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR; | ||
| 939 | push_descriptor.pNext = nullptr; | ||
| 940 | |||
| 941 | physical_properties.pNext = &push_descriptor; | ||
| 942 | physical.GetProperties2KHR(physical_properties); | ||
| 943 | |||
| 944 | max_push_descriptors = push_descriptor.maxPushDescriptors; | ||
| 945 | } | ||
| 935 | return extensions; | 946 | return extensions; |
| 936 | } | 947 | } |
| 937 | 948 | ||
diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 4fda472b0..49605752d 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h | |||
| @@ -154,6 +154,11 @@ public: | |||
| 154 | return guest_warp_stages & stage; | 154 | return guest_warp_stages & stage; |
| 155 | } | 155 | } |
| 156 | 156 | ||
| 157 | /// Returns the maximum number of push descriptors. | ||
| 158 | u32 MaxPushDescriptors() const { | ||
| 159 | return max_push_descriptors; | ||
| 160 | } | ||
| 161 | |||
| 157 | /// Returns true if formatless image load is supported. | 162 | /// Returns true if formatless image load is supported. |
| 158 | bool IsFormatlessImageLoadSupported() const { | 163 | bool IsFormatlessImageLoadSupported() const { |
| 159 | return is_formatless_image_load_supported; | 164 | return is_formatless_image_load_supported; |
| @@ -194,6 +199,11 @@ public: | |||
| 194 | return khr_spirv_1_4; | 199 | return khr_spirv_1_4; |
| 195 | } | 200 | } |
| 196 | 201 | ||
| 202 | /// Returns true if the device supports VK_KHR_push_descriptor. | ||
| 203 | bool IsKhrPushDescriptorSupported() const { | ||
| 204 | return khr_push_descriptor; | ||
| 205 | } | ||
| 206 | |||
| 197 | /// Returns true if the device supports VK_KHR_workgroup_memory_explicit_layout. | 207 | /// Returns true if the device supports VK_KHR_workgroup_memory_explicit_layout. |
| 198 | bool IsKhrWorkgroupMemoryExplicitLayoutSupported() const { | 208 | bool IsKhrWorkgroupMemoryExplicitLayoutSupported() const { |
| 199 | return khr_workgroup_memory_explicit_layout; | 209 | return khr_workgroup_memory_explicit_layout; |
| @@ -330,6 +340,7 @@ private: | |||
| 330 | VkDriverIdKHR driver_id{}; ///< Driver ID. | 340 | VkDriverIdKHR driver_id{}; ///< Driver ID. |
| 331 | VkShaderStageFlags guest_warp_stages{}; ///< Stages where the guest warp size can be forced. | 341 | VkShaderStageFlags guest_warp_stages{}; ///< Stages where the guest warp size can be forced. |
| 332 | u64 device_access_memory{}; ///< Total size of device local memory in bytes. | 342 | u64 device_access_memory{}; ///< Total size of device local memory in bytes. |
| 343 | u32 max_push_descriptors{}; ///< Maximum number of push descriptors | ||
| 333 | bool is_optimal_astc_supported{}; ///< Support for native ASTC. | 344 | bool is_optimal_astc_supported{}; ///< Support for native ASTC. |
| 334 | bool is_float16_supported{}; ///< Support for float16 arithmetics. | 345 | bool is_float16_supported{}; ///< Support for float16 arithmetics. |
| 335 | bool is_warp_potentially_bigger{}; ///< Host warp size can be bigger than guest. | 346 | bool is_warp_potentially_bigger{}; ///< Host warp size can be bigger than guest. |
| @@ -345,6 +356,7 @@ private: | |||
| 345 | bool khr_uniform_buffer_standard_layout{}; ///< Support for scalar uniform buffer layouts. | 356 | bool khr_uniform_buffer_standard_layout{}; ///< Support for scalar uniform buffer layouts. |
| 346 | bool khr_spirv_1_4{}; ///< Support for VK_KHR_spirv_1_4. | 357 | bool khr_spirv_1_4{}; ///< Support for VK_KHR_spirv_1_4. |
| 347 | bool khr_workgroup_memory_explicit_layout{}; ///< Support for explicit workgroup layouts. | 358 | bool khr_workgroup_memory_explicit_layout{}; ///< Support for explicit workgroup layouts. |
| 359 | bool khr_push_descriptor{}; ///< Support for VK_KHR_push_descritor. | ||
| 348 | bool ext_index_type_uint8{}; ///< Support for VK_EXT_index_type_uint8. | 360 | bool ext_index_type_uint8{}; ///< Support for VK_EXT_index_type_uint8. |
| 349 | bool ext_sampler_filter_minmax{}; ///< Support for VK_EXT_sampler_filter_minmax. | 361 | bool ext_sampler_filter_minmax{}; ///< Support for VK_EXT_sampler_filter_minmax. |
| 350 | bool ext_depth_range_unrestricted{}; ///< Support for VK_EXT_depth_range_unrestricted. | 362 | bool ext_depth_range_unrestricted{}; ///< Support for VK_EXT_depth_range_unrestricted. |
diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index 7e13ae8af..d7e9fac22 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp | |||
| @@ -103,6 +103,7 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { | |||
| 103 | X(vkCmdFillBuffer); | 103 | X(vkCmdFillBuffer); |
| 104 | X(vkCmdPipelineBarrier); | 104 | X(vkCmdPipelineBarrier); |
| 105 | X(vkCmdPushConstants); | 105 | X(vkCmdPushConstants); |
| 106 | X(vkCmdPushDescriptorSetWithTemplateKHR); | ||
| 106 | X(vkCmdSetBlendConstants); | 107 | X(vkCmdSetBlendConstants); |
| 107 | X(vkCmdSetDepthBias); | 108 | X(vkCmdSetDepthBias); |
| 108 | X(vkCmdSetDepthBounds); | 109 | X(vkCmdSetDepthBounds); |
diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index 6e5be1186..d43b606f1 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h | |||
| @@ -193,15 +193,16 @@ struct DeviceDispatch : InstanceDispatch { | |||
| 193 | PFN_vkBeginCommandBuffer vkBeginCommandBuffer{}; | 193 | PFN_vkBeginCommandBuffer vkBeginCommandBuffer{}; |
| 194 | PFN_vkBindBufferMemory vkBindBufferMemory{}; | 194 | PFN_vkBindBufferMemory vkBindBufferMemory{}; |
| 195 | PFN_vkBindImageMemory vkBindImageMemory{}; | 195 | PFN_vkBindImageMemory vkBindImageMemory{}; |
| 196 | PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT{}; | ||
| 196 | PFN_vkCmdBeginQuery vkCmdBeginQuery{}; | 197 | PFN_vkCmdBeginQuery vkCmdBeginQuery{}; |
| 197 | PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass{}; | 198 | PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass{}; |
| 198 | PFN_vkCmdBeginTransformFeedbackEXT vkCmdBeginTransformFeedbackEXT{}; | 199 | PFN_vkCmdBeginTransformFeedbackEXT vkCmdBeginTransformFeedbackEXT{}; |
| 199 | PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT{}; | ||
| 200 | PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets{}; | 200 | PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets{}; |
| 201 | PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer{}; | 201 | PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer{}; |
| 202 | PFN_vkCmdBindPipeline vkCmdBindPipeline{}; | 202 | PFN_vkCmdBindPipeline vkCmdBindPipeline{}; |
| 203 | PFN_vkCmdBindTransformFeedbackBuffersEXT vkCmdBindTransformFeedbackBuffersEXT{}; | 203 | PFN_vkCmdBindTransformFeedbackBuffersEXT vkCmdBindTransformFeedbackBuffersEXT{}; |
| 204 | PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers{}; | 204 | PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers{}; |
| 205 | PFN_vkCmdBindVertexBuffers2EXT vkCmdBindVertexBuffers2EXT{}; | ||
| 205 | PFN_vkCmdBlitImage vkCmdBlitImage{}; | 206 | PFN_vkCmdBlitImage vkCmdBlitImage{}; |
| 206 | PFN_vkCmdClearAttachments vkCmdClearAttachments{}; | 207 | PFN_vkCmdClearAttachments vkCmdClearAttachments{}; |
| 207 | PFN_vkCmdCopyBuffer vkCmdCopyBuffer{}; | 208 | PFN_vkCmdCopyBuffer vkCmdCopyBuffer{}; |
| @@ -211,35 +212,35 @@ struct DeviceDispatch : InstanceDispatch { | |||
| 211 | PFN_vkCmdDispatch vkCmdDispatch{}; | 212 | PFN_vkCmdDispatch vkCmdDispatch{}; |
| 212 | PFN_vkCmdDraw vkCmdDraw{}; | 213 | PFN_vkCmdDraw vkCmdDraw{}; |
| 213 | PFN_vkCmdDrawIndexed vkCmdDrawIndexed{}; | 214 | PFN_vkCmdDrawIndexed vkCmdDrawIndexed{}; |
| 215 | PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT{}; | ||
| 214 | PFN_vkCmdEndQuery vkCmdEndQuery{}; | 216 | PFN_vkCmdEndQuery vkCmdEndQuery{}; |
| 215 | PFN_vkCmdEndRenderPass vkCmdEndRenderPass{}; | 217 | PFN_vkCmdEndRenderPass vkCmdEndRenderPass{}; |
| 216 | PFN_vkCmdEndTransformFeedbackEXT vkCmdEndTransformFeedbackEXT{}; | 218 | PFN_vkCmdEndTransformFeedbackEXT vkCmdEndTransformFeedbackEXT{}; |
| 217 | PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT{}; | ||
| 218 | PFN_vkCmdFillBuffer vkCmdFillBuffer{}; | 219 | PFN_vkCmdFillBuffer vkCmdFillBuffer{}; |
| 219 | PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier{}; | 220 | PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier{}; |
| 220 | PFN_vkCmdPushConstants vkCmdPushConstants{}; | 221 | PFN_vkCmdPushConstants vkCmdPushConstants{}; |
| 222 | PFN_vkCmdPushDescriptorSetWithTemplateKHR vkCmdPushDescriptorSetWithTemplateKHR{}; | ||
| 223 | PFN_vkCmdResolveImage vkCmdResolveImage{}; | ||
| 221 | PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants{}; | 224 | PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants{}; |
| 225 | PFN_vkCmdSetCullModeEXT vkCmdSetCullModeEXT{}; | ||
| 222 | PFN_vkCmdSetDepthBias vkCmdSetDepthBias{}; | 226 | PFN_vkCmdSetDepthBias vkCmdSetDepthBias{}; |
| 223 | PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds{}; | 227 | PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds{}; |
| 224 | PFN_vkCmdSetEvent vkCmdSetEvent{}; | ||
| 225 | PFN_vkCmdSetScissor vkCmdSetScissor{}; | ||
| 226 | PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask{}; | ||
| 227 | PFN_vkCmdSetStencilReference vkCmdSetStencilReference{}; | ||
| 228 | PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask{}; | ||
| 229 | PFN_vkCmdSetViewport vkCmdSetViewport{}; | ||
| 230 | PFN_vkCmdWaitEvents vkCmdWaitEvents{}; | ||
| 231 | PFN_vkCmdBindVertexBuffers2EXT vkCmdBindVertexBuffers2EXT{}; | ||
| 232 | PFN_vkCmdSetCullModeEXT vkCmdSetCullModeEXT{}; | ||
| 233 | PFN_vkCmdSetDepthBoundsTestEnableEXT vkCmdSetDepthBoundsTestEnableEXT{}; | 228 | PFN_vkCmdSetDepthBoundsTestEnableEXT vkCmdSetDepthBoundsTestEnableEXT{}; |
| 234 | PFN_vkCmdSetDepthCompareOpEXT vkCmdSetDepthCompareOpEXT{}; | 229 | PFN_vkCmdSetDepthCompareOpEXT vkCmdSetDepthCompareOpEXT{}; |
| 235 | PFN_vkCmdSetDepthTestEnableEXT vkCmdSetDepthTestEnableEXT{}; | 230 | PFN_vkCmdSetDepthTestEnableEXT vkCmdSetDepthTestEnableEXT{}; |
| 236 | PFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT{}; | 231 | PFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT{}; |
| 232 | PFN_vkCmdSetEvent vkCmdSetEvent{}; | ||
| 237 | PFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT{}; | 233 | PFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT{}; |
| 238 | PFN_vkCmdSetPrimitiveTopologyEXT vkCmdSetPrimitiveTopologyEXT{}; | 234 | PFN_vkCmdSetPrimitiveTopologyEXT vkCmdSetPrimitiveTopologyEXT{}; |
| 235 | PFN_vkCmdSetScissor vkCmdSetScissor{}; | ||
| 236 | PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask{}; | ||
| 239 | PFN_vkCmdSetStencilOpEXT vkCmdSetStencilOpEXT{}; | 237 | PFN_vkCmdSetStencilOpEXT vkCmdSetStencilOpEXT{}; |
| 238 | PFN_vkCmdSetStencilReference vkCmdSetStencilReference{}; | ||
| 240 | PFN_vkCmdSetStencilTestEnableEXT vkCmdSetStencilTestEnableEXT{}; | 239 | PFN_vkCmdSetStencilTestEnableEXT vkCmdSetStencilTestEnableEXT{}; |
| 240 | PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask{}; | ||
| 241 | PFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT{}; | 241 | PFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT{}; |
| 242 | PFN_vkCmdResolveImage vkCmdResolveImage{}; | 242 | PFN_vkCmdSetViewport vkCmdSetViewport{}; |
| 243 | PFN_vkCmdWaitEvents vkCmdWaitEvents{}; | ||
| 243 | PFN_vkCreateBuffer vkCreateBuffer{}; | 244 | PFN_vkCreateBuffer vkCreateBuffer{}; |
| 244 | PFN_vkCreateBufferView vkCreateBufferView{}; | 245 | PFN_vkCreateBufferView vkCreateBufferView{}; |
| 245 | PFN_vkCreateCommandPool vkCreateCommandPool{}; | 246 | PFN_vkCreateCommandPool vkCreateCommandPool{}; |
| @@ -990,6 +991,12 @@ public: | |||
| 990 | dynamic_offsets.size(), dynamic_offsets.data()); | 991 | dynamic_offsets.size(), dynamic_offsets.data()); |
| 991 | } | 992 | } |
| 992 | 993 | ||
| 994 | void PushDescriptorSetWithTemplateKHR(VkDescriptorUpdateTemplateKHR update_template, | ||
| 995 | VkPipelineLayout layout, u32 set, | ||
| 996 | const void* data) const noexcept { | ||
| 997 | dld->vkCmdPushDescriptorSetWithTemplateKHR(handle, update_template, layout, set, data); | ||
| 998 | } | ||
| 999 | |||
| 993 | void BindPipeline(VkPipelineBindPoint bind_point, VkPipeline pipeline) const noexcept { | 1000 | void BindPipeline(VkPipelineBindPoint bind_point, VkPipeline pipeline) const noexcept { |
| 994 | dld->vkCmdBindPipeline(handle, bind_point, pipeline); | 1001 | dld->vkCmdBindPipeline(handle, bind_point, pipeline); |
| 995 | } | 1002 | } |