summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Hellstrom <thomas-at-tungstengraphics-dot-com>2009-01-20 11:07:10 +0100
committerThomas Hellstrom <thomas-at-tungstengraphics-dot-com>2009-01-20 11:07:10 +0100
commit11351f0c8a88ae84ec397c7f9abb4a83c64b2cfc (patch)
tree49fec1bacdfdbb5bd21c9a78c4cc70c12040d1fd
parenta5b5bc9f95f381ac61e29e2b2f2001c4135e54ef (diff)
dri1: Add a macro to validate two dri drawables in one go.
Dri drivers often may validate first a write drawable and then a read drawable ("readable"). However, the hardware lock may be unlocked when validating the readable, causing the write drawable status to be stale. Drivers should use this macro instead when validating two drawables.
-rw-r--r--src/mesa/drivers/dri/common/dri_util.h22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h
index c0e1bea5e0..c6781f1c7a 100644
--- a/src/mesa/drivers/dri/common/dri_util.h
+++ b/src/mesa/drivers/dri/common/dri_util.h
@@ -108,6 +108,28 @@ do { \
} \
} while (0)
+/**
+ * Same as above, but for two drawables simultaneously.
+ *
+ */
+
+#define DRI_VALIDATE_TWO_DRAWABLES_INFO(psp, pdp, prp) \
+do { \
+ while (*((pdp)->pStamp) != (pdp)->lastStamp || \
+ *((prp)->pStamp) != (prp)->lastStamp) { \
+ register unsigned int hwContext = (psp)->pSAREA->lock.lock & \
+ ~(DRM_LOCK_HELD | DRM_LOCK_CONT); \
+ DRM_UNLOCK((psp)->fd, &(psp)->pSAREA->lock, hwContext); \
+ \
+ DRM_SPINLOCK(&(psp)->pSAREA->drawable_lock, (psp)->drawLockID); \
+ DRI_VALIDATE_DRAWABLE_INFO_ONCE(pdp); \
+ DRI_VALIDATE_DRAWABLE_INFO_ONCE(prp); \
+ DRM_SPINUNLOCK(&(psp)->pSAREA->drawable_lock, (psp)->drawLockID); \
+ \
+ DRM_LIGHT_LOCK((psp)->fd, &(psp)->pSAREA->lock, hwContext); \
+ } \
+} while (0)
+
/**
* Driver callback functions.