google / filament

Filament is a real-time physically based rendering engine for Android, iOS, Windows, Linux, macOS, and WebGL2
https://google.github.io/filament/
Apache License 2.0
17.35k stars 1.84k forks source link

Destroying an unused Engine crashes #7866

Closed mcooley closed 1 month ago

mcooley commented 1 month ago

Describe the bug With the Vulkan backend, creating and immediately destroying an Engine causes an access violation.

To Reproduce

Engine* engine = Engine::Builder()
        .backend(backend::Backend::VULKAN)
        .build();

Engine::destroy(&engine);

Logs Call stack:

test.dll!vmaDestroyBuffer(VmaAllocator_T * allocator, VkBuffer_T * buffer, VmaAllocation_T * allocation) Line 17234 C++
test.dll!filament::backend::deallocateResource(filament::backend::VulkanResourceAllocator * allocator, filament::backend::VulkanResourceType type, unsigned int id) Line 33 C++
[Inline Frame] test.dll!filament::backend::VulkanResourceManagerImpl<filament::backend::VulkanResourceBase,tsl::robin_set<filament::backend::VulkanResourceBase *,std::hash<filament::backend::VulkanResourceBase *>,std::equal_to<filament::backend::VulkanResourceBase *>,std::allocator<filament::backend::VulkanResourceBase *>,0,tsl::rh::power_of_two_growth_policy<2>>>::derefImpl(filament::backend::VulkanResourceBase * resource) Line 287    C++
test.dll!filament::backend::VulkanResourceManagerImpl<filament::backend::VulkanResourceBase,tsl::robin_set<filament::backend::VulkanResourceBase *,std::hash<filament::backend::VulkanResourceBase *>,std::equal_to<filament::backend::VulkanResourceBase *>,std::allocator<filament::backend::VulkanResourceBase *>,0,tsl::rh::power_of_two_growth_policy<2>>>::clear() Line 270   C++
[Inline Frame] test.dll!filament::backend::VulkanResourceManagerImpl<filament::backend::VulkanResourceBase,tsl::robin_set<filament::backend::VulkanResourceBase *,std::hash<filament::backend::VulkanResourceBase *>,std::equal_to<filament::backend::VulkanResourceBase *>,std::allocator<filament::backend::VulkanResourceBase *>,0,tsl::rh::power_of_two_growth_policy<2>>>::{dtor}() Line 216   C++
[Inline Frame] test.dll!std::default_delete<filament::backend::VulkanCommandBuffer>::operator()(filament::backend::VulkanCommandBuffer *) Line 3139 C++
[Inline Frame] test.dll!std::unique_ptr<filament::backend::VulkanCommandBuffer,std::default_delete<filament::backend::VulkanCommandBuffer>>::{dtor}() Line 3249 C++
[Inline Frame] test.dll!std::destroy_at(std::unique_ptr<filament::backend::VulkanCommandBuffer,std::default_delete<filament::backend::VulkanCommandBuffer>> * const) Line 324   C++
[Inline Frame] test.dll!std::_Default_allocator_traits<std::allocator<std::unique_ptr<filament::backend::VulkanCommandBuffer,std::default_delete<filament::backend::VulkanCommandBuffer>>>>::destroy(std::allocator<std::unique_ptr<filament::backend::VulkanCommandBuffer,std::default_delete<filament::backend::VulkanCommandBuffer>>> &) Line 734    C++
[Inline Frame] test.dll!utils::FixedCapacityVector<std::unique_ptr<filament::backend::VulkanCommandBuffer,std::default_delete<filament::backend::VulkanCommandBuffer>>,std::allocator<std::unique_ptr<filament::backend::VulkanCommandBuffer,std::default_delete<filament::backend::VulkanCommandBuffer>>>,1>::destroy_non_trivial(std::unique_ptr<filament::backend::VulkanCommandBuffer,std::default_delete<filament::backend::VulkanCommandBuffer>> * last, std::unique_ptr<filament::backend::VulkanCommandBuffer,std::default_delete<filament::backend::VulkanCommandBuffer>> *) Line 362  C++
[Inline Frame] test.dll!utils::FixedCapacityVector<std::unique_ptr<filament::backend::VulkanCommandBuffer,std::default_delete<filament::backend::VulkanCommandBuffer>>,std::allocator<std::unique_ptr<filament::backend::VulkanCommandBuffer,std::default_delete<filament::backend::VulkanCommandBuffer>>>,1>::destroy(std::unique_ptr<filament::backend::VulkanCommandBuffer,std::default_delete<filament::backend::VulkanCommandBuffer>> *) Line 354  C++
[Inline Frame] test.dll!utils::FixedCapacityVector<std::unique_ptr<filament::backend::VulkanCommandBuffer,std::default_delete<filament::backend::VulkanCommandBuffer>>,std::allocator<std::unique_ptr<filament::backend::VulkanCommandBuffer,std::default_delete<filament::backend::VulkanCommandBuffer>>>,1>::{dtor}() Line 126    C++
test.dll!filament::backend::VulkanCommands::~VulkanCommands()   C++
test.dll!filament::backend::VulkanDriver::~VulkanDriver() Line 267  C++
test.dll!filament::backend::VulkanDriver::`scalar deleting destructor'(unsigned int)    C++
test.dll!filament::FEngine::~FEngine() Line 430 C++
test.dll!filament::FEngine::destroy(filament::FEngine * engine) Line 1221   C++
test.dll!filament::Engine::destroy(filament::Engine * * pEngine) Line 70    C++

Filament release: 1.51.8

Desktop: