summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2018-08-21 11:50:56 -0700
committerKenneth Graunke <[email protected]>2019-02-21 10:26:08 -0800
commitb3bb33c4c13feb45a402ea72549a731fce2a73ae (patch)
tree24ab1788a9325c9ed775cb0c1628c845c4487256 /src
parentd2516358f98f2770b9bc1e8669520a5a3e19f86d (diff)
iris: try to hack around binder issue
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/iris/iris_binder.c13
-rw-r--r--src/gallium/drivers/iris/iris_binder.h2
-rw-r--r--src/gallium/drivers/iris/iris_draw.c9
3 files changed, 16 insertions, 8 deletions
diff --git a/src/gallium/drivers/iris/iris_binder.c b/src/gallium/drivers/iris/iris_binder.c
index f7b5e7ddb18..cba84f5fa53 100644
--- a/src/gallium/drivers/iris/iris_binder.c
+++ b/src/gallium/drivers/iris/iris_binder.c
@@ -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)
diff --git a/src/gallium/drivers/iris/iris_binder.h b/src/gallium/drivers/iris/iris_binder.h
index e198cec415c..bd1e17ae4c4 100644
--- a/src/gallium/drivers/iris/iris_binder.h
+++ b/src/gallium/drivers/iris/iris_binder.h
@@ -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
diff --git a/src/gallium/drivers/iris/iris_draw.c b/src/gallium/drivers/iris/iris_draw.c
index 20a3cce6657..d938c3d0f4f 100644
--- a/src/gallium/drivers/iris/iris_draw.c
+++ b/src/gallium/drivers/iris/iris_draw.c
@@ -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;