diff --git a/include/merian/vk/descriptors/descriptor_set.hpp b/include/merian/vk/descriptors/descriptor_set.hpp index 0deaf76c..4e1c55c0 100644 --- a/include/merian/vk/descriptors/descriptor_set.hpp +++ b/include/merian/vk/descriptors/descriptor_set.hpp @@ -63,7 +63,11 @@ class DescriptorSet : public std::enable_shared_from_this { } operator const vk::DescriptorSetLayout&() const { - return *layout.get(); + return *layout; + } + + const vk::DescriptorSet& operator*() const { + return set; } const vk::DescriptorSet& get_descriptor_set() const { diff --git a/include/merian/vk/descriptors/descriptor_set_layout_builder.hpp b/include/merian/vk/descriptors/descriptor_set_layout_builder.hpp index 12cdc6d5..16eda4a3 100644 --- a/include/merian/vk/descriptors/descriptor_set_layout_builder.hpp +++ b/include/merian/vk/descriptors/descriptor_set_layout_builder.hpp @@ -56,7 +56,7 @@ class DescriptorSetLayoutBuilder { public: DescriptorSetLayoutBuilder(std::vector bindings = {}) { - add_binding(bindings); + add_binding(std::move(bindings)); } // -------------------------------------------------------------------------------------------------------------------- @@ -153,8 +153,8 @@ class DescriptorSetLayoutBuilder { return *this; } - DescriptorSetLayoutBuilder& add_binding(std::vector bindings) { - for (auto& binding : bindings) { + DescriptorSetLayoutBuilder& add_binding(const std::vector& bindings) { + for (const auto& binding : bindings) { add_binding(binding); } return *this; diff --git a/include/merian/vk/extension/extension_vk_push_descriptor.hpp b/include/merian/vk/extension/extension_vk_push_descriptor.hpp new file mode 100644 index 00000000..971adc0b --- /dev/null +++ b/include/merian/vk/extension/extension_vk_push_descriptor.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "merian/vk/extension/extension.hpp" + +namespace merian { + +class ExtensionVkPushDescriptor : public Extension { + public: + ExtensionVkPushDescriptor() : Extension("ExtensionVkPushDescriptor") {} + ~ExtensionVkPushDescriptor() {} + + std::vector + required_device_extension_names(vk::PhysicalDevice) const override { + return {VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME}; + } +}; + +} // namespace merian diff --git a/include/merian/vk/pipeline/pipeline.hpp b/include/merian/vk/pipeline/pipeline.hpp index f037f2ef..ebe4c8d6 100644 --- a/include/merian/vk/pipeline/pipeline.hpp +++ b/include/merian/vk/pipeline/pipeline.hpp @@ -18,7 +18,7 @@ class Pipeline : public std::enable_shared_from_this { // --------------------------------------------------------------------------- - operator const vk::Pipeline() const { + operator const vk::Pipeline&() const { return pipeline; } @@ -38,7 +38,13 @@ class Pipeline : public std::enable_shared_from_this { const std::shared_ptr& descriptor_set, const uint32_t first_set = 0) { cmd.bindDescriptorSets(get_pipeline_bind_point(), *pipeline_layout, first_set, 1, - &descriptor_set->get_descriptor_set(), 0, nullptr); + &**descriptor_set, 0, nullptr); + } + + void push_descriptor_set(const vk::CommandBuffer& cmd, + const uint32_t set, + const std::vector& writes) { + cmd.pushDescriptorSetKHR(get_pipeline_bind_point(), *pipeline_layout, set, writes); } // ---------------------------------------------------------------------------