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;
         }