zink: delete all non-imageless framebuffer code

hooray it's finally gone

Acked-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15904>
This commit is contained in:
Mike Blumenkrantz 2022-04-12 14:59:16 -04:00 committed by Marge Bot
parent 0067641d3c
commit fe8212791f
5 changed files with 30 additions and 272 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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

View File

@ -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);

View File

@ -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)