intel: create intel_ds_state for depth/stencil clears

It controls whether depth, stencil, or both are cleared.
diff --git a/icd/intel/cmd_meta.c b/icd/intel/cmd_meta.c
index 2ea964e..5d3114d 100644
--- a/icd/intel/cmd_meta.c
+++ b/icd/intel/cmd_meta.c
@@ -27,6 +27,7 @@
 
 #include "img.h"
 #include "mem.h"
+#include "state.h"
 #include "cmd_priv.h"
 
 static void cmd_meta_init_mem_view(struct intel_cmd *cmd,
@@ -204,10 +205,10 @@
     meta->src.reloc_flags = INTEL_CMD_RELOC_TARGET_IS_WRITER;
 }
 
-static void cmd_meta_set_ds(struct intel_cmd *cmd,
-                            const struct intel_img *img,
-                            XGL_UINT lod, XGL_UINT layer,
-                            struct intel_cmd_meta *meta)
+static void cmd_meta_set_ds_view(struct intel_cmd *cmd,
+                                 const struct intel_img *img,
+                                 XGL_UINT lod, XGL_UINT layer,
+                                 struct intel_cmd_meta *meta)
 {
     XGL_DEPTH_STENCIL_VIEW_CREATE_INFO info;
     struct intel_ds_view *ds;
@@ -226,7 +227,43 @@
         return;
     }
 
-    meta->ds = ds;
+    meta->ds.view = ds;
+}
+
+static void cmd_meta_set_ds_state(struct intel_cmd *cmd,
+                                  XGL_IMAGE_ASPECT aspect,
+                                  XGL_UINT32 stencil_ref,
+                                  struct intel_cmd_meta *meta)
+{
+    XGL_DEPTH_STENCIL_STATE_CREATE_INFO info;
+    struct intel_ds_state *state;
+    XGL_RESULT ret;
+
+    memset(&info, 0, sizeof(info));
+    info.sType = XGL_STRUCTURE_TYPE_DEPTH_STENCIL_STATE_CREATE_INFO;
+
+    if (aspect == XGL_IMAGE_ASPECT_DEPTH) {
+        info.depthWriteEnable = XGL_TRUE;
+    }
+    else if (aspect == XGL_IMAGE_ASPECT_STENCIL) {
+        info.stencilTestEnable = XGL_TRUE;
+        info.stencilReadMask = 0xff;
+        info.stencilWriteMask = 0xff;
+        info.front.stencilFailOp = XGL_STENCIL_OP_KEEP;
+        info.front.stencilPassOp = XGL_STENCIL_OP_REPLACE;
+        info.front.stencilDepthFailOp = XGL_STENCIL_OP_KEEP;
+        info.front.stencilFunc = XGL_COMPARE_ALWAYS;
+        info.front.stencilRef = stencil_ref;
+        info.back = info.front;
+    }
+
+    ret = intel_ds_state_create(cmd->dev, &info, &state);
+    if (ret != XGL_SUCCESS) {
+        cmd->result = ret;
+        return;
+    }
+
+    meta->ds.state = state;
 }
 
 static enum intel_dev_meta_shader get_shader_id(const struct intel_dev *dev,
@@ -677,12 +714,15 @@
 
                 cmd_draw_meta(cmd, meta);
             } else {
-                cmd_meta_set_ds(cmd, img, meta->dst.lod,
+                cmd_meta_set_ds_view(cmd, img, meta->dst.lod,
                         meta->dst.layer, meta);
+                cmd_meta_set_ds_state(cmd, range->aspect,
+                        meta->clear_val[1], meta);
 
                 cmd_draw_meta(cmd, meta);
 
-                intel_ds_view_destroy(meta->ds);
+                intel_ds_view_destroy(meta->ds.view);
+                intel_ds_state_destroy(meta->ds.state);
             }
 
             meta->dst.layer++;
@@ -767,14 +807,12 @@
     meta.shader_id = INTEL_DEV_META_FS_CLEAR_DEPTH;
     meta.samples = img->samples;
 
+    meta.clear_val[0] = u_fui(depth);
+    meta.clear_val[1] = stencil;
+
     for (i = 0; i < rangeCount; i++) {
         const XGL_IMAGE_SUBRESOURCE_RANGE *range = &pRanges[i];
 
-        if (range->aspect == XGL_IMAGE_ASPECT_STENCIL)
-            meta.clear_val[0] = stencil;
-        else
-            meta.clear_val[0] = u_fui(depth);
-
         cmd_meta_clear_image(cmd, img, img->layout.format,
                 &meta, range);
     }