diff --git a/src/rendering/m2_renderer.cpp b/src/rendering/m2_renderer.cpp index 48b2d346..4a30274e 100644 --- a/src/rendering/m2_renderer.cpp +++ b/src/rendering/m2_renderer.cpp @@ -743,9 +743,10 @@ void M2Renderer::destroyModelGPU(M2ModelGPU& model) { VmaAllocator alloc = vkCtx_->getAllocator(); if (model.vertexBuffer) { vmaDestroyBuffer(alloc, model.vertexBuffer, model.vertexAlloc); model.vertexBuffer = VK_NULL_HANDLE; } if (model.indexBuffer) { vmaDestroyBuffer(alloc, model.indexBuffer, model.indexAlloc); model.indexBuffer = VK_NULL_HANDLE; } + VkDevice device = vkCtx_->getDevice(); for (auto& batch : model.batches) { + if (batch.materialSet) { vkFreeDescriptorSets(device, materialDescPool_, 1, &batch.materialSet); batch.materialSet = VK_NULL_HANDLE; } if (batch.materialUBO) { vmaDestroyBuffer(alloc, batch.materialUBO, batch.materialUBOAlloc); batch.materialUBO = VK_NULL_HANDLE; } - // materialSet freed when pool is reset/destroyed } } diff --git a/src/rendering/wmo_renderer.cpp b/src/rendering/wmo_renderer.cpp index 85f56431..84c7f956 100644 --- a/src/rendering/wmo_renderer.cpp +++ b/src/rendering/wmo_renderer.cpp @@ -124,6 +124,7 @@ bool WMORenderer::initialize(VkContext* ctx, VkDescriptorSetLayout perFrameLayou VkDescriptorPoolCreateInfo poolInfo{}; poolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + poolInfo.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; poolInfo.maxSets = MAX_MATERIAL_SETS; poolInfo.poolSizeCount = 2; poolInfo.pPoolSizes = poolSizes; @@ -1946,8 +1947,13 @@ void WMORenderer::destroyGroupGPU(GroupResources& group) { group.indexAlloc = VK_NULL_HANDLE; } - // Destroy material UBOs (descriptor sets are freed when pool is reset/destroyed) + // Destroy material UBOs and free descriptor sets back to pool + VkDevice device = vkCtx_->getDevice(); for (auto& mb : group.mergedBatches) { + if (mb.materialSet) { + vkFreeDescriptorSets(device, materialDescPool_, 1, &mb.materialSet); + mb.materialSet = VK_NULL_HANDLE; + } if (mb.materialUBO) { vmaDestroyBuffer(allocator, mb.materialUBO, mb.materialUBOAlloc); mb.materialUBO = VK_NULL_HANDLE;