diff --git a/core/extension/gdextension_interface.h b/core/extension/gdextension_interface.h index ad31eb6e58b..08f4d00aebf 100644 --- a/core/extension/gdextension_interface.h +++ b/core/extension/gdextension_interface.h @@ -815,8 +815,12 @@ typedef void (*GDExtensionMainLoopShutdownCallback)(); typedef void (*GDExtensionMainLoopFrameCallback)(); typedef struct { + // Will be called after Godot is started and is fully initialized. GDExtensionMainLoopStartupCallback startup_func; + // Will be called before Godot is shutdown when it is still fully initialized. GDExtensionMainLoopShutdownCallback shutdown_func; + // Will be called for each process frame. This will run after all `_process()` methods on Node, and before `ScriptServer::frame()`. + // This is intended to be the equivalent of `ScriptLanguage::frame()` for GDExtension language bindings that don't use the script API. GDExtensionMainLoopFrameCallback frame_func; } GDExtensionMainLoopCallbacks; diff --git a/core/extension/gdextension_manager.cpp b/core/extension/gdextension_manager.cpp index 0258a626950..197b4833034 100644 --- a/core/extension/gdextension_manager.cpp +++ b/core/extension/gdextension_manager.cpp @@ -77,13 +77,6 @@ GDExtensionManager::LoadStatus GDExtensionManager::_unload_extension_internal(co emit_signal("extension_unloading", p_extension); #endif - if (level >= 0) { // Already initialized up to some level. - // Deinitialize down from current level. - for (int32_t i = level; i >= GDExtension::INITIALIZATION_LEVEL_CORE; i--) { - p_extension->deinitialize_library(GDExtension::InitializationLevel(i)); - } - } - if (!shutdown_callback_called) { // Extension is unloading before the shutdown callback has been called, // which means the engine hasn't shutdown yet but we want to make sure @@ -93,6 +86,13 @@ GDExtensionManager::LoadStatus GDExtensionManager::_unload_extension_internal(co } } + if (level >= 0) { // Already initialized up to some level. + // Deinitialize down from current level. + for (int32_t i = level; i >= GDExtension::INITIALIZATION_LEVEL_CORE; i--) { + p_extension->deinitialize_library(GDExtension::InitializationLevel(i)); + } + } + for (const KeyValue &kv : p_extension->class_icon_paths) { gdextension_class_icon_paths.erase(kv.key); }