diff --git a/src/gallium/drivers/iris/iris_bufmgr.h b/src/gallium/drivers/iris/iris_bufmgr.h index 3c2da0e06a6..66da1078614 100644 --- a/src/gallium/drivers/iris/iris_bufmgr.h +++ b/src/gallium/drivers/iris/iris_bufmgr.h @@ -107,6 +107,8 @@ enum iris_domain { IRIS_DOMAIN_DEPTH_WRITE, /** Any other read-write cache. */ IRIS_DOMAIN_OTHER_WRITE, + /** Vertex cache. */ + IRIS_DOMAIN_VF_READ, /** Any other read-only cache. */ IRIS_DOMAIN_OTHER_READ, /** Number of caching domains. */ @@ -121,7 +123,8 @@ enum iris_domain { static inline bool iris_domain_is_read_only(enum iris_domain access) { - return access == IRIS_DOMAIN_OTHER_READ; + return access == IRIS_DOMAIN_OTHER_READ || + access == IRIS_DOMAIN_VF_READ; } enum iris_mmap_mode { diff --git a/src/gallium/drivers/iris/iris_pipe_control.c b/src/gallium/drivers/iris/iris_pipe_control.c index 97689513b72..069e52609f7 100644 --- a/src/gallium/drivers/iris/iris_pipe_control.c +++ b/src/gallium/drivers/iris/iris_pipe_control.c @@ -191,12 +191,14 @@ iris_emit_buffer_barrier_for(struct iris_batch *batch, [IRIS_DOMAIN_RENDER_WRITE] = PIPE_CONTROL_RENDER_TARGET_FLUSH, [IRIS_DOMAIN_DEPTH_WRITE] = PIPE_CONTROL_DEPTH_CACHE_FLUSH, [IRIS_DOMAIN_OTHER_WRITE] = PIPE_CONTROL_FLUSH_ENABLE, + [IRIS_DOMAIN_VF_READ] = PIPE_CONTROL_STALL_AT_SCOREBOARD, [IRIS_DOMAIN_OTHER_READ] = PIPE_CONTROL_STALL_AT_SCOREBOARD, }; const uint32_t invalidate_bits[NUM_IRIS_DOMAINS] = { [IRIS_DOMAIN_RENDER_WRITE] = PIPE_CONTROL_RENDER_TARGET_FLUSH, [IRIS_DOMAIN_DEPTH_WRITE] = PIPE_CONTROL_DEPTH_CACHE_FLUSH, [IRIS_DOMAIN_OTHER_WRITE] = PIPE_CONTROL_FLUSH_ENABLE, + [IRIS_DOMAIN_VF_READ] = PIPE_CONTROL_VF_CACHE_INVALIDATE, [IRIS_DOMAIN_OTHER_READ] = (PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE | PIPE_CONTROL_CONST_CACHE_INVALIDATE), }; @@ -231,7 +233,7 @@ iris_emit_buffer_barrier_for(struct iris_batch *batch, * in order to handle any WaR dependencies. */ if (!iris_domain_is_read_only(access)) { - for (unsigned i = IRIS_DOMAIN_OTHER_READ; i < NUM_IRIS_DOMAINS; i++) { + for (unsigned i = IRIS_DOMAIN_VF_READ; i < NUM_IRIS_DOMAINS; i++) { assert(iris_domain_is_read_only(i)); const uint64_t seqno = READ_ONCE(bo->last_seqnos[i]); diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index 52181f06d89..b692f349813 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -7366,8 +7366,10 @@ batch_mark_sync_for_pipe_control(struct iris_batch *batch, uint32_t flags) iris_batch_mark_flush_sync(batch, IRIS_DOMAIN_OTHER_WRITE); if ((flags & (PIPE_CONTROL_CACHE_FLUSH_BITS | - PIPE_CONTROL_STALL_AT_SCOREBOARD))) + PIPE_CONTROL_STALL_AT_SCOREBOARD))) { + iris_batch_mark_flush_sync(batch, IRIS_DOMAIN_VF_READ); iris_batch_mark_flush_sync(batch, IRIS_DOMAIN_OTHER_READ); + } } if ((flags & PIPE_CONTROL_RENDER_TARGET_FLUSH)) @@ -7379,6 +7381,9 @@ batch_mark_sync_for_pipe_control(struct iris_batch *batch, uint32_t flags) if ((flags & PIPE_CONTROL_FLUSH_ENABLE)) iris_batch_mark_invalidate_sync(batch, IRIS_DOMAIN_OTHER_WRITE); + if ((flags & PIPE_CONTROL_VF_CACHE_INVALIDATE)) + iris_batch_mark_invalidate_sync(batch, IRIS_DOMAIN_VF_READ); + if ((flags & PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE) && (flags & PIPE_CONTROL_CONST_CACHE_INVALIDATE)) iris_batch_mark_invalidate_sync(batch, IRIS_DOMAIN_OTHER_READ);