Mesa (main): zink: remove samplerview refs
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Jul 7 00:31:25 UTC 2021
Module: Mesa
Branch: main
Commit: 1771ba8f96030113f8e64b11c3f5772e3ea670ee
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1771ba8f96030113f8e64b11c3f5772e3ea670ee
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Tue May 11 09:23:25 2021 -0400
zink: remove samplerview refs
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11692>
---
src/gallium/drivers/zink/zink_context.c | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index ef96d2c15a5..634ea775a9d 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -1320,6 +1320,15 @@ zink_set_shader_images(struct pipe_context *pctx,
zink_screen(pctx->screen)->context_invalidate_descriptor_state(ctx, p_stage, ZINK_DESCRIPTOR_TYPE_IMAGE, start_slot, count);
}
+ALWAYS_INLINE static void
+check_samplerview_for_batch_ref(struct zink_context *ctx, struct zink_sampler_view *sv)
+{
+ const struct zink_resource *res = zink_resource(sv->base.texture);
+ if ((res->obj->is_buffer && zink_batch_usage_exists(sv->buffer_view->batch_uses)) ||
+ (!res->obj->is_buffer && zink_batch_usage_exists(sv->image_view->batch_uses)))
+ zink_batch_reference_sampler_view(&ctx->batch, sv);
+}
+
ALWAYS_INLINE static void
unbind_samplerview(struct zink_context *ctx, enum pipe_shader_type stage, unsigned slot)
{
@@ -1327,6 +1336,7 @@ unbind_samplerview(struct zink_context *ctx, enum pipe_shader_type stage, unsign
if (!sv || !sv->base.texture)
return;
struct zink_resource *res = zink_resource(sv->base.texture);
+ check_samplerview_for_batch_ref(ctx, sv);
update_res_bind_count(ctx, res, stage == PIPE_SHADER_COMPUTE, true);
if (!res->obj->is_buffer)
res->sampler_binds[stage] &= ~BITFIELD_BIT(slot);
@@ -1356,6 +1366,8 @@ zink_set_sampler_views(struct pipe_context *pctx,
update_res_bind_count(ctx, res, shader_type == PIPE_SHADER_COMPUTE, false);
res->bind_history |= BITFIELD64_BIT(ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW);
res->bind_stages |= 1 << shader_type;
+ } else if (a != b) {
+ check_samplerview_for_batch_ref(ctx, a);
}
if (res->base.b.target == PIPE_BUFFER) {
if (res->bind_history & BITFIELD64_BIT(ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW)) {
@@ -1367,6 +1379,8 @@ zink_set_sampler_views(struct pipe_context *pctx,
if (buffer_view == b->buffer_view)
p_atomic_dec(&buffer_view->reference.count);
else {
+ if (zink_batch_usage_exists(b->buffer_view->batch_uses))
+ zink_batch_reference_bufferview(&ctx->batch, b->buffer_view);
zink_buffer_view_reference(zink_screen(ctx->base.screen), &b->buffer_view, NULL);
b->buffer_view = buffer_view;
update = true;
@@ -1393,9 +1407,6 @@ zink_set_sampler_views(struct pipe_context *pctx,
if (!a)
update = true;
}
- if (!ctx->descriptor_refs_dirty[shader_type == PIPE_SHADER_COMPUTE]) {
- zink_batch_reference_sampler_view(&ctx->batch, b);
- }
zink_batch_resource_usage_set(&ctx->batch, res, false);
} else if (a) {
unbind_samplerview(ctx, shader_type, start_slot + i);
@@ -3138,6 +3149,8 @@ check_and_rebind_buffer(struct zink_context *ctx, struct zink_resource *res, uns
}
case ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW: {
struct zink_sampler_view *sampler_view = zink_sampler_view(ctx->sampler_views[shader][i]);
+ if (zink_batch_usage_exists(sampler_view->buffer_view->batch_uses))
+ zink_batch_reference_bufferview(&ctx->batch, sampler_view->buffer_view);
zink_buffer_view_reference(zink_screen(ctx->base.screen), &sampler_view->buffer_view, NULL);
sampler_view->buffer_view = get_buffer_view(ctx, res, sampler_view->base.format,
sampler_view->base.u.buf.offset, sampler_view->base.u.buf.size);
More information about the mesa-commit
mailing list