vk_graphics_pipeline: Use VK_KHR_push_descriptor when available
~51% faster on Nvidia compared to previous method.
This commit is contained in:
		| @@ -16,38 +16,50 @@ | |||||||
| #include "video_core/texture_cache/texture_cache.h" | #include "video_core/texture_cache/texture_cache.h" | ||||||
| #include "video_core/texture_cache/types.h" | #include "video_core/texture_cache/types.h" | ||||||
| #include "video_core/textures/texture.h" | #include "video_core/textures/texture.h" | ||||||
|  | #include "video_core/vulkan_common/vulkan_device.h" | ||||||
|  |  | ||||||
| namespace Vulkan { | namespace Vulkan { | ||||||
|  |  | ||||||
| class DescriptorLayoutBuilder { | class DescriptorLayoutBuilder { | ||||||
| public: | public: | ||||||
|     DescriptorLayoutBuilder(const vk::Device& device_) : device{&device_} {} |     DescriptorLayoutBuilder(const Device& device_) : device{&device_} {} | ||||||
|  |  | ||||||
|     vk::DescriptorSetLayout CreateDescriptorSetLayout() const { |     bool CanUsePushDescriptor() const noexcept { | ||||||
|  |         return device->IsKhrPushDescriptorSupported() && | ||||||
|  |                num_descriptors <= device->MaxPushDescriptors(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     vk::DescriptorSetLayout CreateDescriptorSetLayout(bool use_push_descriptor) const { | ||||||
|         if (bindings.empty()) { |         if (bindings.empty()) { | ||||||
|             return nullptr; |             return nullptr; | ||||||
|         } |         } | ||||||
|         return device->CreateDescriptorSetLayout({ |         const VkDescriptorSetLayoutCreateFlags flags = | ||||||
|  |             use_push_descriptor ? VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR : 0; | ||||||
|  |         return device->GetLogical().CreateDescriptorSetLayout({ | ||||||
|             .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, |             .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, | ||||||
|             .pNext = nullptr, |             .pNext = nullptr, | ||||||
|             .flags = 0, |             .flags = flags, | ||||||
|             .bindingCount = static_cast<u32>(bindings.size()), |             .bindingCount = static_cast<u32>(bindings.size()), | ||||||
|             .pBindings = bindings.data(), |             .pBindings = bindings.data(), | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     vk::DescriptorUpdateTemplateKHR CreateTemplate(VkDescriptorSetLayout descriptor_set_layout, |     vk::DescriptorUpdateTemplateKHR CreateTemplate(VkDescriptorSetLayout descriptor_set_layout, | ||||||
|                                                    VkPipelineLayout pipeline_layout) const { |                                                    VkPipelineLayout pipeline_layout, | ||||||
|  |                                                    bool use_push_descriptor) const { | ||||||
|         if (entries.empty()) { |         if (entries.empty()) { | ||||||
|             return nullptr; |             return nullptr; | ||||||
|         } |         } | ||||||
|         return device->CreateDescriptorUpdateTemplateKHR({ |         const VkDescriptorUpdateTemplateType type = | ||||||
|  |             use_push_descriptor ? VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR | ||||||
|  |                                 : VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR; | ||||||
|  |         return device->GetLogical().CreateDescriptorUpdateTemplateKHR({ | ||||||
|             .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR, |             .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR, | ||||||
|             .pNext = nullptr, |             .pNext = nullptr, | ||||||
|             .flags = 0, |             .flags = 0, | ||||||
|             .descriptorUpdateEntryCount = static_cast<u32>(entries.size()), |             .descriptorUpdateEntryCount = static_cast<u32>(entries.size()), | ||||||
|             .pDescriptorUpdateEntries = entries.data(), |             .pDescriptorUpdateEntries = entries.data(), | ||||||
|             .templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR, |             .templateType = type, | ||||||
|             .descriptorSetLayout = descriptor_set_layout, |             .descriptorSetLayout = descriptor_set_layout, | ||||||
|             .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, |             .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, | ||||||
|             .pipelineLayout = pipeline_layout, |             .pipelineLayout = pipeline_layout, | ||||||
| @@ -56,7 +68,7 @@ public: | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     vk::PipelineLayout CreatePipelineLayout(VkDescriptorSetLayout descriptor_set_layout) const { |     vk::PipelineLayout CreatePipelineLayout(VkDescriptorSetLayout descriptor_set_layout) const { | ||||||
|         return device->CreatePipelineLayout({ |         return device->GetLogical().CreatePipelineLayout({ | ||||||
|             .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, |             .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, | ||||||
|             .pNext = nullptr, |             .pNext = nullptr, | ||||||
|             .flags = 0, |             .flags = 0, | ||||||
| @@ -97,14 +109,16 @@ private: | |||||||
|                 .stride = sizeof(DescriptorUpdateEntry), |                 .stride = sizeof(DescriptorUpdateEntry), | ||||||
|             }); |             }); | ||||||
|             ++binding; |             ++binding; | ||||||
|  |             num_descriptors += descriptors[i].count; | ||||||
|             offset += sizeof(DescriptorUpdateEntry); |             offset += sizeof(DescriptorUpdateEntry); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     const vk::Device* device{}; |     const Device* device{}; | ||||||
|     boost::container::small_vector<VkDescriptorSetLayoutBinding, 32> bindings; |     boost::container::small_vector<VkDescriptorSetLayoutBinding, 32> bindings; | ||||||
|     boost::container::small_vector<VkDescriptorUpdateTemplateEntryKHR, 32> entries; |     boost::container::small_vector<VkDescriptorUpdateTemplateEntryKHR, 32> entries; | ||||||
|     u32 binding{}; |     u32 binding{}; | ||||||
|  |     u32 num_descriptors{}; | ||||||
|     size_t offset{}; |     size_t offset{}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -37,15 +37,14 @@ ComputePipeline::ComputePipeline(const Device& device_, DescriptorPool& descript | |||||||
|                 uniform_buffer_sizes.begin()); |                 uniform_buffer_sizes.begin()); | ||||||
|  |  | ||||||
|     auto func{[this, &descriptor_pool, shader_notify] { |     auto func{[this, &descriptor_pool, shader_notify] { | ||||||
|         DescriptorLayoutBuilder builder{device.GetLogical()}; |         DescriptorLayoutBuilder builder{device}; | ||||||
|         builder.Add(info, VK_SHADER_STAGE_COMPUTE_BIT); |         builder.Add(info, VK_SHADER_STAGE_COMPUTE_BIT); | ||||||
|  |  | ||||||
|         descriptor_set_layout = builder.CreateDescriptorSetLayout(); |         descriptor_set_layout = builder.CreateDescriptorSetLayout(false); | ||||||
|         pipeline_layout = builder.CreatePipelineLayout(*descriptor_set_layout); |         pipeline_layout = builder.CreatePipelineLayout(*descriptor_set_layout); | ||||||
|         descriptor_update_template = |         descriptor_update_template = | ||||||
|             builder.CreateTemplate(*descriptor_set_layout, *pipeline_layout); |             builder.CreateTemplate(*descriptor_set_layout, *pipeline_layout, false); | ||||||
|         descriptor_allocator = descriptor_pool.Allocator(*descriptor_set_layout, info); |         descriptor_allocator = descriptor_pool.Allocator(*descriptor_set_layout, info); | ||||||
|  |  | ||||||
|         const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT subgroup_size_ci{ |         const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT subgroup_size_ci{ | ||||||
|             .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT, |             .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT, | ||||||
|             .pNext = nullptr, |             .pNext = nullptr, | ||||||
| @@ -186,7 +185,6 @@ void ComputePipeline::Configure(Tegra::Engines::KeplerCompute& kepler_compute, | |||||||
|     const void* const descriptor_data{update_descriptor_queue.UpdateData()}; |     const void* const descriptor_data{update_descriptor_queue.UpdateData()}; | ||||||
|     scheduler.Record([this, descriptor_data](vk::CommandBuffer cmdbuf) { |     scheduler.Record([this, descriptor_data](vk::CommandBuffer cmdbuf) { | ||||||
|         cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline); |         cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline); | ||||||
|  |  | ||||||
|         if (!descriptor_set_layout) { |         if (!descriptor_set_layout) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -40,7 +40,7 @@ constexpr size_t NUM_STAGES = Maxwell::MaxShaderStage; | |||||||
| constexpr size_t MAX_IMAGE_ELEMENTS = 64; | constexpr size_t MAX_IMAGE_ELEMENTS = 64; | ||||||
|  |  | ||||||
| DescriptorLayoutBuilder MakeBuilder(const Device& device, std::span<const Shader::Info> infos) { | DescriptorLayoutBuilder MakeBuilder(const Device& device, std::span<const Shader::Info> infos) { | ||||||
|     DescriptorLayoutBuilder builder{device.GetLogical()}; |     DescriptorLayoutBuilder builder{device}; | ||||||
|     for (size_t index = 0; index < infos.size(); ++index) { |     for (size_t index = 0; index < infos.size(); ++index) { | ||||||
|         static constexpr std::array stages{ |         static constexpr std::array stages{ | ||||||
|             VK_SHADER_STAGE_VERTEX_BIT, |             VK_SHADER_STAGE_VERTEX_BIT, | ||||||
| @@ -229,12 +229,15 @@ GraphicsPipeline::GraphicsPipeline( | |||||||
|     } |     } | ||||||
|     auto func{[this, shader_notify, &render_pass_cache, &descriptor_pool] { |     auto func{[this, shader_notify, &render_pass_cache, &descriptor_pool] { | ||||||
|         DescriptorLayoutBuilder builder{MakeBuilder(device, stage_infos)}; |         DescriptorLayoutBuilder builder{MakeBuilder(device, stage_infos)}; | ||||||
|         descriptor_set_layout = builder.CreateDescriptorSetLayout(); |         uses_push_descriptor = builder.CanUsePushDescriptor(); | ||||||
|  |         descriptor_set_layout = builder.CreateDescriptorSetLayout(uses_push_descriptor); | ||||||
|  |         if (!uses_push_descriptor) { | ||||||
|             descriptor_allocator = descriptor_pool.Allocator(*descriptor_set_layout, stage_infos); |             descriptor_allocator = descriptor_pool.Allocator(*descriptor_set_layout, stage_infos); | ||||||
|  |         } | ||||||
|         const VkDescriptorSetLayout set_layout{*descriptor_set_layout}; |         const VkDescriptorSetLayout set_layout{*descriptor_set_layout}; | ||||||
|         pipeline_layout = builder.CreatePipelineLayout(set_layout); |         pipeline_layout = builder.CreatePipelineLayout(set_layout); | ||||||
|         descriptor_update_template = builder.CreateTemplate(set_layout, *pipeline_layout); |         descriptor_update_template = | ||||||
|  |             builder.CreateTemplate(set_layout, *pipeline_layout, uses_push_descriptor); | ||||||
|  |  | ||||||
|         const VkRenderPass render_pass{render_pass_cache.Get(MakeRenderPassKey(key.state))}; |         const VkRenderPass render_pass{render_pass_cache.Get(MakeRenderPassKey(key.state))}; | ||||||
|         Validate(); |         Validate(); | ||||||
| @@ -462,11 +465,16 @@ void GraphicsPipeline::ConfigureDraw() { | |||||||
|         if (!descriptor_set_layout) { |         if (!descriptor_set_layout) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |         if (uses_push_descriptor) { | ||||||
|  |             cmdbuf.PushDescriptorSetWithTemplateKHR(*descriptor_update_template, *pipeline_layout, | ||||||
|  |                                                     0, descriptor_data); | ||||||
|  |         } else { | ||||||
|             const VkDescriptorSet descriptor_set{descriptor_allocator.Commit()}; |             const VkDescriptorSet descriptor_set{descriptor_allocator.Commit()}; | ||||||
|             const vk::Device& dev{device.GetLogical()}; |             const vk::Device& dev{device.GetLogical()}; | ||||||
|             dev.UpdateDescriptorSet(descriptor_set, *descriptor_update_template, descriptor_data); |             dev.UpdateDescriptorSet(descriptor_set, *descriptor_update_template, descriptor_data); | ||||||
|             cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline_layout, 0, |             cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline_layout, 0, | ||||||
|                                       descriptor_set, nullptr); |                                       descriptor_set, nullptr); | ||||||
|  |         } | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -148,6 +148,7 @@ private: | |||||||
|     std::condition_variable build_condvar; |     std::condition_variable build_condvar; | ||||||
|     std::mutex build_mutex; |     std::mutex build_mutex; | ||||||
|     std::atomic_bool is_built{false}; |     std::atomic_bool is_built{false}; | ||||||
|  |     bool uses_push_descriptor{false}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| } // namespace Vulkan | } // namespace Vulkan | ||||||
|   | |||||||
| @@ -767,6 +767,7 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||||||
|         test(khr_uniform_buffer_standard_layout, |         test(khr_uniform_buffer_standard_layout, | ||||||
|              VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, true); |              VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, true); | ||||||
|         test(khr_spirv_1_4, VK_KHR_SPIRV_1_4_EXTENSION_NAME, true); |         test(khr_spirv_1_4, VK_KHR_SPIRV_1_4_EXTENSION_NAME, true); | ||||||
|  |         test(khr_push_descriptor, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, true); | ||||||
|         test(has_khr_shader_float16_int8, VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, false); |         test(has_khr_shader_float16_int8, VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, false); | ||||||
|         test(ext_depth_range_unrestricted, VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME, true); |         test(ext_depth_range_unrestricted, VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME, true); | ||||||
|         test(ext_index_type_uint8, VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, true); |         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) { | |||||||
|             khr_workgroup_memory_explicit_layout = true; |             khr_workgroup_memory_explicit_layout = true; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |     if (khr_push_descriptor) { | ||||||
|  |         VkPhysicalDevicePushDescriptorPropertiesKHR push_descriptor; | ||||||
|  |         push_descriptor.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR; | ||||||
|  |         push_descriptor.pNext = nullptr; | ||||||
|  |  | ||||||
|  |         physical_properties.pNext = &push_descriptor; | ||||||
|  |         physical.GetProperties2KHR(physical_properties); | ||||||
|  |  | ||||||
|  |         max_push_descriptors = push_descriptor.maxPushDescriptors; | ||||||
|  |     } | ||||||
|     return extensions; |     return extensions; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -154,6 +154,11 @@ public: | |||||||
|         return guest_warp_stages & stage; |         return guest_warp_stages & stage; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /// Returns the maximum number of push descriptors. | ||||||
|  |     u32 MaxPushDescriptors() const { | ||||||
|  |         return max_push_descriptors; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /// Returns true if formatless image load is supported. |     /// Returns true if formatless image load is supported. | ||||||
|     bool IsFormatlessImageLoadSupported() const { |     bool IsFormatlessImageLoadSupported() const { | ||||||
|         return is_formatless_image_load_supported; |         return is_formatless_image_load_supported; | ||||||
| @@ -194,6 +199,11 @@ public: | |||||||
|         return khr_spirv_1_4; |         return khr_spirv_1_4; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /// Returns true if the device supports VK_KHR_push_descriptor. | ||||||
|  |     bool IsKhrPushDescriptorSupported() const { | ||||||
|  |         return khr_push_descriptor; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /// Returns true if the device supports VK_KHR_workgroup_memory_explicit_layout. |     /// Returns true if the device supports VK_KHR_workgroup_memory_explicit_layout. | ||||||
|     bool IsKhrWorkgroupMemoryExplicitLayoutSupported() const { |     bool IsKhrWorkgroupMemoryExplicitLayoutSupported() const { | ||||||
|         return khr_workgroup_memory_explicit_layout; |         return khr_workgroup_memory_explicit_layout; | ||||||
| @@ -330,6 +340,7 @@ private: | |||||||
|     VkDriverIdKHR driver_id{};                  ///< Driver ID. |     VkDriverIdKHR driver_id{};                  ///< Driver ID. | ||||||
|     VkShaderStageFlags guest_warp_stages{};     ///< Stages where the guest warp size can be forced. |     VkShaderStageFlags guest_warp_stages{};     ///< Stages where the guest warp size can be forced. | ||||||
|     u64 device_access_memory{};                 ///< Total size of device local memory in bytes. |     u64 device_access_memory{};                 ///< Total size of device local memory in bytes. | ||||||
|  |     u32 max_push_descriptors{};                 ///< Maximum number of push descriptors | ||||||
|     bool is_optimal_astc_supported{};           ///< Support for native ASTC. |     bool is_optimal_astc_supported{};           ///< Support for native ASTC. | ||||||
|     bool is_float16_supported{};                ///< Support for float16 arithmetics. |     bool is_float16_supported{};                ///< Support for float16 arithmetics. | ||||||
|     bool is_warp_potentially_bigger{};          ///< Host warp size can be bigger than guest. |     bool is_warp_potentially_bigger{};          ///< Host warp size can be bigger than guest. | ||||||
| @@ -345,6 +356,7 @@ private: | |||||||
|     bool khr_uniform_buffer_standard_layout{};  ///< Support for scalar uniform buffer layouts. |     bool khr_uniform_buffer_standard_layout{};  ///< Support for scalar uniform buffer layouts. | ||||||
|     bool khr_spirv_1_4{};                       ///< Support for VK_KHR_spirv_1_4. |     bool khr_spirv_1_4{};                       ///< Support for VK_KHR_spirv_1_4. | ||||||
|     bool khr_workgroup_memory_explicit_layout{}; ///< Support for explicit workgroup layouts. |     bool khr_workgroup_memory_explicit_layout{}; ///< Support for explicit workgroup layouts. | ||||||
|  |     bool khr_push_descriptor{};                  ///< Support for VK_KHR_push_descritor. | ||||||
|     bool ext_index_type_uint8{};                 ///< Support for VK_EXT_index_type_uint8. |     bool ext_index_type_uint8{};                 ///< Support for VK_EXT_index_type_uint8. | ||||||
|     bool ext_sampler_filter_minmax{};            ///< Support for VK_EXT_sampler_filter_minmax. |     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_depth_range_unrestricted{};         ///< Support for VK_EXT_depth_range_unrestricted. | ||||||
|   | |||||||
| @@ -103,6 +103,7 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { | |||||||
|     X(vkCmdFillBuffer); |     X(vkCmdFillBuffer); | ||||||
|     X(vkCmdPipelineBarrier); |     X(vkCmdPipelineBarrier); | ||||||
|     X(vkCmdPushConstants); |     X(vkCmdPushConstants); | ||||||
|  |     X(vkCmdPushDescriptorSetWithTemplateKHR); | ||||||
|     X(vkCmdSetBlendConstants); |     X(vkCmdSetBlendConstants); | ||||||
|     X(vkCmdSetDepthBias); |     X(vkCmdSetDepthBias); | ||||||
|     X(vkCmdSetDepthBounds); |     X(vkCmdSetDepthBounds); | ||||||
|   | |||||||
| @@ -193,15 +193,16 @@ struct DeviceDispatch : InstanceDispatch { | |||||||
|     PFN_vkBeginCommandBuffer vkBeginCommandBuffer{}; |     PFN_vkBeginCommandBuffer vkBeginCommandBuffer{}; | ||||||
|     PFN_vkBindBufferMemory vkBindBufferMemory{}; |     PFN_vkBindBufferMemory vkBindBufferMemory{}; | ||||||
|     PFN_vkBindImageMemory vkBindImageMemory{}; |     PFN_vkBindImageMemory vkBindImageMemory{}; | ||||||
|  |     PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT{}; | ||||||
|     PFN_vkCmdBeginQuery vkCmdBeginQuery{}; |     PFN_vkCmdBeginQuery vkCmdBeginQuery{}; | ||||||
|     PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass{}; |     PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass{}; | ||||||
|     PFN_vkCmdBeginTransformFeedbackEXT vkCmdBeginTransformFeedbackEXT{}; |     PFN_vkCmdBeginTransformFeedbackEXT vkCmdBeginTransformFeedbackEXT{}; | ||||||
|     PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT{}; |  | ||||||
|     PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets{}; |     PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets{}; | ||||||
|     PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer{}; |     PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer{}; | ||||||
|     PFN_vkCmdBindPipeline vkCmdBindPipeline{}; |     PFN_vkCmdBindPipeline vkCmdBindPipeline{}; | ||||||
|     PFN_vkCmdBindTransformFeedbackBuffersEXT vkCmdBindTransformFeedbackBuffersEXT{}; |     PFN_vkCmdBindTransformFeedbackBuffersEXT vkCmdBindTransformFeedbackBuffersEXT{}; | ||||||
|     PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers{}; |     PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers{}; | ||||||
|  |     PFN_vkCmdBindVertexBuffers2EXT vkCmdBindVertexBuffers2EXT{}; | ||||||
|     PFN_vkCmdBlitImage vkCmdBlitImage{}; |     PFN_vkCmdBlitImage vkCmdBlitImage{}; | ||||||
|     PFN_vkCmdClearAttachments vkCmdClearAttachments{}; |     PFN_vkCmdClearAttachments vkCmdClearAttachments{}; | ||||||
|     PFN_vkCmdCopyBuffer vkCmdCopyBuffer{}; |     PFN_vkCmdCopyBuffer vkCmdCopyBuffer{}; | ||||||
| @@ -211,35 +212,35 @@ struct DeviceDispatch : InstanceDispatch { | |||||||
|     PFN_vkCmdDispatch vkCmdDispatch{}; |     PFN_vkCmdDispatch vkCmdDispatch{}; | ||||||
|     PFN_vkCmdDraw vkCmdDraw{}; |     PFN_vkCmdDraw vkCmdDraw{}; | ||||||
|     PFN_vkCmdDrawIndexed vkCmdDrawIndexed{}; |     PFN_vkCmdDrawIndexed vkCmdDrawIndexed{}; | ||||||
|  |     PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT{}; | ||||||
|     PFN_vkCmdEndQuery vkCmdEndQuery{}; |     PFN_vkCmdEndQuery vkCmdEndQuery{}; | ||||||
|     PFN_vkCmdEndRenderPass vkCmdEndRenderPass{}; |     PFN_vkCmdEndRenderPass vkCmdEndRenderPass{}; | ||||||
|     PFN_vkCmdEndTransformFeedbackEXT vkCmdEndTransformFeedbackEXT{}; |     PFN_vkCmdEndTransformFeedbackEXT vkCmdEndTransformFeedbackEXT{}; | ||||||
|     PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT{}; |  | ||||||
|     PFN_vkCmdFillBuffer vkCmdFillBuffer{}; |     PFN_vkCmdFillBuffer vkCmdFillBuffer{}; | ||||||
|     PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier{}; |     PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier{}; | ||||||
|     PFN_vkCmdPushConstants vkCmdPushConstants{}; |     PFN_vkCmdPushConstants vkCmdPushConstants{}; | ||||||
|  |     PFN_vkCmdPushDescriptorSetWithTemplateKHR vkCmdPushDescriptorSetWithTemplateKHR{}; | ||||||
|  |     PFN_vkCmdResolveImage vkCmdResolveImage{}; | ||||||
|     PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants{}; |     PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants{}; | ||||||
|  |     PFN_vkCmdSetCullModeEXT vkCmdSetCullModeEXT{}; | ||||||
|     PFN_vkCmdSetDepthBias vkCmdSetDepthBias{}; |     PFN_vkCmdSetDepthBias vkCmdSetDepthBias{}; | ||||||
|     PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds{}; |     PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds{}; | ||||||
|     PFN_vkCmdSetEvent vkCmdSetEvent{}; |  | ||||||
|     PFN_vkCmdSetScissor vkCmdSetScissor{}; |  | ||||||
|     PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask{}; |  | ||||||
|     PFN_vkCmdSetStencilReference vkCmdSetStencilReference{}; |  | ||||||
|     PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask{}; |  | ||||||
|     PFN_vkCmdSetViewport vkCmdSetViewport{}; |  | ||||||
|     PFN_vkCmdWaitEvents vkCmdWaitEvents{}; |  | ||||||
|     PFN_vkCmdBindVertexBuffers2EXT vkCmdBindVertexBuffers2EXT{}; |  | ||||||
|     PFN_vkCmdSetCullModeEXT vkCmdSetCullModeEXT{}; |  | ||||||
|     PFN_vkCmdSetDepthBoundsTestEnableEXT vkCmdSetDepthBoundsTestEnableEXT{}; |     PFN_vkCmdSetDepthBoundsTestEnableEXT vkCmdSetDepthBoundsTestEnableEXT{}; | ||||||
|     PFN_vkCmdSetDepthCompareOpEXT vkCmdSetDepthCompareOpEXT{}; |     PFN_vkCmdSetDepthCompareOpEXT vkCmdSetDepthCompareOpEXT{}; | ||||||
|     PFN_vkCmdSetDepthTestEnableEXT vkCmdSetDepthTestEnableEXT{}; |     PFN_vkCmdSetDepthTestEnableEXT vkCmdSetDepthTestEnableEXT{}; | ||||||
|     PFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT{}; |     PFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT{}; | ||||||
|  |     PFN_vkCmdSetEvent vkCmdSetEvent{}; | ||||||
|     PFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT{}; |     PFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT{}; | ||||||
|     PFN_vkCmdSetPrimitiveTopologyEXT vkCmdSetPrimitiveTopologyEXT{}; |     PFN_vkCmdSetPrimitiveTopologyEXT vkCmdSetPrimitiveTopologyEXT{}; | ||||||
|  |     PFN_vkCmdSetScissor vkCmdSetScissor{}; | ||||||
|  |     PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask{}; | ||||||
|     PFN_vkCmdSetStencilOpEXT vkCmdSetStencilOpEXT{}; |     PFN_vkCmdSetStencilOpEXT vkCmdSetStencilOpEXT{}; | ||||||
|  |     PFN_vkCmdSetStencilReference vkCmdSetStencilReference{}; | ||||||
|     PFN_vkCmdSetStencilTestEnableEXT vkCmdSetStencilTestEnableEXT{}; |     PFN_vkCmdSetStencilTestEnableEXT vkCmdSetStencilTestEnableEXT{}; | ||||||
|  |     PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask{}; | ||||||
|     PFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT{}; |     PFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT{}; | ||||||
|     PFN_vkCmdResolveImage vkCmdResolveImage{}; |     PFN_vkCmdSetViewport vkCmdSetViewport{}; | ||||||
|  |     PFN_vkCmdWaitEvents vkCmdWaitEvents{}; | ||||||
|     PFN_vkCreateBuffer vkCreateBuffer{}; |     PFN_vkCreateBuffer vkCreateBuffer{}; | ||||||
|     PFN_vkCreateBufferView vkCreateBufferView{}; |     PFN_vkCreateBufferView vkCreateBufferView{}; | ||||||
|     PFN_vkCreateCommandPool vkCreateCommandPool{}; |     PFN_vkCreateCommandPool vkCreateCommandPool{}; | ||||||
| @@ -990,6 +991,12 @@ public: | |||||||
|                                      dynamic_offsets.size(), dynamic_offsets.data()); |                                      dynamic_offsets.size(), dynamic_offsets.data()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     void PushDescriptorSetWithTemplateKHR(VkDescriptorUpdateTemplateKHR update_template, | ||||||
|  |                                           VkPipelineLayout layout, u32 set, | ||||||
|  |                                           const void* data) const noexcept { | ||||||
|  |         dld->vkCmdPushDescriptorSetWithTemplateKHR(handle, update_template, layout, set, data); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     void BindPipeline(VkPipelineBindPoint bind_point, VkPipeline pipeline) const noexcept { |     void BindPipeline(VkPipelineBindPoint bind_point, VkPipeline pipeline) const noexcept { | ||||||
|         dld->vkCmdBindPipeline(handle, bind_point, pipeline); |         dld->vkCmdBindPipeline(handle, bind_point, pipeline); | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user