dri1: Add a macro to validate two dri drawables in one go.
authorThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Tue, 20 Jan 2009 10:07:10 +0000 (11:07 +0100)
committerThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Tue, 20 Jan 2009 10:07:10 +0000 (11:07 +0100)
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.

src/mesa/drivers/dri/common/dri_util.h

index c0e1bea5e05f14d072c40d5efec7bee444ac141c..c6781f1c7ab537216b6bc66d11b9488d11cb47e5 100644 (file)
@@ -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.