summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2009-10-13 15:13:00 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2009-10-13 15:13:00 +0100
commit901bacd29cb5b242f68302b8384de6e193413a49 (patch)
treefe4d79398d1f986c81fabe85d93010cd5939646f
parent24c905f84120a7b0bcd7c5e86c58e908b9e850f9 (diff)
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>
-rw-r--r--configure.ac10
-rw-r--r--libdrm/intel/intel_atomic.h17
2 files changed, 26 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac
index fd6f696b..7efc4d4e 100644
--- a/configure.ac
+++ b/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
diff --git a/libdrm/intel/intel_atomic.h b/libdrm/intel/intel_atomic.h
index 9eb50a1e..e725c4a4 100644
--- a/libdrm/intel/intel_atomic.h
+++ b/libdrm/intel/intel_atomic.h
@@ -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