Browse Source

Merge pull request #7656 from dsnopek/updating_gdextension_godot_4_1

Max Hilbrunner 2 years ago
parent
commit
05cf0556d3
1 changed files with 58 additions and 1 deletions
  1. 58 1
      tutorials/migrating/upgrading_to_godot_4.1.rst

+ 58 - 1
tutorials/migrating/upgrading_to_godot_4.1.rst

@@ -15,7 +15,8 @@ affect you. Changes are grouped by areas/systems.
 
 
 .. warning::
 .. warning::
     The GDExtension API completely breaks compatibility in 4.1 so it's not included
     The GDExtension API completely breaks compatibility in 4.1 so it's not included
-    in the list. GDExtensions built against 4.0 need to be upgraded.
+    in the table below. See the :ref:`updating_your_gdextension_for_godot_4_1` section
+    for more information.
 
 
 This article indicates whether each breaking change affects GDScript and whether
 This article indicates whether each breaking change affects GDScript and whether
 the C# breaking change is *binary compatible* or *source compatible*:
 the C# breaking change is *binary compatible* or *source compatible*:
@@ -213,3 +214,59 @@ Method ``create_action`` adds a new ``backward_undo_ops`` optional parameter
 .. _GH-76794: https://github.com/godotengine/godot/pull/76794
 .. _GH-76794: https://github.com/godotengine/godot/pull/76794
 .. _GH-77143: https://github.com/godotengine/godot/pull/77143
 .. _GH-77143: https://github.com/godotengine/godot/pull/77143
 .. _GH-78237: https://github.com/godotengine/godot/pull/78237
 .. _GH-78237: https://github.com/godotengine/godot/pull/78237
+
+.. _updating_your_gdextension_for_godot_4_1:
+
+Updating your GDExtension for 4.1
+---------------------------------
+
+GDExtension is still in beta. Until it's marked as stable, compatibility may break when
+upgrading to a new minor version of Godot.
+
+In order to fix a serious bug, in Godot 4.1 we had to break binary compatibility in a big
+way and source compatibility in a small way.
+
+This means that GDExtensions made for Godot 4.0 will need to be recompiled for Godot 4.1
+(using the  ``4.1`` branch of godot-cpp), with a small change to their source code.
+
+In Godot 4.0, your "entry_symbol" function looks something like this:
+
+.. code-block:: C++
+
+  GDExtensionBool GDE_EXPORT example_library_init(const GDExtensionInterface *p_interface, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) {
+      godot::GDExtensionBinding::InitObject init_obj(p_interface, p_library, r_initialization);
+
+      init_obj.register_initializer(initialize_example_module);
+      init_obj.register_terminator(uninitialize_example_module);
+      init_obj.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE);
+
+      return init_obj.init();
+  }
+
+However, for Godot 4.1, it should look like:
+
+.. code-block:: C++
+
+  GDExtensionBool GDE_EXPORT example_library_init(GDExtensionInterfaceGetProcAddress p_get_proc_address, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) {
+      godot::GDExtensionBinding::InitObject init_obj(p_get_proc_address, p_library, r_initialization);
+
+      init_obj.register_initializer(initialize_example_module);
+      init_obj.register_terminator(uninitialize_example_module);
+      init_obj.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE);
+
+      return init_obj.init();
+  }
+
+There are two small changes:
+
+#. The first argument changes from ``const GDExtensionInterface *p_interface`` to ``GDExtensionInterfaceGetProcAddress p_get_proc_address``
+#. The constructor for the `init_obj` variable now receives ``p_get_proc_address`` as its first parameter
+
+You also need to add an extra ``compatibility_minimum`` line to your ``.gdextension`` file, so that it looks something like::
+
+  [configuration]
+
+  entry_symbol = "example_library_init"
+  compatibility_minimum = 4.1
+
+This lets Godot know that your GDExtension has been updated and is safe to load in Godot 4.1.