diff options
author | Kenneth Graunke <[email protected]> | 2019-06-19 23:30:52 -0500 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2019-06-20 13:32:16 -0500 |
commit | 1d63af0f2c6be12d134357670c32c47ace2c8da2 (patch) | |
tree | 60b58284f54e5e3a75ca1f5922f7031409db115a /src/gallium/drivers/iris | |
parent | dfff6e10b4296592bae0034e91c633a31b2d2b90 (diff) |
iris: Don't bother with PIPE_CONTROLs for CPU writes and no history
If a buffer has no usage history, we don't have any read only cache
invalidates to do. If we've written it with the CPU, we don't need
to flush the render cache. The only bit remaining is the CS stall
from iris_flush_bits_for_history. We can just skip the PIPE_CONTROL
in this case.
This is pretty common - an app creates a buffer, fills it with data,
and then binds it for some purpose.
Cuts 36% of the flushes in Manhattan 3.0 on Kabylake GT2.
Diffstat (limited to 'src/gallium/drivers/iris')
-rw-r--r-- | src/gallium/drivers/iris/iris_resource.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/gallium/drivers/iris/iris_resource.c b/src/gallium/drivers/iris/iris_resource.c index a413cbae9b3..8ca1e6e940a 100644 --- a/src/gallium/drivers/iris/iris_resource.c +++ b/src/gallium/drivers/iris/iris_resource.c @@ -1479,12 +1479,15 @@ iris_transfer_flush_region(struct pipe_context *ctx, (map->staging ? PIPE_CONTROL_RENDER_TARGET_FLUSH : 0); } - for (int i = 0; i < IRIS_BATCH_COUNT; i++) { - struct iris_batch *batch = &ice->batches[i]; - if (batch->contains_draw || batch->cache.render->entries) { - iris_batch_maybe_flush(batch, 24); - iris_emit_pipe_control_flush(batch, "cache history: transfer flush", - history_flush); + if (history_flush & ~PIPE_CONTROL_CS_STALL) { + for (int i = 0; i < IRIS_BATCH_COUNT; i++) { + struct iris_batch *batch = &ice->batches[i]; + if (batch->contains_draw || batch->cache.render->entries) { + iris_batch_maybe_flush(batch, 24); + iris_emit_pipe_control_flush(batch, + "cache history: transfer flush", + history_flush); + } } } |