From c31a7f529fadc016786eedc35ce65802a915ce09 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 7 Sep 2016 12:40:39 -0700 Subject: vc4: Always unref the current job surfaces at job reset time. Drops some tricky logic in vc4_flush() trying to update the pointers, and fixes a broken lack of unref for MSAA surfaces at context destroy time. --- src/gallium/drivers/vc4/vc4_blit.c | 13 ++++-------- src/gallium/drivers/vc4/vc4_context.c | 37 ++++++++++------------------------- src/gallium/drivers/vc4/vc4_job.c | 7 +++++++ 3 files changed, 21 insertions(+), 36 deletions(-) diff --git a/src/gallium/drivers/vc4/vc4_blit.c b/src/gallium/drivers/vc4/vc4_blit.c index c37354425b6..ee08ab8c0f3 100644 --- a/src/gallium/drivers/vc4/vc4_blit.c +++ b/src/gallium/drivers/vc4/vc4_blit.c @@ -132,15 +132,10 @@ vc4_tile_blit(struct pipe_context *pctx, const struct pipe_blit_info *info) vc4_get_blit_surface(pctx, info->src.resource, info->src.level); pipe_surface_reference(&vc4->color_read, src_surf); - pipe_surface_reference(&vc4->color_write, - dst_surf->texture->nr_samples > 1 ? - NULL : dst_surf); - pipe_surface_reference(&vc4->msaa_color_write, - dst_surf->texture->nr_samples > 1 ? - dst_surf : NULL); - pipe_surface_reference(&vc4->zs_read, NULL); - pipe_surface_reference(&vc4->zs_write, NULL); - pipe_surface_reference(&vc4->msaa_zs_write, NULL); + if (dst_surf->texture->nr_samples > 1) + pipe_surface_reference(&vc4->color_write, dst_surf); + else + pipe_surface_reference(&vc4->msaa_color_write, dst_surf); vc4->draw_min_x = info->dst.box.x; vc4->draw_min_y = info->dst.box.y; diff --git a/src/gallium/drivers/vc4/vc4_context.c b/src/gallium/drivers/vc4/vc4_context.c index e7f63d69735..6f50b97f447 100644 --- a/src/gallium/drivers/vc4/vc4_context.c +++ b/src/gallium/drivers/vc4/vc4_context.c @@ -45,43 +45,29 @@ vc4_flush(struct pipe_context *pctx) struct pipe_surface *zsbuf = vc4->framebuffer.zsbuf; if (cbuf && (vc4->resolve & PIPE_CLEAR_COLOR0)) { - pipe_surface_reference(&vc4->color_write, - cbuf->texture->nr_samples > 1 ? - NULL : cbuf); - pipe_surface_reference(&vc4->msaa_color_write, - cbuf->texture->nr_samples > 1 ? - cbuf : NULL); + if (cbuf->texture->nr_samples > 1) { + pipe_surface_reference(&vc4->msaa_color_write, cbuf); + } else { + pipe_surface_reference(&vc4->color_write, cbuf); + } if (!(vc4->cleared & PIPE_CLEAR_COLOR0)) { pipe_surface_reference(&vc4->color_read, cbuf); - } else { - pipe_surface_reference(&vc4->color_read, NULL); } - } else { - pipe_surface_reference(&vc4->color_write, NULL); - pipe_surface_reference(&vc4->color_read, NULL); - pipe_surface_reference(&vc4->msaa_color_write, NULL); } if (vc4->framebuffer.zsbuf && (vc4->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL))) { - pipe_surface_reference(&vc4->zs_write, - zsbuf->texture->nr_samples > 1 ? - NULL : zsbuf); - pipe_surface_reference(&vc4->msaa_zs_write, - zsbuf->texture->nr_samples > 1 ? - zsbuf : NULL); + if (zsbuf->texture->nr_samples > 1) { + pipe_surface_reference(&vc4->msaa_zs_write, zsbuf); + } else { + pipe_surface_reference(&vc4->zs_write, zsbuf); + } if (!(vc4->cleared & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL))) { pipe_surface_reference(&vc4->zs_read, zsbuf); - } else { - pipe_surface_reference(&vc4->zs_read, NULL); } - } else { - pipe_surface_reference(&vc4->zs_write, NULL); - pipe_surface_reference(&vc4->zs_read, NULL); - pipe_surface_reference(&vc4->msaa_zs_write, NULL); } vc4_job_submit(vc4); @@ -182,9 +168,6 @@ vc4_context_destroy(struct pipe_context *pctx) pipe_surface_reference(&vc4->framebuffer.cbufs[0], NULL); pipe_surface_reference(&vc4->framebuffer.zsbuf, NULL); - pipe_surface_reference(&vc4->color_write, NULL); - pipe_surface_reference(&vc4->color_read, NULL); - vc4_program_fini(pctx); ralloc_free(vc4); diff --git a/src/gallium/drivers/vc4/vc4_job.c b/src/gallium/drivers/vc4/vc4_job.c index e71f6f4cf91..a95768958db 100644 --- a/src/gallium/drivers/vc4/vc4_job.c +++ b/src/gallium/drivers/vc4/vc4_job.c @@ -70,6 +70,13 @@ vc4_job_reset(struct vc4_context *vc4) vc4->draw_min_y = ~0; vc4->draw_max_x = 0; vc4->draw_max_y = 0; + + pipe_surface_reference(&vc4->color_write, NULL); + pipe_surface_reference(&vc4->color_read, NULL); + pipe_surface_reference(&vc4->msaa_color_write, NULL); + pipe_surface_reference(&vc4->zs_write, NULL); + pipe_surface_reference(&vc4->zs_read, NULL); + pipe_surface_reference(&vc4->msaa_zs_write, NULL); } static void -- cgit v1.2.3