diff --git a/liblava/block/descriptor.cpp b/liblava/block/descriptor.cpp index 2c72ea0c575cb3da605bd02b4535e91649a30d60..677fc6acca437a27f3abacb3128fad529acd0060 100644 --- a/liblava/block/descriptor.cpp +++ b/liblava/block/descriptor.cpp @@ -66,6 +66,8 @@ namespace lava { device->call().vkDestroyDescriptorSetLayout(device->get(), layout, memory::alloc()); layout = VK_NULL_HANDLE; + clear_bindings(); + // keep device for descriptors } diff --git a/liblava/block/descriptor.hpp b/liblava/block/descriptor.hpp index b3a9507d2744ded91540de27b1321ee6967895fb..ff5020471355d1a7a989cabc2dea9390190d2975 100644 --- a/liblava/block/descriptor.hpp +++ b/liblava/block/descriptor.hpp @@ -79,6 +79,9 @@ namespace lava { using list = std::vector<ptr>; void add_binding(index binding, VkDescriptorType descriptor_type, VkShaderStageFlags stage_flags); + void clear_bindings() { + bindings.clear(); + } void add(binding::ptr const& binding) { bindings.push_back(binding); diff --git a/liblava/block/pipeline.cpp b/liblava/block/pipeline.cpp index c155d034f4f1edca6f259ae8a5c05ae8b1fefb99..631e17960c61632df97f77366c7220f7c6d56b3d 100644 --- a/liblava/block/pipeline.cpp +++ b/liblava/block/pipeline.cpp @@ -30,6 +30,8 @@ namespace lava { device->call().vkDestroyPipelineLayout(device->get(), layout, memory::alloc()); layout = VK_NULL_HANDLE; + + clear(); } void pipeline_layout::bind_descriptor_set(VkCommandBuffer cmd_buf, VkDescriptorSet descriptor_set, ui32 index, offset_list offsets, VkPipelineBindPoint bind_point) { @@ -280,6 +282,13 @@ namespace lava { color_blend_state.pAttachments = color_blend_attachment_states.data(); } + void graphics_pipeline::clear_color_blend_attachment() { + color_blend_attachment_states.clear(); + + color_blend_state.attachmentCount = 0; + color_blend_state.pAttachments = nullptr; + } + void graphics_pipeline::set_dynamic_states(VkDynamicStates const& states) { dynamic_states = states; @@ -292,6 +301,13 @@ namespace lava { set_dynamic_states(dynamic_states); } + void graphics_pipeline::clear_dynamic_states() { + dynamic_states.clear(); + + dynamic_state.dynamicStateCount = 0; + dynamic_state.pDynamicStates = nullptr; + } + bool graphics_pipeline::add_shader_stage(cdata const& data, VkShaderStageFlagBits stage) { if (!data.ptr) { log()->error("graphics pipeline shader stage data"); @@ -361,7 +377,7 @@ namespace lava { } void graphics_pipeline::destroy_internal() { - shader_stages.clear(); + clear(); } void graphics_pipeline::bind(VkCommandBuffer cmd_buf) { diff --git a/liblava/block/pipeline.hpp b/liblava/block/pipeline.hpp index 887404bd8406e169383f941ec219394ad59d0e2e..9f0b3038b76aa3faf1d1ffe6c00ace0608716108 100644 --- a/liblava/block/pipeline.hpp +++ b/liblava/block/pipeline.hpp @@ -28,6 +28,17 @@ namespace lava { add(range); } + void clear_descriptors() { + descriptors.clear(); + } + void clear_ranges() { + push_constant_ranges.clear(); + } + void clear() { + clear_descriptors(); + clear_ranges(); + } + bool create(device_ptr device); void destroy(); @@ -232,9 +243,11 @@ namespace lava { static VkPipelineColorBlendAttachmentState create_color_blend_attachment(); void add_color_blend_attachment(VkPipelineColorBlendAttachmentState const& attachment = create_color_blend_attachment()); + void clear_color_blend_attachment(); void set_dynamic_states(VkDynamicStates const& states); void add_dynamic_state(VkDynamicState state); + void clear_dynamic_states(); bool add_shader_stage(cdata const& data, VkShaderStageFlagBits stage); bool add_shader(cdata const& data, VkShaderStageFlagBits stage) { @@ -252,6 +265,11 @@ namespace lava { shader_stages.clear(); } + void clear() { + clear_color_blend_attachment(); + clear_shader_stages(); + } + void set_auto_size(bool value = true) { auto_size = value; }