diff options
author | Jonathan Gray <jsg@cvs.openbsd.org> | 2016-05-29 10:22:51 +0000 |
---|---|---|
committer | Jonathan Gray <jsg@cvs.openbsd.org> | 2016-05-29 10:22:51 +0000 |
commit | c9223eed3c16cd3e98a8f56dda953d8f299de0e3 (patch) | |
tree | 53e2a1c3f13bcf6b4ed201d7bc135e7213c94ebe /lib/mesa/src/gallium/drivers/vc4/vc4_blit.c | |
parent | 6e8f2d062ab9c198239b9283b2b7ed12f4ea17d8 (diff) |
Import Mesa 11.2.2
Diffstat (limited to 'lib/mesa/src/gallium/drivers/vc4/vc4_blit.c')
-rw-r--r-- | lib/mesa/src/gallium/drivers/vc4/vc4_blit.c | 77 |
1 files changed, 62 insertions, 15 deletions
diff --git a/lib/mesa/src/gallium/drivers/vc4/vc4_blit.c b/lib/mesa/src/gallium/drivers/vc4/vc4_blit.c index e52a19417..876c296dc 100644 --- a/lib/mesa/src/gallium/drivers/vc4/vc4_blit.c +++ b/lib/mesa/src/gallium/drivers/vc4/vc4_blit.c @@ -42,46 +42,101 @@ vc4_get_blit_surface(struct pipe_context *pctx, } static bool +is_tile_unaligned(unsigned size, unsigned tile_size) +{ + return size & (tile_size - 1); +} + +static bool vc4_tile_blit(struct pipe_context *pctx, const struct pipe_blit_info *info) { struct vc4_context *vc4 = vc4_context(pctx); + bool old_msaa = vc4->msaa; + int old_tile_width = vc4->tile_width; + int old_tile_height = vc4->tile_height; + bool msaa = (info->src.resource->nr_samples > 1 || + info->dst.resource->nr_samples > 1); + int tile_width = msaa ? 32 : 64; + int tile_height = msaa ? 32 : 64; if (util_format_is_depth_or_stencil(info->dst.resource->format)) return false; + if (info->scissor_enable) + return false; + if ((info->mask & PIPE_MASK_RGBA) == 0) return false; - if (info->dst.box.x != 0 || info->dst.box.y != 0 || - info->src.box.x != 0 || info->src.box.y != 0 || + if (info->dst.box.x != info->src.box.x || + info->dst.box.y != info->src.box.y || info->dst.box.width != info->src.box.width || info->dst.box.height != info->src.box.height) { return false; } + int dst_surface_width = u_minify(info->dst.resource->width0, + info->dst.level); + int dst_surface_height = u_minify(info->dst.resource->height0, + info->dst.level); + if (is_tile_unaligned(info->dst.box.x, tile_width) || + is_tile_unaligned(info->dst.box.y, tile_height) || + (is_tile_unaligned(info->dst.box.width, tile_width) && + info->dst.box.x + info->dst.box.width != dst_surface_width) || + (is_tile_unaligned(info->dst.box.height, tile_height) && + info->dst.box.y + info->dst.box.height != dst_surface_height)) { + return false; + } + if (info->dst.resource->format != info->src.resource->format) return false; vc4_flush(pctx); + if (false) { + fprintf(stderr, "RCL blit from %d,%d to %d,%d (%d,%d)\n", + info->src.box.x, + info->src.box.y, + info->dst.box.x, + info->dst.box.y, + info->dst.box.width, + info->dst.box.height); + } + struct pipe_surface *dst_surf = vc4_get_blit_surface(pctx, info->dst.resource, info->dst.level); struct pipe_surface *src_surf = 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); + 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); - vc4->draw_min_x = 0; - vc4->draw_min_y = 0; - vc4->draw_max_x = dst_surf->width; - vc4->draw_max_y = dst_surf->height; + pipe_surface_reference(&vc4->msaa_zs_write, NULL); + + vc4->draw_min_x = info->dst.box.x; + vc4->draw_min_y = info->dst.box.y; + vc4->draw_max_x = info->dst.box.x + info->dst.box.width; + vc4->draw_max_y = info->dst.box.y + info->dst.box.height; vc4->draw_width = dst_surf->width; vc4->draw_height = dst_surf->height; + + vc4->tile_width = tile_width; + vc4->tile_height = tile_height; + vc4->msaa = msaa; vc4->needs_flush = true; + vc4_job_submit(vc4); + vc4->msaa = old_msaa; + vc4->tile_width = old_tile_width; + vc4->tile_height = old_tile_height; + pipe_surface_reference(&dst_surf, NULL); pipe_surface_reference(&src_surf, NULL); @@ -131,14 +186,6 @@ vc4_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info) { struct pipe_blit_info info = *blit_info; - if (info.src.resource->nr_samples > 1 && - info.dst.resource->nr_samples <= 1 && - !util_format_is_depth_or_stencil(info.src.resource->format) && - !util_format_is_pure_integer(info.src.resource->format)) { - fprintf(stderr, "color resolve unimplemented\n"); - return; - } - if (vc4_tile_blit(pctx, blit_info)) return; |