mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 15:40:11 +01:00
zink: remove the worst part of basic framebuffer support
this was one of the most complex interactions in zink, and now it's finally gone thanks to @jekstrand for licensing his patented Delete The Code methodology for this project Acked-by: Adam Jackson <ajax@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15904>
This commit is contained in:
parent
00f2517391
commit
beb71504f4
3 changed files with 2 additions and 39 deletions
|
|
@ -40,10 +40,7 @@ struct zink_framebuffer_state {
|
||||||
uint32_t layers:6;
|
uint32_t layers:6;
|
||||||
uint32_t samples:6;
|
uint32_t samples:6;
|
||||||
uint32_t num_attachments:4;
|
uint32_t num_attachments:4;
|
||||||
union {
|
struct zink_surface_info infos[PIPE_MAX_COLOR_BUFS + 1];
|
||||||
VkImageView attachments[PIPE_MAX_COLOR_BUFS + 1];
|
|
||||||
struct zink_surface_info infos[PIPE_MAX_COLOR_BUFS + 1];
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct zink_framebuffer {
|
struct zink_framebuffer {
|
||||||
|
|
@ -54,10 +51,7 @@ struct zink_framebuffer {
|
||||||
struct zink_render_pass *rp;
|
struct zink_render_pass *rp;
|
||||||
|
|
||||||
struct zink_framebuffer_state state;
|
struct zink_framebuffer_state state;
|
||||||
union {
|
VkFramebufferAttachmentImageInfo infos[PIPE_MAX_COLOR_BUFS + 1];
|
||||||
struct pipe_surface *surfaces[PIPE_MAX_COLOR_BUFS + 1];
|
|
||||||
VkFramebufferAttachmentImageInfo infos[PIPE_MAX_COLOR_BUFS + 1];
|
|
||||||
};
|
|
||||||
struct hash_table objects;
|
struct hash_table objects;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -165,7 +165,6 @@ create_surface(struct pipe_context *pctx,
|
||||||
surface->base.u.tex.first_layer = templ->u.tex.first_layer;
|
surface->base.u.tex.first_layer = templ->u.tex.first_layer;
|
||||||
surface->base.u.tex.last_layer = templ->u.tex.last_layer;
|
surface->base.u.tex.last_layer = templ->u.tex.last_layer;
|
||||||
surface->obj = zink_resource(pres)->obj;
|
surface->obj = zink_resource(pres)->obj;
|
||||||
util_dynarray_init(&surface->framebuffer_refs, NULL);
|
|
||||||
util_dynarray_init(&surface->desc_set_refs.refs, NULL);
|
util_dynarray_init(&surface->desc_set_refs.refs, NULL);
|
||||||
|
|
||||||
init_surface_info(surface, res, ivci);
|
init_surface_info(surface, res, ivci);
|
||||||
|
|
@ -291,33 +290,6 @@ zink_create_surface(struct pipe_context *pctx,
|
||||||
return &csurf->base;
|
return &csurf->base;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* framebuffers are owned by their surfaces, so each time a surface that's part of a cached fb
|
|
||||||
* is destroyed, it has to unref all the framebuffers it's attached to in order to avoid leaking
|
|
||||||
* all the framebuffers
|
|
||||||
*
|
|
||||||
* surfaces are always batch-tracked, so it is impossible for a framebuffer to be destroyed
|
|
||||||
* while it is in use
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
surface_clear_fb_refs(struct zink_screen *screen, struct pipe_surface *psurface)
|
|
||||||
{
|
|
||||||
struct zink_surface *surface = zink_surface(psurface);
|
|
||||||
util_dynarray_foreach(&surface->framebuffer_refs, struct zink_framebuffer*, fb_ref) {
|
|
||||||
struct zink_framebuffer *fb = *fb_ref;
|
|
||||||
for (unsigned i = 0; i < fb->state.num_attachments; i++) {
|
|
||||||
if (fb->surfaces[i] == psurface) {
|
|
||||||
simple_mtx_lock(&screen->framebuffer_mtx);
|
|
||||||
fb->surfaces[i] = NULL;
|
|
||||||
_mesa_hash_table_remove_key(&screen->framebuffer_cache, &fb->state);
|
|
||||||
zink_framebuffer_reference(screen, &fb, NULL);
|
|
||||||
simple_mtx_unlock(&screen->framebuffer_mtx);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
util_dynarray_fini(&surface->framebuffer_refs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
zink_destroy_surface(struct zink_screen *screen, struct pipe_surface *psurface)
|
zink_destroy_surface(struct zink_screen *screen, struct pipe_surface *psurface)
|
||||||
{
|
{
|
||||||
|
|
@ -337,7 +309,6 @@ zink_destroy_surface(struct zink_screen *screen, struct pipe_surface *psurface)
|
||||||
simple_mtx_unlock(&res->surface_mtx);
|
simple_mtx_unlock(&res->surface_mtx);
|
||||||
}
|
}
|
||||||
zink_descriptor_set_refs_clear(&surface->desc_set_refs, surface);
|
zink_descriptor_set_refs_clear(&surface->desc_set_refs, surface);
|
||||||
util_dynarray_fini(&surface->framebuffer_refs);
|
|
||||||
if (surface->simage_view)
|
if (surface->simage_view)
|
||||||
VKSCR(DestroyImageView)(screen->dev, surface->simage_view, NULL);
|
VKSCR(DestroyImageView)(screen->dev, surface->simage_view, NULL);
|
||||||
if (surface->is_swapchain) {
|
if (surface->is_swapchain) {
|
||||||
|
|
@ -379,7 +350,6 @@ zink_rebind_surface(struct zink_context *ctx, struct pipe_surface **psurface)
|
||||||
struct hash_entry *new_entry = _mesa_hash_table_search_pre_hashed(&res->surface_cache, hash, &ivci);
|
struct hash_entry *new_entry = _mesa_hash_table_search_pre_hashed(&res->surface_cache, hash, &ivci);
|
||||||
if (zink_batch_usage_exists(surface->batch_uses))
|
if (zink_batch_usage_exists(surface->batch_uses))
|
||||||
zink_batch_reference_surface(&ctx->batch, surface);
|
zink_batch_reference_surface(&ctx->batch, surface);
|
||||||
surface_clear_fb_refs(screen, *psurface);
|
|
||||||
zink_descriptor_set_refs_clear(&surface->desc_set_refs, surface);
|
zink_descriptor_set_refs_clear(&surface->desc_set_refs, surface);
|
||||||
if (new_entry) {
|
if (new_entry) {
|
||||||
/* reuse existing surface; old one will be cleaned up naturally */
|
/* reuse existing surface; old one will be cleaned up naturally */
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,6 @@ struct zink_surface {
|
||||||
void *obj; //backing resource object
|
void *obj; //backing resource object
|
||||||
uint32_t hash;
|
uint32_t hash;
|
||||||
struct zink_batch_usage *batch_uses;
|
struct zink_batch_usage *batch_uses;
|
||||||
struct util_dynarray framebuffer_refs;
|
|
||||||
struct zink_descriptor_refs desc_set_refs;
|
struct zink_descriptor_refs desc_set_refs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue