From 901bacd29cb5b242f68302b8384de6e193413a49 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 13 Oct 2009 15:13:00 +0100 Subject: [PATCH 3/3] 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 --- configure.ac | 10 +++++++++- libdrm/intel/intel_atomic.h | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletions(-) diff --git a/configure.ac b/configure.ac index fd6f696..7efc4d4 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 9eb50a1..e725c4a 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 + +#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 -- 1.6.5.5