iris: try to hack around binder issue
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 21 Aug 2018 18:50:56 +0000 (11:50 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:08 +0000 (10:26 -0800)
src/gallium/drivers/iris/iris_binder.c
src/gallium/drivers/iris/iris_binder.h
src/gallium/drivers/iris/iris_draw.c

index f7b5e7ddb18ed20acd48b1f07a0bdec3b89bd8d1..cba84f5fa5319e153c8021fbf5cb537a12fa985a 100644 (file)
@@ -59,6 +59,9 @@
 
 #define BTP_ALIGNMENT 32
 
+/* Avoid using offset 0, tools consider it NULL */
+#define INIT_INSERT_POINT BTP_ALIGNMENT
+
 /**
  * Reserve a block of space in the binder, given the raw size in bytes.
  */
@@ -94,7 +97,7 @@ iris_binder_reserve(struct iris_batch *batch, unsigned size)
  * Note that you must actually populate the new binding tables after
  * calling this command - the new area is uninitialized.
  */
-void
+bool
 iris_binder_reserve_3d(struct iris_batch *batch,
                        struct iris_context *ice)
 {
@@ -118,9 +121,10 @@ iris_binder_reserve_3d(struct iris_batch *batch,
    }
 
    if (total_size == 0)
-      return;
+      return false;
 
    uint32_t offset = iris_binder_reserve(batch, total_size);
+   bool flushed = offset == INIT_INSERT_POINT;
 
    /* Assign space and record the current binding table. */
    for (int stage = 0; stage <= MESA_SHADER_FRAGMENT; stage++) {
@@ -130,10 +134,9 @@ iris_binder_reserve_3d(struct iris_batch *batch,
       binder->bt_offset[stage] = sizes[stage] > 0 ? offset : 0;
       offset += sizes[stage];
    }
-}
 
-/* Avoid using offset 0, tools consider it NULL */
-#define INIT_INSERT_POINT BTP_ALIGNMENT
+   return flushed;
+}
 
 void
 iris_init_binder(struct iris_binder *binder, struct iris_bufmgr *bufmgr)
index e198cec415c4f18d38d57069703ad6448a8ae287..bd1e17ae4c459bea56f2419e45ca247f3f79ba18 100644 (file)
@@ -53,7 +53,7 @@ void iris_init_binder(struct iris_binder *binder, struct iris_bufmgr *bufmgr);
 bool iris_binder_is_empty(struct iris_binder *binder);
 void iris_destroy_binder(struct iris_binder *binder);
 uint32_t iris_binder_reserve(struct iris_batch *batch, unsigned size);
-void iris_binder_reserve_3d(struct iris_batch *batch,
+bool iris_binder_reserve_3d(struct iris_batch *batch,
                             struct iris_context *ice);
 
 #endif
index 20a3cce665790149bf72ef9a7f966a693a5272bc..d938c3d0f4fb9cea0f95e2afc97aa05748f6c756 100644 (file)
@@ -64,8 +64,13 @@ iris_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
                           IRIS_DIRTY_BINDINGS_FS;
    }
 
-   // XXX: don't do this unless things are dirty...
-   iris_binder_reserve_3d(batch, ice);
+   if (iris_binder_reserve_3d(batch, ice)) {
+      ice->state.dirty |= IRIS_DIRTY_BINDINGS_VS |
+                          IRIS_DIRTY_BINDINGS_TCS |
+                          IRIS_DIRTY_BINDINGS_TES |
+                          IRIS_DIRTY_BINDINGS_GS |
+                          IRIS_DIRTY_BINDINGS_FS;
+   }
    ice->vtbl.upload_render_state(ice, batch, info);
 
    ice->state.dirty = 0ull;