freedreno/a6xx: Support y-inverted blits
authorKristian H. Kristensen <hoegsberg@chromium.org>
Thu, 7 Feb 2019 23:35:07 +0000 (15:35 -0800)
committerKristian H. Kristensen <hoegsberg@chromium.org>
Mon, 11 Feb 2019 20:26:21 +0000 (12:26 -0800)
The src coordinates are s24.8. For an inverted blit that ends at y=0
we need to program -1 for sy2, so we need to handle negative values
correctly.

Fixes

  dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag_reverse_dst_y
  dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_dst_y
  dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_src_y
  dEQP-GLES3.functional.fbo.invalidate.sub.unbind_blit_color
  dEQP-GLES3.functional.fbo.invalidate.whole.unbind_blit_color

Reviewed-by: Rob Clark <robdclark@gmail.com>
Signed-off-by: Kristian H. Kristensen <hoegsberg@chromium.org>
src/gallium/drivers/freedreno/a6xx/fd6_blitter.c

index 0a741acf1d82c69095c143f3df67e893c1178a10..08fbe4b70579df9f803d2a2bc70174d8a5e82fd8 100644 (file)
@@ -114,9 +114,6 @@ can_do_blit(const struct pipe_blit_info *info)
        fail_if(util_format_is_compressed(info->src.format) &&
                        info->src.format != info->dst.format);
 
-       /* src box can be inverted, which we don't support.. dst box cannot: */
-       fail_if((info->src.box.width < 0) || (info->src.box.height < 0));
-
        fail_if(!ok_dims(info->src.resource, &info->src.box, info->src.level));
 
        fail_if(!ok_dims(info->dst.resource, &info->dst.box, info->dst.level));
@@ -347,8 +344,8 @@ emit_blit_texture(struct fd_ringbuffer *ring, const struct pipe_blit_info *info)
        enum a6xx_tile_mode stile, dtile;
        enum a3xx_color_swap sswap, dswap;
        unsigned spitch, dpitch;
-       unsigned sx1, sy1, sx2, sy2;
-       unsigned dx1, dy1, dx2, dy2;
+       int sx1, sy1, sx2, sy2;
+       int dx1, dy1, dx2, dy2;
 
        if (DEBUG_BLIT_FALLBACK) {
                fprintf(stderr, "texture blit: ");