mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
zink: move samplerview descset refs to base objects
this further extends the lifetimes for sets Reviewed-by: Hoe Hao Cheng <haochengho12907@gmail.com> Acked-by: Dave Airlie <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11188>
This commit is contained in:
parent
ff692d042b
commit
4487825f0b
3 changed files with 22 additions and 35 deletions
|
|
@ -727,7 +727,6 @@ zink_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *pres,
|
|||
FREE(sampler_view);
|
||||
return NULL;
|
||||
}
|
||||
util_dynarray_init(&sampler_view->desc_set_refs.refs, NULL);
|
||||
return &sampler_view->base;
|
||||
}
|
||||
|
||||
|
|
@ -749,7 +748,6 @@ zink_sampler_view_destroy(struct pipe_context *pctx,
|
|||
struct pipe_sampler_view *pview)
|
||||
{
|
||||
struct zink_sampler_view *view = zink_sampler_view(pview);
|
||||
zink_descriptor_set_refs_clear(&view->desc_set_refs, view);
|
||||
if (pview->texture->target == PIPE_BUFFER)
|
||||
zink_buffer_view_reference(zink_screen(pctx->screen), &view->buffer_view, NULL);
|
||||
else {
|
||||
|
|
@ -1258,13 +1256,6 @@ 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);
|
||||
}
|
||||
|
||||
static void
|
||||
sampler_view_buffer_clear(struct zink_context *ctx, struct zink_sampler_view *sampler_view)
|
||||
{
|
||||
zink_descriptor_set_refs_clear(&sampler_view->desc_set_refs, sampler_view);
|
||||
zink_buffer_view_reference(zink_screen(ctx->base.screen), &sampler_view->buffer_view, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
unbind_samplerview(struct zink_context *ctx, enum pipe_shader_type stage, unsigned slot)
|
||||
{
|
||||
|
|
@ -1305,7 +1296,7 @@ zink_set_sampler_views(struct pipe_context *pctx,
|
|||
if (buffer_view == b->buffer_view)
|
||||
p_atomic_dec(&buffer_view->reference.count);
|
||||
else {
|
||||
sampler_view_buffer_clear(ctx, b);
|
||||
zink_buffer_view_reference(zink_screen(ctx->base.screen), &b->buffer_view, NULL);
|
||||
b->buffer_view = buffer_view;
|
||||
update = true;
|
||||
}
|
||||
|
|
@ -3042,7 +3033,7 @@ 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]);
|
||||
sampler_view_buffer_clear(ctx, sampler_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);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -83,7 +83,6 @@ struct zink_buffer_view {
|
|||
|
||||
struct zink_sampler_view {
|
||||
struct pipe_sampler_view base;
|
||||
struct zink_descriptor_refs desc_set_refs;
|
||||
union {
|
||||
struct zink_surface *image_view;
|
||||
struct zink_buffer_view *buffer_view;
|
||||
|
|
|
|||
|
|
@ -67,9 +67,8 @@ struct zink_descriptor_set {
|
|||
#endif
|
||||
union {
|
||||
struct zink_resource_object **res_objs;
|
||||
struct zink_descriptor_surface *surfaces;
|
||||
struct {
|
||||
struct zink_sampler_view **sampler_views;
|
||||
struct zink_descriptor_surface *surfaces;
|
||||
struct zink_sampler_state **sampler_states;
|
||||
};
|
||||
};
|
||||
|
|
@ -219,9 +218,15 @@ descriptor_set_invalidate(struct zink_descriptor_set *zds)
|
|||
}
|
||||
break;
|
||||
case ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW:
|
||||
if (zds->sampler_views[i])
|
||||
pop_desc_set_ref(zds, &zds->sampler_views[i]->desc_set_refs.refs);
|
||||
zds->sampler_views[i] = NULL;
|
||||
if (zds->surfaces[i].is_buffer) {
|
||||
if (zds->surfaces[i].bufferview)
|
||||
pop_desc_set_ref(zds, &zds->surfaces[i].bufferview->desc_set_refs.refs);
|
||||
zds->surfaces[i].bufferview = NULL;
|
||||
} else {
|
||||
if (zds->surfaces[i].surface)
|
||||
pop_desc_set_ref(zds, &zds->surfaces[i].surface->desc_set_refs.refs);
|
||||
zds->surfaces[i].surface = NULL;
|
||||
}
|
||||
if (zds->sampler_states[i])
|
||||
pop_desc_set_ref(zds, &zds->sampler_states[i]->desc_set_refs.refs);
|
||||
zds->sampler_states[i] = NULL;
|
||||
|
|
@ -597,14 +602,14 @@ allocate_desc_set(struct zink_context *ctx, struct zink_program *pg, enum zink_d
|
|||
void **samplers = NULL;
|
||||
struct zink_descriptor_surface *surfaces = NULL;
|
||||
switch (type) {
|
||||
case ZINK_DESCRIPTOR_TYPE_IMAGE:
|
||||
surfaces = rzalloc_array(pool, struct zink_descriptor_surface, num_resources * bucket_size);
|
||||
assert(surfaces);
|
||||
break;
|
||||
case ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW:
|
||||
samplers = rzalloc_array(pool, void*, num_resources * bucket_size);
|
||||
assert(samplers);
|
||||
FALLTHROUGH;
|
||||
case ZINK_DESCRIPTOR_TYPE_IMAGE:
|
||||
surfaces = rzalloc_array(pool, struct zink_descriptor_surface, num_resources * bucket_size);
|
||||
assert(surfaces);
|
||||
break;
|
||||
default:
|
||||
res_objs = rzalloc_array(pool, struct zink_resource_object*, num_resources * bucket_size);
|
||||
assert(res_objs);
|
||||
|
|
@ -623,9 +628,8 @@ allocate_desc_set(struct zink_context *ctx, struct zink_program *pg, enum zink_d
|
|||
#endif
|
||||
switch (type) {
|
||||
case ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW:
|
||||
zds->sampler_views = (struct zink_sampler_view**)&res_objs[i * pool->key.layout->num_descriptors];
|
||||
zds->sampler_states = (struct zink_sampler_state**)&samplers[i * pool->key.layout->num_descriptors];
|
||||
break;
|
||||
FALLTHROUGH;
|
||||
case ZINK_DESCRIPTOR_TYPE_IMAGE:
|
||||
zds->surfaces = &surfaces[i * pool->key.layout->num_descriptors];
|
||||
break;
|
||||
|
|
@ -872,12 +876,6 @@ zink_sampler_state_desc_set_add(struct zink_sampler_state *sampler_state, struct
|
|||
zds->sampler_states[idx] = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
zink_sampler_view_desc_set_add(struct zink_sampler_view *sampler_view, struct zink_descriptor_set *zds, unsigned idx)
|
||||
{
|
||||
desc_set_ref_add(zds, &sampler_view->desc_set_refs, (void**)&zds->sampler_views[idx], sampler_view);
|
||||
}
|
||||
|
||||
static void
|
||||
zink_resource_desc_set_add(struct zink_resource *res, struct zink_descriptor_set *zds, unsigned idx)
|
||||
{
|
||||
|
|
@ -1001,7 +999,7 @@ desc_set_res_add(struct zink_descriptor_set *zds, struct zink_resource *res, uns
|
|||
}
|
||||
|
||||
static void
|
||||
desc_set_sampler_add(struct zink_context *ctx, struct zink_descriptor_set *zds, struct zink_sampler_view *sv,
|
||||
desc_set_sampler_add(struct zink_context *ctx, struct zink_descriptor_set *zds, struct zink_descriptor_surface *dsurf,
|
||||
struct zink_sampler_state *state, unsigned int i, bool is_buffer, bool cache_hit)
|
||||
{
|
||||
/* if we got a cache hit, we have to verify that the cached set is still valid;
|
||||
|
|
@ -1010,13 +1008,13 @@ desc_set_sampler_add(struct zink_context *ctx, struct zink_descriptor_set *zds,
|
|||
* whenever a resource is destroyed
|
||||
*/
|
||||
#ifndef NDEBUG
|
||||
uint32_t cur_hash = zink_get_sampler_view_hash(ctx, zds->sampler_views[i], is_buffer);
|
||||
uint32_t new_hash = zink_get_sampler_view_hash(ctx, sv, is_buffer);
|
||||
uint32_t cur_hash = get_descriptor_surface_hash(ctx, &zds->surfaces[i]);
|
||||
uint32_t new_hash = get_descriptor_surface_hash(ctx, dsurf);
|
||||
#endif
|
||||
assert(!cache_hit || cur_hash == new_hash);
|
||||
assert(!cache_hit || zds->sampler_states[i] == state);
|
||||
if (!cache_hit) {
|
||||
zink_sampler_view_desc_set_add(sv, zds, i);
|
||||
zink_descriptor_surface_desc_set_add(dsurf, zds, i);
|
||||
zink_sampler_state_desc_set_add(state, zds, i);
|
||||
}
|
||||
}
|
||||
|
|
@ -1158,12 +1156,11 @@ update_descriptors_internal(struct zink_context *ctx, struct zink_descriptor_set
|
|||
for (unsigned k = 0; k < shader->bindings[h][j].size; k++) {
|
||||
assert(num_resources < num_bindings);
|
||||
if (h == ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW) {
|
||||
struct zink_sampler_view *sampler_view = zink_sampler_view(ctx->sampler_views[stage][index + k]);
|
||||
struct zink_sampler_state *sampler = NULL;
|
||||
if (!is_buffer && image_info->imageView)
|
||||
sampler = ctx->sampler_states[stage][index + k];;
|
||||
|
||||
desc_set_sampler_add(ctx, zds[h], sampler_view, sampler, num_resources++, is_buffer, cache_hit[h]);
|
||||
desc_set_sampler_add(ctx, zds[h], &ctx->di.sampler_surfaces[stage][index + k], sampler, num_resources++, is_buffer, cache_hit[h]);
|
||||
} else {
|
||||
struct zink_image_view *image_view = &ctx->image_views[stage][index + k];
|
||||
desc_set_image_add(ctx, zds[h], image_view, num_resources++, is_buffer, cache_hit[h]);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue