diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index d1866b5fc79..aab0473a3b5 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -139,16 +139,8 @@ zink_context_destroy(struct pipe_context *pctx) util_dynarray_fini(&ctx->di.bindless[i].resident); } - if (screen->info.have_KHR_imageless_framebuffer) { - hash_table_foreach(&ctx->framebuffer_cache, he) - zink_destroy_framebuffer(screen, he->data); - } else if (ctx->framebuffer) { - simple_mtx_lock(&screen->framebuffer_mtx); - struct hash_entry *entry = _mesa_hash_table_search(&screen->framebuffer_cache, &ctx->framebuffer->state); - if (zink_framebuffer_reference(screen, &ctx->framebuffer, NULL)) - _mesa_hash_table_remove(&screen->framebuffer_cache, entry); - simple_mtx_unlock(&screen->framebuffer_mtx); - } + hash_table_foreach(&ctx->framebuffer_cache, he) + zink_destroy_framebuffer(screen, he->data); hash_table_foreach(ctx->render_pass_cache, he) zink_destroy_render_pass(screen, he->data); @@ -2137,26 +2129,6 @@ update_framebuffer_state(struct zink_context *ctx, int old_w, int old_h) * we're about to use */ struct zink_framebuffer *fb = ctx->get_framebuffer(ctx); - struct zink_screen *screen = zink_screen(ctx->base.screen); - if (ctx->framebuffer && !screen->info.have_KHR_imageless_framebuffer) { - simple_mtx_lock(&screen->framebuffer_mtx); - struct hash_entry *he = _mesa_hash_table_search(&screen->framebuffer_cache, &ctx->framebuffer->state); - if (ctx->framebuffer && !ctx->framebuffer->state.num_attachments) { - /* if this has no attachments then its lifetime has ended */ - _mesa_hash_table_remove(&screen->framebuffer_cache, he); - he = NULL; - /* ensure an unflushed fb doesn't get destroyed by deferring it */ - util_dynarray_append(&ctx->batch.state->dead_framebuffers, struct zink_framebuffer*, ctx->framebuffer); - ctx->framebuffer = NULL; - } - /* a framebuffer loses 1 ref every time we unset it; - * we do NOT add refs here, as the ref has already been added in - * get_framebuffer() - */ - if (zink_framebuffer_reference(screen, &ctx->framebuffer, NULL) && he) - _mesa_hash_table_remove(&screen->framebuffer_cache, he); - simple_mtx_unlock(&screen->framebuffer_mtx); - } ctx->fb_changed |= ctx->framebuffer != fb; ctx->framebuffer = fb; } @@ -2355,36 +2327,34 @@ begin_render_pass(struct zink_context *ctx) infos.attachmentCount = ctx->framebuffer->state.num_attachments; infos.pAttachments = att; prep_fb_attachments(ctx, att); - if (zink_screen(ctx->base.screen)->info.have_KHR_imageless_framebuffer) { #ifndef NDEBUG - const unsigned cresolve_offset = ctx->fb_state.nr_cbufs + !!ctx->fb_state.zsbuf; - for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { - if (ctx->fb_state.cbufs[i]) { - struct zink_surface *surf = zink_csurface(ctx->fb_state.cbufs[i]); - struct zink_surface *transient = zink_transient_surface(ctx->fb_state.cbufs[i]); - if (surf->base.format == ctx->fb_state.cbufs[i]->format) { - if (transient) { - assert(zink_resource(transient->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[i].usage); - assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[cresolve_offset].usage); - } else { - assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[i].usage); - } + const unsigned cresolve_offset = ctx->fb_state.nr_cbufs + !!ctx->fb_state.zsbuf; + for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { + if (ctx->fb_state.cbufs[i]) { + struct zink_surface *surf = zink_csurface(ctx->fb_state.cbufs[i]); + struct zink_surface *transient = zink_transient_surface(ctx->fb_state.cbufs[i]); + if (surf->base.format == ctx->fb_state.cbufs[i]->format) { + if (transient) { + assert(zink_resource(transient->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[i].usage); + assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[cresolve_offset].usage); + } else { + assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[i].usage); } } } - if (ctx->fb_state.zsbuf) { - struct zink_surface *surf = zink_csurface(ctx->fb_state.zsbuf); - struct zink_surface *transient = zink_transient_surface(ctx->fb_state.zsbuf); - if (transient) { - assert(zink_resource(transient->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[ctx->fb_state.nr_cbufs].usage); - assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[cresolve_offset].usage); - } else { - assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[ctx->fb_state.nr_cbufs].usage); - } - } -#endif - rpbi.pNext = &infos; } + if (ctx->fb_state.zsbuf) { + struct zink_surface *surf = zink_csurface(ctx->fb_state.zsbuf); + struct zink_surface *transient = zink_transient_surface(ctx->fb_state.zsbuf); + if (transient) { + assert(zink_resource(transient->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[ctx->fb_state.nr_cbufs].usage); + assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[cresolve_offset].usage); + } else { + assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[ctx->fb_state.nr_cbufs].usage); + } + } +#endif + rpbi.pNext = &infos; VKCTX(CmdBeginRenderPass)(batch->state->cmdbuf, &rpbi, VK_SUBPASS_CONTENTS_INLINE); batch->in_rp = true; @@ -3887,11 +3857,9 @@ zink_rebind_framebuffer(struct zink_context *ctx, struct zink_resource *res) return; zink_batch_no_rp(ctx); - if (zink_screen(ctx->base.screen)->info.have_KHR_imageless_framebuffer) { - struct zink_framebuffer *fb = ctx->get_framebuffer(ctx); - ctx->fb_changed |= ctx->framebuffer != fb; - ctx->framebuffer = fb; - } + struct zink_framebuffer *fb = ctx->get_framebuffer(ctx); + ctx->fb_changed |= ctx->framebuffer != fb; + ctx->framebuffer = fb; } ALWAYS_INLINE static struct zink_resource * @@ -4247,13 +4215,8 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) ctx->base.screen = pscreen; ctx->base.priv = priv; - if (screen->info.have_KHR_imageless_framebuffer) { - ctx->get_framebuffer = zink_get_framebuffer_imageless; - ctx->init_framebuffer = zink_init_framebuffer_imageless; - } else { - ctx->get_framebuffer = zink_get_framebuffer; - ctx->init_framebuffer = zink_init_framebuffer; - } + ctx->get_framebuffer = zink_get_framebuffer_imageless; + ctx->init_framebuffer = zink_init_framebuffer_imageless; ctx->base.destroy = zink_context_destroy; ctx->base.get_device_reset_status = zink_get_device_reset_status; diff --git a/src/gallium/drivers/zink/zink_framebuffer.c b/src/gallium/drivers/zink/zink_framebuffer.c index c3eda61c94d..46f44552cfe 100644 --- a/src/gallium/drivers/zink/zink_framebuffer.c +++ b/src/gallium/drivers/zink/zink_framebuffer.c @@ -202,179 +202,8 @@ zink_get_framebuffer_imageless(struct zink_context *ctx) return fb; } -void -zink_init_framebuffer(struct zink_screen *screen, struct zink_framebuffer *fb, struct zink_render_pass *rp) -{ - VkFramebuffer ret; - - if (fb->rp == rp) - return; - - uint32_t hash = _mesa_hash_pointer(rp); - - struct hash_entry *he = _mesa_hash_table_search_pre_hashed(&fb->objects, hash, rp); - if (he) { -#if defined(_WIN64) || defined(__x86_64__) - ret = (VkFramebuffer)he->data; -#else - VkFramebuffer *ptr = he->data; - ret = *ptr; -#endif - goto out; - } - - assert(rp->state.num_cbufs + rp->state.have_zsbuf + rp->state.num_cresolves + rp->state.num_zsresolves == fb->state.num_attachments); - - VkFramebufferCreateInfo fci = {0}; - fci.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; - fci.renderPass = rp->render_pass; - fci.attachmentCount = fb->state.num_attachments; - fci.pAttachments = fb->state.attachments; - fci.width = fb->state.width; - fci.height = fb->state.height; - fci.layers = fb->state.layers + 1; - - if (VKSCR(CreateFramebuffer)(screen->dev, &fci, NULL, &ret) != VK_SUCCESS) - return; -#if defined(_WIN64) || defined(__x86_64__) - _mesa_hash_table_insert_pre_hashed(&fb->objects, hash, rp, ret); -#else - VkFramebuffer *ptr = ralloc(fb, VkFramebuffer); - if (!ptr) { - VKSCR(DestroyFramebuffer)(screen->dev, ret, NULL); - return; - } - *ptr = ret; - _mesa_hash_table_insert_pre_hashed(&fb->objects, hash, rp, ptr); -#endif -out: - fb->rp = rp; - fb->fb = ret; -} - -static struct zink_framebuffer * -create_framebuffer(struct zink_context *ctx, - struct zink_framebuffer_state *state, - struct pipe_surface **attachments) -{ - struct zink_screen *screen = zink_screen(ctx->base.screen); - struct zink_framebuffer *fb = rzalloc(NULL, struct zink_framebuffer); - if (!fb) - return NULL; - - unsigned num_attachments = 0; - for (int i = 0; i < state->num_attachments; i++) { - struct zink_surface *surf; - if (state->attachments[i]) { - surf = zink_csurface(attachments[i]); - /* no ref! */ - fb->surfaces[i] = attachments[i]; - num_attachments++; - util_dynarray_append(&surf->framebuffer_refs, struct zink_framebuffer*, fb); - } else { - surf = zink_csurface(ctx->dummy_surface[util_logbase2_ceil(state->samples+1)]); - state->attachments[i] = surf->image_view; - } - } - pipe_reference_init(&fb->reference, 1 + num_attachments); - - if (!_mesa_hash_table_init(&fb->objects, fb, _mesa_hash_pointer, _mesa_key_pointer_equal)) - goto fail; - memcpy(&fb->state, state, sizeof(struct zink_framebuffer_state)); - - return fb; -fail: - zink_destroy_framebuffer(screen, fb); - return NULL; -} - void debug_describe_zink_framebuffer(char* buf, const struct zink_framebuffer *ptr) { sprintf(buf, "zink_framebuffer"); } - -struct zink_framebuffer * -zink_get_framebuffer(struct zink_context *ctx) -{ - struct zink_screen *screen = zink_screen(ctx->base.screen); - - assert(!screen->info.have_KHR_imageless_framebuffer); - - struct pipe_surface *attachments[2 * (PIPE_MAX_COLOR_BUFS + 1)] = {0}; - const unsigned cresolve_offset = ctx->fb_state.nr_cbufs + !!ctx->fb_state.zsbuf; - unsigned num_resolves = 0; - - struct zink_framebuffer_state state = {0}; - if (!zink_use_dummy_attachments(ctx)) { - for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { - struct pipe_surface *psurf = ctx->fb_state.cbufs[i]; - if (psurf) { - struct zink_surface *surf = zink_csurface(psurf); - struct zink_surface *transient = zink_transient_surface(psurf); - if (transient) { - state.attachments[i] = transient->image_view; - state.attachments[cresolve_offset + i] = surf->image_view; - attachments[cresolve_offset + i] = psurf; - psurf = &transient->base; - num_resolves++; - } else { - state.attachments[i] = surf->image_view; - } - } else { - state.attachments[i] = VK_NULL_HANDLE; - } - attachments[i] = psurf; - } - } - - state.num_attachments = ctx->fb_state.nr_cbufs; - const unsigned zsresolve_offset = cresolve_offset + num_resolves; - if (ctx->fb_state.zsbuf) { - struct pipe_surface *psurf = ctx->fb_state.zsbuf; - if (psurf) { - struct zink_surface *surf = zink_csurface(psurf); - struct zink_surface *transient = zink_transient_surface(psurf); - if (transient) { - state.attachments[state.num_attachments] = transient->image_view; - state.attachments[zsresolve_offset] = surf->image_view; - attachments[zsresolve_offset] = psurf; - psurf = &transient->base; - num_resolves++; - } else { - state.attachments[state.num_attachments] = surf->image_view; - } - } else { - state.attachments[state.num_attachments] = VK_NULL_HANDLE; - } - attachments[state.num_attachments++] = psurf; - } - - /* avoid bitfield explosion */ - assert(state.num_attachments + num_resolves < 16); - state.num_attachments += num_resolves; - state.width = MAX2(ctx->fb_state.width, 1); - state.height = MAX2(ctx->fb_state.height, 1); - state.layers = MAX2(util_framebuffer_get_num_layers(&ctx->fb_state), 1) - 1; - state.samples = ctx->fb_state.samples - 1; - - struct zink_framebuffer *fb; - simple_mtx_lock(&screen->framebuffer_mtx); - struct hash_entry *entry = _mesa_hash_table_search(&screen->framebuffer_cache, &state); - if (entry) { - fb = (void*)entry->data; - struct zink_framebuffer *fb_ref = NULL; - /* this gains 1 ref every time we reuse it */ - zink_framebuffer_reference(screen, &fb_ref, fb); - } else { - /* this adds 1 extra ref on creation because all newly-created framebuffers are - * going to be bound; necessary to handle framebuffers which have no "real" attachments - * and are only using null surfaces since the only ref they get is the extra one here - */ - fb = create_framebuffer(ctx, &state, attachments); - _mesa_hash_table_insert(&screen->framebuffer_cache, &fb->state, fb); - } - simple_mtx_unlock(&screen->framebuffer_mtx); - - return fb; -} diff --git a/src/gallium/drivers/zink/zink_framebuffer.h b/src/gallium/drivers/zink/zink_framebuffer.h index 4fb8bf67b90..669d3e7b2f4 100644 --- a/src/gallium/drivers/zink/zink_framebuffer.h +++ b/src/gallium/drivers/zink/zink_framebuffer.h @@ -61,8 +61,6 @@ struct zink_framebuffer { struct hash_table objects; }; -void -zink_init_framebuffer(struct zink_screen *screen, struct zink_framebuffer *fb, struct zink_render_pass *rp); void zink_init_framebuffer_imageless(struct zink_screen *screen, struct zink_framebuffer *fb, struct zink_render_pass *rp); @@ -92,7 +90,4 @@ zink_framebuffer_reference(struct zink_screen *screen, struct zink_framebuffer * zink_get_framebuffer_imageless(struct zink_context *ctx); - -struct zink_framebuffer * -zink_get_framebuffer(struct zink_context *ctx); #endif diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index fc16d75ebea..2abbef81df6 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -138,20 +138,6 @@ zink_get_device_uuid(struct pipe_screen *pscreen, char *uuid) } } -static uint32_t -hash_framebuffer_state(const void *key) -{ - struct zink_framebuffer_state* s = (struct zink_framebuffer_state*)key; - return _mesa_hash_data(key, offsetof(struct zink_framebuffer_state, attachments) + sizeof(s->attachments[0]) * s->num_attachments); -} - -static bool -equals_framebuffer_state(const void *a, const void *b) -{ - struct zink_framebuffer_state *s = (struct zink_framebuffer_state*)a; - return memcmp(a, b, offsetof(struct zink_framebuffer_state, attachments) + sizeof(s->attachments[0]) * s->num_attachments) == 0; -} - static VkDeviceSize get_video_mem(struct zink_screen *screen) { @@ -1220,14 +1206,6 @@ zink_destroy_screen(struct pipe_screen *pscreen) VKSCR(DestroyDebugUtilsMessengerEXT)(screen->instance, screen->debugUtilsCallbackHandle, NULL); } - if (!screen->info.have_KHR_imageless_framebuffer) { - hash_table_foreach(&screen->framebuffer_cache, entry) { - struct zink_framebuffer* fb = (struct zink_framebuffer*)entry->data; - zink_destroy_framebuffer(screen, fb); - } - simple_mtx_destroy(&screen->framebuffer_mtx); - } - u_transfer_helper_destroy(pscreen->transfer_helper); #ifdef ENABLE_SHADER_CACHE if (screen->disk_cache) { @@ -2238,11 +2216,6 @@ zink_internal_create_screen(const struct pipe_screen_config *config) screen->resizable_bar = true; } - if (!screen->info.have_KHR_imageless_framebuffer) { - simple_mtx_init(&screen->framebuffer_mtx, mtx_plain); - _mesa_hash_table_init(&screen->framebuffer_cache, screen, hash_framebuffer_state, equals_framebuffer_state); - } - simple_mtx_init(&screen->dt_lock, mtx_plain); zink_screen_init_descriptor_funcs(screen, false); diff --git a/src/gallium/drivers/zink/zink_surface.c b/src/gallium/drivers/zink/zink_surface.c index 6cf98a5e337..bdacaf60e32 100644 --- a/src/gallium/drivers/zink/zink_surface.c +++ b/src/gallium/drivers/zink/zink_surface.c @@ -336,8 +336,6 @@ zink_destroy_surface(struct zink_screen *screen, struct pipe_surface *psurface) _mesa_hash_table_remove(&res->surface_cache, he); simple_mtx_unlock(&res->surface_mtx); } - if (!screen->info.have_KHR_imageless_framebuffer) - surface_clear_fb_refs(screen, psurface); zink_descriptor_set_refs_clear(&surface->desc_set_refs, surface); util_dynarray_fini(&surface->framebuffer_refs); if (surface->simage_view)