ilo: clarify cp owning/releasing
authorChia-I Wu <olvaffe@gmail.com>
Sun, 21 Sep 2014 03:25:26 +0000 (11:25 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Sun, 21 Sep 2014 15:30:51 +0000 (23:30 +0800)
Make it own()'s responsibility to make room for release() and itself.  To be
able to do that, allow ilo_cp_submit() in own().

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
src/gallium/drivers/ilo/ilo_3d.c
src/gallium/drivers/ilo/ilo_cp.c
src/gallium/drivers/ilo/ilo_cp.h

index f0aee2f480b235d3b195b4ba66e05b7ed2a62bf4..30686d6075f1029666ae010e20a9c758bb176945 100644 (file)
@@ -399,7 +399,15 @@ ilo_3d_own_cp(struct ilo_cp *cp, void *data)
 {
    struct ilo_3d *hw3d = data;
 
+   /* multiply by 2 for both resuming and pausing */
+   if (ilo_cp_space(hw3d->cp) < hw3d->owner.reserve * 2) {
+      ilo_cp_submit(hw3d->cp, "out of space");
+      assert(ilo_cp_space(hw3d->cp) >= hw3d->owner.reserve * 2);
+   }
+
    ilo_3d_resume_queries(hw3d);
+
+   assert(ilo_cp_space(hw3d->cp) >= hw3d->owner.reserve);
 }
 
 static void
index 37e9b2ae2bf671fc63dedd84726ae9178d18631d..67de95b98c93bf72c4ada67e342e79cbd8e74d3c 100644 (file)
@@ -48,10 +48,15 @@ ilo_cp_release_owner(struct ilo_cp *cp)
 
 /**
  * Set the parser owner.  If this is a new owner or a new ring, the old owner
- * is released and the new owner's own() is called.
+ * is released and the new owner's own() is called.  The parser may implicitly
+ * submit if there is a ring change.
  *
- * The parser may implicitly submit if there is a ring change or there is not
- * enough space for the new owner.
+ * own() is called before \p owner owns the parser.  It must make sure there
+ * is more space than \p owner->reserve when it returns.  Calling
+ * ilo_cp_submit() is allowed.
+ *
+ * release() will be called after \p owner loses the parser.  That may happen
+ * just before the parser submits and ilo_cp_submit() is not allowed.
  */
 void
 ilo_cp_set_owner(struct ilo_cp *cp, enum intel_ring_type ring,
@@ -68,16 +73,10 @@ ilo_cp_set_owner(struct ilo_cp *cp, enum intel_ring_type ring,
    if (cp->owner != owner) {
       ilo_cp_release_owner(cp);
 
-      /* multiply by 2 because there are own() and release() */
-      if (ilo_cp_space(cp) < owner->reserve * 2) {
-         ilo_cp_submit(cp, "new owner");
-         assert(ilo_cp_space(cp) >= owner->reserve * 2);
-      }
-
-      cp->owner = owner;
+      owner->own(cp, owner->data);
 
       assert(ilo_cp_space(cp) >= owner->reserve);
-      cp->owner->own(cp, cp->owner->data);
+      cp->owner = owner;
    }
 }
 
index 12d1a98c8368e586c9e62f32870ce9cdc8fed6e1..04b3ad5f836d89de22929c8031755559bad094ad 100644 (file)
@@ -48,8 +48,8 @@ struct ilo_cp_owner {
    void *data;
 
    /*
-    * Space reserved for own() and release().  This can be modified at any
-    * time, as long as it is never increased by more than ilo_cp_space().
+    * Space reserved for release().  This can be modified at any time, as long
+    * as it is never increased by more than ilo_cp_space().
     */
    int reserve;
 };