intel: fix copying to compressed images

Each 4x4 block of a compressed image is represented by a pixel.  The width and
height need to be divided by 4.
diff --git a/icd/intel/cmd_meta.c b/icd/intel/cmd_meta.c
index 6627c84..f383fad 100644
--- a/icd/intel/cmd_meta.c
+++ b/icd/intel/cmd_meta.c
@@ -177,6 +177,35 @@
     memcpy(meta->dst.surface, rt->cmd, sizeof(rt->cmd[0]) * rt->cmd_len);
     meta->dst.surface_len = rt->cmd_len;
 
+    /* adjust width/height */
+    if (icd_format_is_compressed(img->layout.format)) {
+        XGL_INT w, h;
+
+        if (cmd_gen(cmd) >= INTEL_GEN(7)) {
+            w = GEN_EXTRACT(meta->dst.surface[2], GEN7_SURFACE_DW2_WIDTH);
+            h = GEN_EXTRACT(meta->dst.surface[2], GEN7_SURFACE_DW2_HEIGHT);
+            meta->dst.surface[2] &= ~(GEN7_SURFACE_DW2_WIDTH__MASK |
+                                      GEN7_SURFACE_DW2_HEIGHT__MASK);
+        } else {
+            w = GEN_EXTRACT(meta->dst.surface[2], GEN6_SURFACE_DW2_WIDTH);
+            h = GEN_EXTRACT(meta->dst.surface[2], GEN6_SURFACE_DW2_HEIGHT);
+            meta->dst.surface[2] &= ~(GEN6_SURFACE_DW2_WIDTH__MASK |
+                                      GEN6_SURFACE_DW2_HEIGHT__MASK);
+        }
+
+        /* note that the width/height fields have the real values minus 1 */
+        w = (w + img->layout.block_width) / img->layout.block_width - 1;
+        h = (h + img->layout.block_height) / img->layout.block_height - 1;
+
+        if (cmd_gen(cmd) >= INTEL_GEN(7)) {
+            meta->dst.surface[2] |= GEN_SHIFT32(w, GEN7_SURFACE_DW2_WIDTH) |
+                                    GEN_SHIFT32(h, GEN7_SURFACE_DW2_HEIGHT);
+        } else {
+            meta->dst.surface[2] |= GEN_SHIFT32(w, GEN6_SURFACE_DW2_WIDTH) |
+                                    GEN_SHIFT32(h, GEN6_SURFACE_DW2_HEIGHT);
+        }
+    }
+
     meta->dst.reloc_target = (intptr_t) img->obj.mem->bo;
     meta->dst.reloc_offset = 0;
     meta->dst.reloc_flags = INTEL_RELOC_WRITE;