godot/tools/editor/plugins/baked_light_baker_cmpxchg.cpp
Juan Linietsky d85b67be53 Bug Fixes
-=-=-=-=-

-Fixed problem with scaling shapes (#827), related to not taking scale in consideration for calculating the moment of inertia
-Added support for multiline strings (or comments) using """
-Save subscene bug, properties not being saved in root node (#806)
-Fix Crash in CollisionPolygon2DEditor (#814)
-Restored Ability to compile without 3D (#795)
-Fix InterpolatedCamera (#803)
-Fix UV Import for OBJ Meshes (#771)
-Fixed issue with modifier gizmos (#794)
-Fixed CapsuleShape gizmo handle (#50)
-Fixed Import Button (not properly working in 3D) (#733)
-Many misc fixes (though no new features)
2014-11-02 11:31:01 -03:00

86 lines
1.4 KiB
C++

#include "typedefs.h"
#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100
void baked_light_baker_add_64f(double *dst,double value) {
union {
int64_t i;
double f;
} swapy;
while(true) {
swapy.f=*dst;
int64_t from = swapy.i;
swapy.f+=value;
int64_t to=swapy.i;
if (__sync_bool_compare_and_swap((int64_t*)dst,from,to))
break;
}
}
void baked_light_baker_add_64i(int64_t *dst,int64_t value) {
while(!__sync_bool_compare_and_swap(dst,*dst,(*dst)+value)) {}
}
#elif defined(WINDOWS_ENABLED)
#include "windows.h"
void baked_light_baker_add_64f(double *dst,double value) {
union {
int64_t i;
double f;
} swapy;
while(true) {
swapy.f=*dst;
int64_t from = swapy.i;
swapy.f+=value;
int64_t to=swapy.i;
int64_t result = InterlockedCompareExchange64((int64_t*)dst,to,from);
if (result==from)
break;
}
}
void baked_light_baker_add_64i(int64_t *dst,int64_t value) {
while(true) {
int64_t from = *dst;
int64_t to = from+value;
int64_t result = InterlockedCompareExchange64(dst,to,from);
if (result==from)
break;
}
}
#else
//in goder (the god of programmers) we trust
#warning seems this platform or compiler does not support safe cmpxchg, your baked lighting may be funny
void baked_light_baker_add_64f(double *dst,double value) {
*dst+=value;
}
void baked_light_baker_add_64i(int64_t *dst,int64_t value) {
*dst+=value;
}
#endif