freedreno/a6xx: fix blitter crash
authorRob Clark <robdclark@gmail.com>
Mon, 10 Dec 2018 15:40:31 +0000 (10:40 -0500)
committerRob Clark <robdclark@gmail.com>
Thu, 13 Dec 2018 20:51:01 +0000 (15:51 -0500)
Fixes a crash with unsupported formats in dEQP-GLES3.functional.texture.format.sized.2d.rgb9_e5_pot

Also fixes gpu hangs with some formats that are supported, but which we
don't know what internal-format to use for the blitter, for ex
dEQP-GLES3.functional.texture.format.sized.2d_array.rgb10_a2_pot

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/a6xx/fd6_blitter.c

index 13a5e4afb436b3d1167ca36a2ebef19502b5a5ad..456aedd29d34dd3cbdc3a81a42ee776b73da1f04 100644 (file)
@@ -52,6 +52,19 @@ ok_dims(const struct pipe_resource *r, const struct pipe_box *b, int lvl)
                (b->z >= 0) && (b->z + b->depth <= last_layer);
 }
 
+static bool
+ok_format(enum pipe_format pfmt)
+{
+       enum a6xx_color_fmt fmt = fd6_pipe2color(pfmt);
+       if (fmt == ~0)
+               return false;
+
+       if (fd6_ifmt(fmt) == 0)
+               return false;
+
+       return true;
+}
+
 #define DEBUG_BLIT_FALLBACK 0
 #define fail_if(cond)                                                                                                  \
        do {                                                                                                                            \
@@ -81,6 +94,10 @@ can_do_blit(const struct pipe_blit_info *info)
        fail_if(util_format_is_compressed(info->src.format) !=
                        util_format_is_compressed(info->src.format));
 
+       /* Fail if unsupported format: */
+       fail_if(!ok_format(info->src.format));
+       fail_if(!ok_format(info->dst.format));
+
        /* ... but only if they're the same compression format. */
        fail_if(util_format_is_compressed(info->src.format) &&
                        info->src.format != info->dst.format);