BaseDevice::~BaseDevice currently cleans resources in this order:
m_command_pool_ptr_per_vk_queue_fam.clear();
m_compute_pipeline_manager_ptr.reset ();
m_descriptor_set_layout_manager_ptr.reset();
m_dummy_dsg_ptr.reset ();
m_graphics_pipeline_manager_ptr.reset ();
m_pipeline_cache_ptr.reset ();
m_pipeline_layout_manager_ptr.reset ();
m_owned_queues.clear ();
This is problematic because the destructor of m_descriptor_set_layout_manager_ptr has this assertion check:
anvil_assert(m_descriptor_set_layouts.size() == 0);
However, m_graphics_pipeline_manager_ptr hasn't been cleared at that point, and that means that some pipelines might still have references to descriptor set layout objects, so the assert would get triggered.
Clearing m_descriptor_set_layout_manager_ptr after m_graphics_pipeline_manager_ptr fixes the issue:
m_command_pool_ptr_per_vk_queue_fam.clear();
m_compute_pipeline_manager_ptr.reset ();
m_dummy_dsg_ptr.reset ();
m_graphics_pipeline_manager_ptr.reset ();
m_descriptor_set_layout_manager_ptr.reset();
m_pipeline_cache_ptr.reset ();
m_pipeline_layout_manager_ptr.reset ();
m_owned_queues.clear ();
BaseDevice::~BaseDevice currently cleans resources in this order:
This is problematic because the destructor of m_descriptor_set_layout_manager_ptr has this assertion check:
However, m_graphics_pipeline_manager_ptr hasn't been cleared at that point, and that means that some pipelines might still have references to descriptor set layout objects, so the assert would get triggered.
Clearing m_descriptor_set_layout_manager_ptr after m_graphics_pipeline_manager_ptr fixes the issue: