intel: add cmd_meta_ds_op()

It can perform fast depth clear, depth resolve, and hiz resolve.  There is a
TODO about fast depth clear.

With our current xgl.h revision, I have to assume a layout in
xglCmdClearDepthStencil().  It will get fixed when we are at revision 59.
Alternatively, I could also assume the worst case and always do a depth
resolve after clearing, but that may hurt the performance.

In other words, it is invalid to use XGL_IMAGE_LAYOUT_GENERAL for shadow
textures.
diff --git a/icd/intel/cmd_meta.c b/icd/intel/cmd_meta.c
index fdf5289..3109823 100644
--- a/icd/intel/cmd_meta.c
+++ b/icd/intel/cmd_meta.c
@@ -840,9 +840,14 @@
         meta->dst.lod = range->baseMipLevel + i;
         meta->dst.layer = range->baseArraySlice;
 
+        /* TODO INTEL_CMD_META_DS_HIZ_CLEAR requires 8x4 aligned rectangle */
         meta->width = u_minify(img->layout.width0, meta->dst.lod);
         meta->height = u_minify(img->layout.height0, meta->dst.lod);
 
+        if (meta->ds.op != INTEL_CMD_META_DS_NOP &&
+            !intel_img_can_enable_hiz(img, meta->dst.lod))
+            continue;
+
         for (j = 0; j < array_size; j++) {
             if (range->aspect == XGL_IMAGE_ASPECT_COLOR) {
                 cmd_meta_set_dst_for_img(cmd, img, format,
@@ -865,6 +870,29 @@
     }
 }
 
+void cmd_meta_ds_op(struct intel_cmd *cmd,
+                    enum intel_cmd_meta_ds_op op,
+                    struct intel_img *img,
+                    const XGL_IMAGE_SUBRESOURCE_RANGE *range)
+{
+    struct intel_cmd_meta meta;
+
+    if (img->layout.aux != INTEL_LAYOUT_AUX_HIZ)
+        return;
+    if (range->aspect != XGL_IMAGE_ASPECT_DEPTH)
+        return;
+
+    memset(&meta, 0, sizeof(meta));
+    meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
+    meta.samples = img->samples;
+
+    meta.ds.aspect = XGL_IMAGE_ASPECT_DEPTH;
+    meta.ds.op = op;
+    meta.ds.optimal = true;
+
+    cmd_meta_clear_image(cmd, img, img->layout.format, &meta, range);
+}
+
 ICD_EXPORT void XGLAPI xglCmdClearColorImage(
     XGL_CMD_BUFFER                              cmdBuffer,
     XGL_IMAGE                                   image,
@@ -942,6 +970,9 @@
     meta.clear_val[0] = u_fui(depth);
     meta.clear_val[1] = stencil;
 
+    /* assume optimal DS until revision 59 */
+    meta.ds.optimal = true;
+
     for (i = 0; i < rangeCount; i++) {
         const XGL_IMAGE_SUBRESOURCE_RANGE *range = &pRanges[i];