From: Kenneth Graunke Date: Tue, 21 Aug 2018 18:50:56 +0000 (-0700) Subject: iris: try to hack around binder issue X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b3bb33c4c13feb45a402ea72549a731fce2a73ae;p=mesa.git iris: try to hack around binder issue --- 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;