zink: rework framebuffer state
we don't want to actually be tracking any null surfaces, so instead use the vk object for this purpose also store the fb state onto the fb object so we have this info available at all times Reviewed-by: Adam Jackson <ajax@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8227>
This commit is contained in:
parent
39a2da738d
commit
448c85acfc
|
@ -706,19 +706,21 @@ static struct zink_framebuffer *
|
|||
create_framebuffer(struct zink_context *ctx)
|
||||
{
|
||||
struct zink_screen *screen = zink_screen(ctx->base.screen);
|
||||
struct pipe_surface *attachments[PIPE_MAX_COLOR_BUFS + 1] = {};
|
||||
|
||||
struct zink_framebuffer_state state = {};
|
||||
state.rp = get_render_pass(ctx);
|
||||
for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) {
|
||||
struct pipe_surface *psurf = ctx->fb_state.cbufs[i];
|
||||
state.attachments[i] = zink_surface(psurf);
|
||||
state.has_null_attachments |= !state.attachments[i];
|
||||
state.attachments[i] = psurf ? zink_surface(psurf)->image_view : VK_NULL_HANDLE;
|
||||
attachments[i] = psurf;
|
||||
}
|
||||
|
||||
state.num_attachments = ctx->fb_state.nr_cbufs;
|
||||
if (ctx->fb_state.zsbuf) {
|
||||
struct pipe_surface *psurf = ctx->fb_state.zsbuf;
|
||||
state.attachments[state.num_attachments++] = zink_surface(psurf);
|
||||
state.attachments[state.num_attachments] = psurf ? zink_surface(psurf)->image_view : VK_NULL_HANDLE;;
|
||||
attachments[state.num_attachments++] = psurf;
|
||||
}
|
||||
|
||||
state.width = MAX2(ctx->fb_state.width, 1);
|
||||
|
@ -726,7 +728,7 @@ create_framebuffer(struct zink_context *ctx)
|
|||
state.layers = MAX2(util_framebuffer_get_num_layers(&ctx->fb_state), 1);
|
||||
state.samples = ctx->fb_state.samples;
|
||||
|
||||
return zink_create_framebuffer(ctx, screen, &state);
|
||||
return zink_create_framebuffer(ctx, screen, &state, attachments);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -76,7 +76,8 @@ zink_destroy_framebuffer(struct zink_screen *screen,
|
|||
|
||||
struct zink_framebuffer *
|
||||
zink_create_framebuffer(struct zink_context *ctx, struct zink_screen *screen,
|
||||
struct zink_framebuffer_state *fb)
|
||||
struct zink_framebuffer_state *fb,
|
||||
struct pipe_surface **attachments)
|
||||
{
|
||||
struct zink_framebuffer *fbuf = CALLOC_STRUCT(zink_framebuffer);
|
||||
if (!fbuf)
|
||||
|
@ -84,16 +85,14 @@ zink_create_framebuffer(struct zink_context *ctx, struct zink_screen *screen,
|
|||
|
||||
pipe_reference_init(&fbuf->reference, 1);
|
||||
|
||||
if (fb->has_null_attachments)
|
||||
fbuf->null_surface = framebuffer_null_surface_init(ctx, fb);
|
||||
|
||||
VkImageView attachments[ARRAY_SIZE(fb->attachments)] = {};
|
||||
for (int i = 0; i < fb->num_attachments; i++) {
|
||||
struct zink_surface *surf = fb->attachments[i];
|
||||
if (!surf)
|
||||
surf = zink_surface(fbuf->null_surface);
|
||||
pipe_surface_reference(fbuf->surfaces + i, &surf->base);
|
||||
attachments[i] = surf->image_view;
|
||||
if (fb->attachments[i])
|
||||
pipe_surface_reference(&fbuf->surfaces[i], attachments[i]);
|
||||
else {
|
||||
if (!fbuf->null_surface)
|
||||
fbuf->null_surface = framebuffer_null_surface_init(ctx, fb);
|
||||
fb->attachments[i] = zink_surface(fbuf->null_surface)->image_view;
|
||||
}
|
||||
}
|
||||
|
||||
zink_render_pass_reference(screen, &fbuf->rp, fb->rp);
|
||||
|
@ -102,7 +101,7 @@ zink_create_framebuffer(struct zink_context *ctx, struct zink_screen *screen,
|
|||
fci.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
|
||||
fci.renderPass = fbuf->rp->render_pass;
|
||||
fci.attachmentCount = fb->num_attachments;
|
||||
fci.pAttachments = attachments;
|
||||
fci.pAttachments = fb->attachments;
|
||||
fci.width = fb->width;
|
||||
fci.height = fb->height;
|
||||
fci.layers = fb->layers;
|
||||
|
@ -111,6 +110,7 @@ zink_create_framebuffer(struct zink_context *ctx, struct zink_screen *screen,
|
|||
zink_destroy_framebuffer(screen, fbuf);
|
||||
return NULL;
|
||||
}
|
||||
memcpy(&fbuf->state, fb, sizeof(struct zink_framebuffer_state));
|
||||
|
||||
return fbuf;
|
||||
}
|
||||
|
|
|
@ -39,8 +39,7 @@ struct zink_framebuffer_state {
|
|||
uint16_t height, layers;
|
||||
uint8_t samples;
|
||||
uint8_t num_attachments;
|
||||
struct zink_surface *attachments[PIPE_MAX_COLOR_BUFS + 1];
|
||||
bool has_null_attachments;
|
||||
VkImageView attachments[PIPE_MAX_COLOR_BUFS + 1];
|
||||
};
|
||||
|
||||
struct zink_framebuffer {
|
||||
|
@ -50,11 +49,13 @@ struct zink_framebuffer {
|
|||
struct pipe_surface *surfaces[PIPE_MAX_COLOR_BUFS + 1];
|
||||
struct zink_render_pass *rp;
|
||||
struct pipe_surface *null_surface; /* for use with unbound attachments */
|
||||
struct zink_framebuffer_state state;
|
||||
};
|
||||
|
||||
struct zink_framebuffer *
|
||||
zink_create_framebuffer(struct zink_context *ctx, struct zink_screen *screen,
|
||||
struct zink_framebuffer_state *fb);
|
||||
struct zink_framebuffer_state *fb,
|
||||
struct pipe_surface **attachments);
|
||||
|
||||
void
|
||||
zink_destroy_framebuffer(struct zink_screen *screen,
|
||||
|
|
Loading…
Reference in New Issue