diff options
author | Kenneth Graunke <[email protected]> | 2018-08-21 11:50:56 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2019-02-21 10:26:08 -0800 |
commit | b3bb33c4c13feb45a402ea72549a731fce2a73ae (patch) | |
tree | 24ab1788a9325c9ed775cb0c1628c845c4487256 /src | |
parent | d2516358f98f2770b9bc1e8669520a5a3e19f86d (diff) |
iris: try to hack around binder issue
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/iris/iris_binder.c | 13 | ||||
-rw-r--r-- | src/gallium/drivers/iris/iris_binder.h | 2 | ||||
-rw-r--r-- | src/gallium/drivers/iris/iris_draw.c | 9 |
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; |