summaryrefslogtreecommitdiff
path: root/thirdparty/vhacd/0002-fpermissive-fix.patch
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/vhacd/0002-fpermissive-fix.patch')
-rw-r--r--thirdparty/vhacd/0002-fpermissive-fix.patch53
1 files changed, 53 insertions, 0 deletions
diff --git a/thirdparty/vhacd/0002-fpermissive-fix.patch b/thirdparty/vhacd/0002-fpermissive-fix.patch
new file mode 100644
index 0000000000..965df2944a
--- /dev/null
+++ b/thirdparty/vhacd/0002-fpermissive-fix.patch
@@ -0,0 +1,53 @@
+diff --git a/thirdparty/vhacd/inc/btScalar.h b/thirdparty/vhacd/inc/btScalar.h
+index 487205062..52297cd78 100644
+--- a/thirdparty/vhacd/inc/btScalar.h
++++ b/thirdparty/vhacd/inc/btScalar.h
+@@ -535,6 +535,29 @@ struct btTypedObject {
+ }
+ };
+
++// -- GODOT start --
++// Cherry-picked from Bullet 2.88 to fix GH-27926
++///align a pointer to the provided alignment, upwards
++template <typename T>
++T *btAlignPointer(T *unalignedPtr, size_t alignment)
++{
++ struct btConvertPointerSizeT
++ {
++ union {
++ T *ptr;
++ size_t integer;
++ };
++ };
++ btConvertPointerSizeT converter;
++
++ const size_t bit_mask = ~(alignment - 1);
++ converter.ptr = unalignedPtr;
++ converter.integer += alignment - 1;
++ converter.integer &= bit_mask;
++ return converter.ptr;
++}
++// -- GODOT end --
++
+ // -- GODOT start --
+ }; // namespace VHACD
+ // -- GODOT end --
+diff --git a/thirdparty/vhacd/src/btAlignedAllocator.cpp b/thirdparty/vhacd/src/btAlignedAllocator.cpp
+index ce0e7f26f..8dee31e7e 100644
+--- a/thirdparty/vhacd/src/btAlignedAllocator.cpp
++++ b/thirdparty/vhacd/src/btAlignedAllocator.cpp
+@@ -72,8 +72,12 @@ static inline void* btAlignedAllocDefault(size_t size, int32_t alignment)
+
+ real = (char*)sAllocFunc(size + sizeof(void*) + (alignment - 1));
+ if (real) {
+- offset = (alignment - (unsigned long)(real + sizeof(void*))) & (alignment - 1);
+- ret = (void*)((real + sizeof(void*)) + offset);
++ // -- GODOT start --
++ // Synced with Bullet 2.88 to fix GH-27926
++ //offset = (alignment - (unsigned long)(real + sizeof(void*))) & (alignment - 1);
++ //ret = (void*)((real + sizeof(void*)) + offset);
++ ret = btAlignPointer(real + sizeof(void *), alignment);
++ // -- GODOT end --
+ *((void**)(ret)-1) = (void*)(real);
+ }
+ else {