intel/blorp: Handle clearing compressed surfaces
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 10 Aug 2017 17:44:15 +0000 (10:44 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 21 Sep 2017 00:21:06 +0000 (17:21 -0700)
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/intel/blorp/blorp_clear.c

index 94eba7ba783da7f43fd80595f26afd79fd0bd941..cd83fa13cafc1a9b84c7abde12b22da2b1c082b2 100644 (file)
@@ -446,14 +446,24 @@ blorp_clear(struct blorp_batch *batch,
       if (batch->blorp->isl_dev->info->gen == 4 &&
           (params.dst.surf.usage & ISL_SURF_USAGE_CUBE_BIT)) {
          blorp_surf_convert_to_single_slice(batch->blorp->isl_dev, &params.dst);
+      }
+
+      if (isl_format_is_compressed(params.dst.surf.format)) {
+         blorp_surf_convert_to_uncompressed(batch->blorp->isl_dev, &params.dst,
+                                            NULL, NULL, NULL, NULL);
+                                            //&dst_x, &dst_y, &dst_w, &dst_h);
+      }
 
-         if (params.dst.tile_x_sa || params.dst.tile_y_sa) {
-            /* This is gen4 so there is no multisampling and sa == px. */
-            params.x0 += params.dst.tile_x_sa;
-            params.y0 += params.dst.tile_y_sa;
-            params.x1 += params.dst.tile_x_sa;
-            params.y1 += params.dst.tile_y_sa;
-         }
+      if (params.dst.tile_x_sa || params.dst.tile_y_sa) {
+         /* Either we're on gen4 where there is no multisampling or the
+          * surface is compressed which also implies no multisampling.
+          * Therefore, sa == px and we don't need to do a conversion.
+          */
+         assert(params.dst.surf.samples == 1);
+         params.x0 += params.dst.tile_x_sa;
+         params.y0 += params.dst.tile_y_sa;
+         params.x1 += params.dst.tile_x_sa;
+         params.y1 += params.dst.tile_y_sa;
       }
 
       params.num_samples = params.dst.surf.samples;