From 2729513d290a58ebffee9137497a66a50ebac1c1 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 27 Oct 2020 12:44:58 -0400 Subject: [PATCH] zink: hook up resource bind history seems like this should be a gallium thing with how many drivers copy/paste it Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_context.c | 16 +++++++++++++++- src/gallium/drivers/zink/zink_resource.h | 3 +++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 149c636f7ec..5f17455d87c 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -826,8 +826,13 @@ zink_set_constant_buffer(struct pipe_context *pctx, cb->user_buffer, &offset, &buffer); } struct zink_resource *res = zink_resource(ctx->ubos[shader][index].buffer); + struct zink_resource *new_res = zink_resource(buffer); + if (new_res) { + new_res->bind_history |= BITFIELD_BIT(ZINK_DESCRIPTOR_TYPE_UBO); + new_res->bind_stages |= 1 << shader; + } update |= (index && ctx->ubos[shader][index].buffer_offset != offset) || - !!res != !!buffer || (res && res->obj->buffer != zink_resource(buffer)->obj->buffer) || + !!res != !!buffer || (res && res->obj->buffer != new_res->obj->buffer) || ctx->ubos[shader][index].buffer_size != cb->buffer_size; if (take_ownership) { @@ -872,6 +877,8 @@ zink_set_shader_buffers(struct pipe_context *pctx, struct pipe_shader_buffer *ssbo = &ctx->ssbos[p_stage][start_slot + i]; if (buffers && buffers[i].buffer) { struct zink_resource *res = zink_resource(buffers[i].buffer); + res->bind_history |= BITFIELD_BIT(ZINK_DESCRIPTOR_TYPE_SSBO); + res->bind_stages |= 1 << p_stage; pipe_resource_reference(&ssbo->buffer, &res->base); ssbo->buffer_offset = buffers[i].buffer_offset; ssbo->buffer_size = MIN2(buffers[i].buffer_size, res->obj->size - ssbo->buffer_offset); @@ -921,6 +928,8 @@ zink_set_shader_images(struct pipe_context *pctx, if (images && images[i].resource) { util_dynarray_init(&image_view->desc_set_refs.refs, NULL); struct zink_resource *res = zink_resource(images[i].resource); + res->bind_history |= BITFIELD_BIT(ZINK_DESCRIPTOR_TYPE_IMAGE); + res->bind_stages |= 1 << p_stage; util_copy_image_view(&image_view->base, images + i); if (images[i].resource->target == PIPE_BUFFER) { image_view->buffer_view = get_buffer_view(ctx, res, images[i].format, images[i].u.buf.offset, images[i].u.buf.size); @@ -968,6 +977,11 @@ zink_set_sampler_views(struct pipe_context *pctx, struct pipe_sampler_view *pview = views ? views[i] : NULL; struct zink_sampler_view *a = zink_sampler_view(ctx->sampler_views[shader_type][start_slot + i]); struct zink_sampler_view *b = zink_sampler_view(pview); + if (b && b->base.texture) { + struct zink_resource *res = zink_resource(b->base.texture); + res->bind_history |= BITFIELD_BIT(ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW); + res->bind_stages |= 1 << shader_type; + } uint32_t hash_a = get_sampler_view_hash(a); uint32_t hash_b = get_sampler_view_hash(b); update |= !!a != !!b || hash_a != hash_b; diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h index ada3edcdb14..4a6be36fa56 100644 --- a/src/gallium/drivers/zink/zink_resource.h +++ b/src/gallium/drivers/zink/zink_resource.h @@ -86,6 +86,9 @@ struct zink_resource { struct sw_displaytarget *dt; unsigned dt_stride; + + uint32_t bind_history; // enum zink_descriptor_type bitmask + uint32_t bind_stages; }; struct zink_transfer {