ilo: update ilo_dsa_state and related functions for Gen8
authorChia-I Wu <olvaffe@gmail.com>
Mon, 26 Jan 2015 07:28:15 +0000 (15:28 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Wed, 11 Feb 2015 23:56:12 +0000 (07:56 +0800)
src/gallium/drivers/ilo/ilo_builder_3d_bottom.h
src/gallium/drivers/ilo/ilo_state.h
src/gallium/drivers/ilo/ilo_state_3d_bottom.c

index 9370a6a862b76b7903b85f6ae67f5bf7e7faf158..fd82d0456836fa7ea52fe87d1497df746a5da248 100644 (file)
@@ -558,6 +558,25 @@ gen7_hiz_3DSTATE_WM(struct ilo_builder *builder, uint32_t hiz_op)
    dw[2] = 0;
 }
 
+static inline void
+gen8_3DSTATE_WM_DEPTH_STENCIL(struct ilo_builder *builder,
+                              const struct ilo_dsa_state *dsa)
+{
+   const uint8_t cmd_len = 3;
+   uint32_t dw1, dw2, *dw;
+
+   ILO_DEV_ASSERT(builder->dev, 8, 8);
+
+   dw1 = dsa->payload[0];
+   dw2 = dsa->payload[1];
+
+   ilo_builder_batch_pointer(builder, cmd_len, &dw);
+
+   dw[0] = GEN8_RENDER_CMD(3D, 3DSTATE_WM_DEPTH_STENCIL) | (cmd_len - 2);
+   dw[1] = dw1;
+   dw[2] = dw2;
+}
+
 static inline void
 gen7_3DSTATE_PS(struct ilo_builder *builder,
                 const struct ilo_shader_state *fs,
index 9334ae7154d57e8dfda672780c9d86f985647d4f..e935e5d5b785822bce864dbcac708e009807b205 100644 (file)
@@ -247,7 +247,7 @@ struct ilo_rasterizer_state {
 };
 
 struct ilo_dsa_state {
-   /* DEPTH_STENCIL_STATE */
+   /* DEPTH_STENCIL_STATE or Gen8+ 3DSTATE_WM_DEPTH_STENCIL */
    uint32_t payload[3];
 
    uint32_t dw_alpha;
index bd4e1149fc6ff29f8f530bdf78e63ad52509bd9f..b309c9477701a68b7c22f72781b48e10a07b37ce 100644 (file)
@@ -1710,6 +1710,39 @@ dsa_get_stencil_enable_gen6(const struct ilo_dev_info *dev,
    return dw;
 }
 
+static uint32_t
+dsa_get_stencil_enable_gen8(const struct ilo_dev_info *dev,
+                            const struct pipe_stencil_state *stencil0,
+                            const struct pipe_stencil_state *stencil1)
+{
+   uint32_t dw;
+
+   ILO_DEV_ASSERT(dev, 8, 8);
+
+   if (!stencil0->enabled)
+      return 0;
+
+   dw = gen6_translate_pipe_stencil_op(stencil0->fail_op) << 29 |
+        gen6_translate_pipe_stencil_op(stencil0->zfail_op) << 26 |
+        gen6_translate_pipe_stencil_op(stencil0->zpass_op) << 23 |
+        gen6_translate_dsa_func(stencil0->func) << 8 |
+        GEN8_ZS_DW1_STENCIL_TEST_ENABLE;
+   if (stencil0->writemask)
+      dw |= GEN8_ZS_DW1_STENCIL_WRITE_ENABLE;
+
+   if (stencil1->enabled) {
+      dw |= gen6_translate_dsa_func(stencil1->func) << 20 |
+            gen6_translate_pipe_stencil_op(stencil1->fail_op) << 17 |
+            gen6_translate_pipe_stencil_op(stencil1->zfail_op) << 14 |
+            gen6_translate_pipe_stencil_op(stencil1->zpass_op) << 11 |
+            GEN8_ZS_DW1_STENCIL1_ENABLE;
+      if (stencil1->writemask)
+         dw |= GEN8_ZS_DW1_STENCIL_WRITE_ENABLE;
+   }
+
+   return dw;
+}
+
 static uint32_t
 dsa_get_depth_enable_gen6(const struct ilo_dev_info *dev,
                           const struct pipe_depth_state *state)
@@ -1744,13 +1777,34 @@ dsa_get_depth_enable_gen6(const struct ilo_dev_info *dev,
    return dw;
 }
 
+static uint32_t
+dsa_get_depth_enable_gen8(const struct ilo_dev_info *dev,
+                          const struct pipe_depth_state *state)
+{
+   uint32_t dw;
+
+   ILO_DEV_ASSERT(dev, 8, 8);
+
+   if (state->enabled) {
+      dw = GEN8_ZS_DW1_DEPTH_TEST_ENABLE |
+           gen6_translate_dsa_func(state->func) << 5;
+   } else {
+      dw = GEN6_COMPAREFUNCTION_ALWAYS << 5;
+   }
+
+   if (state->writemask)
+      dw |= GEN8_ZS_DW1_DEPTH_WRITE_ENABLE;
+
+   return dw;
+}
+
 static uint32_t
 dsa_get_alpha_enable_gen6(const struct ilo_dev_info *dev,
                           const struct pipe_alpha_state *state)
 {
    uint32_t dw;
 
-   ILO_DEV_ASSERT(dev, 6, 7.5);
+   ILO_DEV_ASSERT(dev, 6, 8);
 
    if (!state->enabled)
       return 0;
@@ -1767,17 +1821,27 @@ ilo_gpe_init_dsa(const struct ilo_dev_info *dev,
                  const struct pipe_depth_stencil_alpha_state *state,
                  struct ilo_dsa_state *dsa)
 {
-   ILO_DEV_ASSERT(dev, 6, 7.5);
+   ILO_DEV_ASSERT(dev, 6, 8);
 
    STATIC_ASSERT(Elements(dsa->payload) >= 3);
 
-   dsa->payload[0] = dsa_get_stencil_enable_gen6(dev,
-         &state->stencil[0], &state->stencil[1]);
+   if (ilo_dev_gen(dev) >= ILO_GEN(8)) {
+      const uint32_t dw_stencil = dsa_get_stencil_enable_gen8(dev,
+            &state->stencil[0], &state->stencil[1]);
+      const uint32_t dw_depth = dsa_get_depth_enable_gen8(dev, &state->depth);
+
+      assert(!(dw_stencil & dw_depth));
+      dsa->payload[0] = dw_stencil | dw_depth;
+   } else {
+      dsa->payload[0] = dsa_get_stencil_enable_gen6(dev,
+            &state->stencil[0], &state->stencil[1]);
+      dsa->payload[2] = dsa_get_depth_enable_gen6(dev, &state->depth);
+   }
+
    dsa->payload[1] = state->stencil[0].valuemask << 24 |
                      state->stencil[0].writemask << 16 |
                      state->stencil[1].valuemask << 8 |
                      state->stencil[1].writemask;
-   dsa->payload[2] = dsa_get_depth_enable_gen6(dev, &state->depth);
 
    dsa->dw_alpha = dsa_get_alpha_enable_gen6(dev, &state->alpha);
    dsa->alpha_ref = float_to_ubyte(state->alpha.ref_value);