From f12188ff5264b29f6270c40c7592543aca6c2f4a Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Fri, 24 Apr 2020 14:45:04 -0700 Subject: freedreno: optimize rebind_resource() Track how resources are used, ie. which state they may potentially dirty if the backing bo is changed/reallocated, to optimize rebind_resource(). This will be more important in a later patch when we hook up eviction of entries in a6xx tex state cache. Signed-off-by: Rob Clark Part-of: --- src/gallium/drivers/freedreno/freedreno_state.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src/gallium/drivers/freedreno/freedreno_state.c') diff --git a/src/gallium/drivers/freedreno/freedreno_state.c b/src/gallium/drivers/freedreno/freedreno_state.c index a748bfec82c..65b1e2b6609 100644 --- a/src/gallium/drivers/freedreno/freedreno_state.c +++ b/src/gallium/drivers/freedreno/freedreno_state.c @@ -115,6 +115,8 @@ fd_set_constant_buffer(struct pipe_context *pctx, so->enabled_mask |= 1 << index; ctx->dirty_shader[shader] |= FD_DIRTY_SHADER_CONST; ctx->dirty |= FD_DIRTY_CONST; + + fd_resource_set_usage(cb->buffer, FD_DIRTY_CONST); } static void @@ -146,6 +148,8 @@ fd_set_shader_buffers(struct pipe_context *pctx, buf->buffer_size = buffers[i].buffer_size; pipe_resource_reference(&buf->buffer, buffers[i].buffer); + fd_resource_set_usage(buffers[i].buffer, FD_DIRTY_SSBO); + so->enabled_mask |= BIT(n); } else { pipe_resource_reference(&buf->buffer, NULL); @@ -153,6 +157,7 @@ fd_set_shader_buffers(struct pipe_context *pctx, } ctx->dirty_shader[shader] |= FD_DIRTY_SHADER_SSBO; + ctx->dirty |= FD_DIRTY_SSBO; } void @@ -180,10 +185,12 @@ fd_set_shader_images(struct pipe_context *pctx, mask |= BIT(n); util_copy_image_view(buf, &images[i]); - if (buf->resource) + if (buf->resource) { + fd_resource_set_usage(buf->resource, FD_DIRTY_IMAGE); so->enabled_mask |= BIT(n); - else + } else { so->enabled_mask &= ~BIT(n); + } } } else { mask = (BIT(count) - 1) << start; @@ -199,6 +206,7 @@ fd_set_shader_images(struct pipe_context *pctx, } ctx->dirty_shader[shader] |= FD_DIRTY_SHADER_IMAGE; + ctx->dirty |= FD_DIRTY_IMAGE; } static void @@ -348,7 +356,15 @@ fd_set_vertex_buffers(struct pipe_context *pctx, util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, start_slot, count); so->count = util_last_bit(so->enabled_mask); + if (!vb) + return; + ctx->dirty |= FD_DIRTY_VTXBUF; + + for (unsigned i = 0; i < count; i++) { + assert(!vb[i].is_user_buffer); + fd_resource_set_usage(vb[i].buffer.resource, FD_DIRTY_VTXBUF); + } } static void -- cgit v1.2.3