summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/freedreno/freedreno_state.c
diff options
context:
space:
mode:
authorRob Clark <robdclark@chromium.org>2020-04-24 14:45:04 -0700
committerMarge Bot <eric+marge@anholt.net>2020-04-29 00:08:57 +0000
commitf12188ff5264b29f6270c40c7592543aca6c2f4a (patch)
tree0554ecf21dc7e215a3d04e4edcc1eb59bec9035c /src/gallium/drivers/freedreno/freedreno_state.c
parent1e18c58047ef5920dbe442bc6fc42e62dc0edb7d (diff)
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 <robdclark@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4744>
Diffstat (limited to 'src/gallium/drivers/freedreno/freedreno_state.c')
-rw-r--r--src/gallium/drivers/freedreno/freedreno_state.c20
1 files changed, 18 insertions, 2 deletions
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