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:
parent
0067641d3c
commit
fe8212791f
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue