intel: Fallback to atomic-ops.h [libatomic-ops-dev]
Use the external implementation for atomic operations across a wide range of architectures. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>main
parent
24c905f841
commit
901bacd29c
10
configure.ac
10
configure.ac
|
@ -163,15 +163,23 @@ if test "x$INTEL" != "xno"; then
|
|||
], [],
|
||||
drm_cv_atomic_primitives="Intel"
|
||||
)
|
||||
|
||||
if test "x$drm_cv_atomic_primitives" = "xnone"; then
|
||||
AC_CHECK_HEADER([atomic_ops.h], drm_cv_atomic_primitives="libatomic-ops")
|
||||
fi
|
||||
|
||||
])
|
||||
if test "x$drm_cv_atomic_primitives" = xIntel; then
|
||||
AC_DEFINE(HAVE_INTEL_ATOMIC_PRIMITIVES, 1,
|
||||
[Enable if your compiler supports the Intel __sync_* atomic primitives])
|
||||
fi
|
||||
if test "x$drm_cv_atomic_primitives" = "xlibatomic-ops"; then
|
||||
AC_DEFINE(HAVE_LIB_ATOMIC_OPS, 1, [Enable if you have libatomic-ops-dev installed])
|
||||
fi
|
||||
|
||||
if test "x$drm_cv_atomic_primitives" = "xnone"; then
|
||||
if test "x$INTEL" != "xauto"; then
|
||||
AC_MSG_ERROR([libdrm_intel depends upon atomic operations, which were not found for your compiler/cpu. Try compiling with -march=native, or disable support for Intel GPUs by passing --disable-intel to ./configure])
|
||||
AC_MSG_ERROR([libdrm_intel depends upon atomic operations, which were not found for your compiler/cpu. Try compiling with -march=native, or install the libatomics-op-dev package, or, failing both of those, disable support for Intel GPUs by passing --disable-intel to ./configure])
|
||||
else
|
||||
INTEL=no
|
||||
fi
|
||||
|
|
|
@ -54,6 +54,23 @@ typedef struct {
|
|||
|
||||
#endif
|
||||
|
||||
#if HAVE_LIB_ATOMIC_OPS
|
||||
#include <atomic_ops.h>
|
||||
|
||||
#define HAS_ATOMIC_OPS 1
|
||||
|
||||
typedef struct {
|
||||
AO_t atomic;
|
||||
} atomic_t;
|
||||
|
||||
# define atomic_read(x) AO_load_full(&(x)->atomic)
|
||||
# define atomic_set(x, val) AO_store_full(&(x)->atomic, (val))
|
||||
# define atomic_inc(x) ((void) AO_fetch_and_add1_full(&(x)->atomic))
|
||||
# define atomic_dec_and_test(x) (AO_fetch_and_sub1_full(&(x)->atomic) == 1)
|
||||
# define atomic_cmpxchg(x, oldv, newv) AO_compare_and_swap_full(&(x)->atomic, oldv, newv)
|
||||
|
||||
#endif
|
||||
|
||||
#if ! HAS_ATOMIC_OPS
|
||||
#error libdrm-intel requires atomic operations, please define them for your CPU/compiler.
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue