Browse Source

Update to use `mem_alloc2`, `mem_realloc2` and `mem_free2`

David Snopek 2 months ago
parent
commit
48d02db27c
4 changed files with 54 additions and 53 deletions
  1. 42 1
      gdextension/gdextension_interface.h
  2. 3 3
      include/godot_cpp/godot.hpp
  3. 3 43
      src/core/memory.cpp
  4. 6 6
      src/godot.cpp

+ 42 - 1
gdextension/gdextension_interface.h

@@ -858,6 +858,7 @@ typedef void (*GDExtensionInterfaceGetGodotVersion2)(GDExtensionGodotVersion2 *r
 /**
  * @name mem_alloc
  * @since 4.1
+ * @deprecated in Godot 4.6. Use `mem_alloc2` instead.
  *
  * Allocates memory.
  *
@@ -870,6 +871,7 @@ typedef void *(*GDExtensionInterfaceMemAlloc)(size_t p_bytes);
 /**
  * @name mem_realloc
  * @since 4.1
+ * @deprecated in Godot 4.6. Use `mem_realloc2` instead.
  *
  * Reallocates memory.
  *
@@ -883,6 +885,7 @@ typedef void *(*GDExtensionInterfaceMemRealloc)(void *p_ptr, size_t p_bytes);
 /**
  * @name mem_free
  * @since 4.1
+ * @deprecated in Godot 4.6. Use `mem_free2` instead.
  *
  * Frees memory.
  *
@@ -890,7 +893,45 @@ typedef void *(*GDExtensionInterfaceMemRealloc)(void *p_ptr, size_t p_bytes);
  */
 typedef void (*GDExtensionInterfaceMemFree)(void *p_ptr);
 
-/* INTERFACE: Godot Core */
+/**
+ * @name mem_alloc2
+ * @since 4.6
+ *
+ * Allocates memory.
+ *
+ * @param p_bytes The amount of memory to allocate in bytes.
+ * @param p_pad_align If true, the returned memory will have prepadding of at least 8 bytes.
+ *
+ * @return A pointer to the allocated memory, or NULL if unsuccessful.
+ */
+typedef void *(*GDExtensionInterfaceMemAlloc2)(size_t p_bytes, GDExtensionBool p_pad_align);
+
+/**
+ * @name mem_realloc2
+ * @since 4.6
+ *
+ * Reallocates memory.
+ *
+ * @param p_ptr A pointer to the previously allocated memory.
+ * @param p_bytes The number of bytes to resize the memory block to.
+ * @param p_pad_align If true, the returned memory will have prepadding of at least 8 bytes.
+ *
+ * @return A pointer to the allocated memory, or NULL if unsuccessful.
+ */
+typedef void *(*GDExtensionInterfaceMemRealloc2)(void *p_ptr, size_t p_bytes, GDExtensionBool p_pad_align);
+
+/**
+ * @name mem_free2
+ * @since 4.6
+ *
+ * Frees memory.
+ *
+ * @param p_ptr A pointer to the previously allocated memory.
+ * @param p_pad_align If true, the given memory was allocated with prepadding.
+ */
+typedef void (*GDExtensionInterfaceMemFree2)(void *p_ptr, GDExtensionBool p_pad_align);
+
+//* INTERFACE: Godot Core */
 
 /**
  * @name print_error

+ 3 - 3
include/godot_cpp/godot.hpp

@@ -44,9 +44,9 @@ extern "C" GDExtensionGodotVersion2 godot_version;
 
 // All of the GDExtension interface functions.
 extern "C" GDExtensionInterfaceGetGodotVersion2 gdextension_interface_get_godot_version2;
-extern "C" GDExtensionInterfaceMemAlloc gdextension_interface_mem_alloc;
-extern "C" GDExtensionInterfaceMemRealloc gdextension_interface_mem_realloc;
-extern "C" GDExtensionInterfaceMemFree gdextension_interface_mem_free;
+extern "C" GDExtensionInterfaceMemAlloc2 gdextension_interface_mem_alloc2;
+extern "C" GDExtensionInterfaceMemRealloc2 gdextension_interface_mem_realloc2;
+extern "C" GDExtensionInterfaceMemFree2 gdextension_interface_mem_free2;
 extern "C" GDExtensionInterfacePrintError gdextension_interface_print_error;
 extern "C" GDExtensionInterfacePrintErrorWithMessage gdextension_interface_print_error_with_message;
 extern "C" GDExtensionInterfacePrintWarning gdextension_interface_print_warning;

+ 3 - 43
src/core/memory.cpp

@@ -35,21 +35,7 @@
 namespace godot {
 
 void *Memory::alloc_static(size_t p_bytes, bool p_pad_align) {
-#ifdef DEBUG_ENABLED
-	bool prepad = false; // Already pre paded in the engine.
-#else
-	bool prepad = p_pad_align;
-#endif
-
-	void *mem = internal::gdextension_interface_mem_alloc(p_bytes + (prepad ? DATA_OFFSET : 0));
-	ERR_FAIL_NULL_V(mem, nullptr);
-
-	if (prepad) {
-		uint8_t *s8 = (uint8_t *)mem;
-		return s8 + DATA_OFFSET;
-	} else {
-		return mem;
-	}
+	return internal::gdextension_interface_mem_alloc2(p_bytes, p_pad_align);
 }
 
 void *Memory::realloc_static(void *p_memory, size_t p_bytes, bool p_pad_align) {
@@ -60,37 +46,11 @@ void *Memory::realloc_static(void *p_memory, size_t p_bytes, bool p_pad_align) {
 		return nullptr;
 	}
 
-	uint8_t *mem = (uint8_t *)p_memory;
-
-#ifdef DEBUG_ENABLED
-	bool prepad = false; // Already pre paded in the engine.
-#else
-	bool prepad = p_pad_align;
-#endif
-
-	if (prepad) {
-		mem -= DATA_OFFSET;
-		mem = (uint8_t *)internal::gdextension_interface_mem_realloc(mem, p_bytes + DATA_OFFSET);
-		ERR_FAIL_NULL_V(mem, nullptr);
-		return mem + DATA_OFFSET;
-	} else {
-		return (uint8_t *)internal::gdextension_interface_mem_realloc(mem, p_bytes);
-	}
+	return internal::gdextension_interface_mem_realloc2(p_memory, p_bytes, p_pad_align);
 }
 
 void Memory::free_static(void *p_ptr, bool p_pad_align) {
-	uint8_t *mem = (uint8_t *)p_ptr;
-
-#ifdef DEBUG_ENABLED
-	bool prepad = false; // Already pre paded in the engine.
-#else
-	bool prepad = p_pad_align;
-#endif
-
-	if (prepad) {
-		mem -= DATA_OFFSET;
-	}
-	internal::gdextension_interface_mem_free(mem);
+	internal::gdextension_interface_mem_free2(p_ptr, p_pad_align);
 }
 
 _GlobalNil::_GlobalNil() {

+ 6 - 6
src/godot.cpp

@@ -53,9 +53,9 @@ GDExtensionGodotVersion2 godot_version = {};
 
 // All of the GDExtension interface functions.
 GDExtensionInterfaceGetGodotVersion2 gdextension_interface_get_godot_version2 = nullptr;
-GDExtensionInterfaceMemAlloc gdextension_interface_mem_alloc = nullptr;
-GDExtensionInterfaceMemRealloc gdextension_interface_mem_realloc = nullptr;
-GDExtensionInterfaceMemFree gdextension_interface_mem_free = nullptr;
+GDExtensionInterfaceMemAlloc2 gdextension_interface_mem_alloc2 = nullptr;
+GDExtensionInterfaceMemRealloc2 gdextension_interface_mem_realloc2 = nullptr;
+GDExtensionInterfaceMemFree2 gdextension_interface_mem_free2 = nullptr;
 GDExtensionInterfacePrintError gdextension_interface_print_error = nullptr;
 GDExtensionInterfacePrintErrorWithMessage gdextension_interface_print_error_with_message = nullptr;
 GDExtensionInterfacePrintWarning gdextension_interface_print_warning = nullptr;
@@ -339,9 +339,9 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge
 		return false;
 	}
 
-	LOAD_PROC_ADDRESS(mem_alloc, GDExtensionInterfaceMemAlloc);
-	LOAD_PROC_ADDRESS(mem_realloc, GDExtensionInterfaceMemRealloc);
-	LOAD_PROC_ADDRESS(mem_free, GDExtensionInterfaceMemFree);
+	LOAD_PROC_ADDRESS(mem_alloc2, GDExtensionInterfaceMemAlloc2);
+	LOAD_PROC_ADDRESS(mem_realloc2, GDExtensionInterfaceMemRealloc2);
+	LOAD_PROC_ADDRESS(mem_free2, GDExtensionInterfaceMemFree2);
 	LOAD_PROC_ADDRESS(print_error_with_message, GDExtensionInterfacePrintErrorWithMessage);
 	LOAD_PROC_ADDRESS(print_warning, GDExtensionInterfacePrintWarning);
 	LOAD_PROC_ADDRESS(print_warning_with_message, GDExtensionInterfacePrintWarningWithMessage);