summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-06-16 21:14:57 -0300
committerGravatar ameerj2021-07-22 21:51:38 -0400
commitca67077ca87772b4b4ac61d08f5b2c60616348e0 (patch)
tree2a861de6f5be92cbed1542f115a99e646a1793c9
parentglsl: Fix cbuf component indexing bug falback (diff)
downloadyuzu-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.h32
-rw-r--r--src/video_core/renderer_vulkan/vk_compute_pipeline.cpp8
-rw-r--r--src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp28
-rw-r--r--src/video_core/renderer_vulkan/vk_graphics_pipeline.h1
-rw-r--r--src/video_core/vulkan_common/vulkan_device.cpp11
-rw-r--r--src/video_core/vulkan_common/vulkan_device.h12
-rw-r--r--src/video_core/vulkan_common/vulkan_wrapper.cpp1
-rw-r--r--src/video_core/vulkan_common/vulkan_wrapper.h31
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
20namespace Vulkan { 21namespace Vulkan {
21 22
22class DescriptorLayoutBuilder { 23class DescriptorLayoutBuilder {
23public: 24public:
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;
40constexpr size_t MAX_IMAGE_ELEMENTS = 64; 40constexpr size_t MAX_IMAGE_ELEMENTS = 64;
41 41
42DescriptorLayoutBuilder MakeBuilder(const Device& device, std::span<const Shader::Info> infos) { 42DescriptorLayoutBuilder 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 }