ilo: convert pipe_rasterizer_state to ilo_rasterizer_wm
authorChia-I Wu <olvaffe@gmail.com>
Fri, 21 Jun 2013 03:36:14 +0000 (11:36 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Tue, 25 Jun 2013 05:17:56 +0000 (13:17 +0800)
Add ilo_gpe_init_rasterizer_wm() to construct fixed-function part of
3DSTATE_WM once in create_rasterizer_state().

src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c
src/gallium/drivers/ilo/ilo_3d_pipeline_gen7.c
src/gallium/drivers/ilo/ilo_gpe.h
src/gallium/drivers/ilo/ilo_gpe_gen6.c
src/gallium/drivers/ilo/ilo_gpe_gen6.h
src/gallium/drivers/ilo/ilo_gpe_gen7.c
src/gallium/drivers/ilo/ilo_gpe_gen7.h

index 72e87d4efa74d0d6b7d32348cee60d76e037c8c4..7721b04bd3257b8907084d924488f5c405692c53 100644 (file)
@@ -676,7 +676,7 @@ gen6_pipeline_wm(struct ilo_3d_pipeline *p,
          gen6_wa_pipe_control_wm_max_threads_stall(p);
 
       p->gen6_3DSTATE_WM(p->dev, fs, num_samplers,
-            &ilo->rasterizer->state, dual_blend, cc_may_kill, p->cp);
+            ilo->rasterizer, dual_blend, cc_may_kill, p->cp);
    }
 }
 
index ed88f465d862ea9610fb9cdd3dc4aea73917d902..20f06d6ebd5b1f9c69a7a7c2d21a9399ca326ac4 100644 (file)
@@ -471,8 +471,7 @@ gen7_pipeline_wm(struct ilo_3d_pipeline *p,
       if (p->dev->gen == ILO_GEN(7) && session->hw_ctx_changed)
          gen7_wa_pipe_control_wm_max_threads_stall(p);
 
-      p->gen7_3DSTATE_WM(p->dev,
-            fs, &ilo->rasterizer->state, cc_may_kill, p->cp);
+      p->gen7_3DSTATE_WM(p->dev, fs, ilo->rasterizer, cc_may_kill, p->cp);
    }
 
    /* 3DSTATE_BINDING_TABLE_POINTERS_PS */
index e9141f7c3af9c6bf02e0bee1cf10dec45ecbced6..f999aaf90abf7bf277c1742781bf9fddb8d80d68 100644 (file)
@@ -125,11 +125,19 @@ struct ilo_rasterizer_sf {
    uint32_t dw_msaa;
 };
 
+struct ilo_rasterizer_wm {
+   /* 3DSTATE_WM */
+   uint32_t payload[2];
+   uint32_t dw_msaa_rast;
+   uint32_t dw_msaa_disp;
+};
+
 struct ilo_rasterizer_state {
    struct pipe_rasterizer_state state;
 
    struct ilo_rasterizer_clip clip;
    struct ilo_rasterizer_sf sf;
+   struct ilo_rasterizer_wm wm;
 };
 
 struct ilo_dsa_state {
@@ -291,6 +299,16 @@ ilo_gpe_init_rasterizer_sf(const struct ilo_dev_info *dev,
                            const struct pipe_rasterizer_state *state,
                            struct ilo_rasterizer_sf *sf);
 
+void
+ilo_gpe_init_rasterizer_wm_gen6(const struct ilo_dev_info *dev,
+                                const struct pipe_rasterizer_state *state,
+                                struct ilo_rasterizer_wm *wm);
+
+void
+ilo_gpe_init_rasterizer_wm_gen7(const struct ilo_dev_info *dev,
+                                const struct pipe_rasterizer_state *state,
+                                struct ilo_rasterizer_wm *wm);
+
 static inline void
 ilo_gpe_init_rasterizer(const struct ilo_dev_info *dev,
                         const struct pipe_rasterizer_state *state,
@@ -298,6 +316,11 @@ ilo_gpe_init_rasterizer(const struct ilo_dev_info *dev,
 {
    ilo_gpe_init_rasterizer_clip(dev, state, &rasterizer->clip);
    ilo_gpe_init_rasterizer_sf(dev, state, &rasterizer->sf);
+
+   if (dev->gen >= ILO_GEN(7))
+      ilo_gpe_init_rasterizer_wm_gen7(dev, state, &rasterizer->wm);
+   else
+      ilo_gpe_init_rasterizer_wm_gen6(dev, state, &rasterizer->wm);
 }
 
 void
index f4918dccf4b59b0e12b1fc5a4f1b0bba684ec0a7..ad0884ec7521456b7a2f0892e2dfee3300279b77 100644 (file)
@@ -2030,11 +2030,59 @@ gen6_emit_3DSTATE_SF(const struct ilo_dev_info *dev,
    ilo_cp_end(cp);
 }
 
+void
+ilo_gpe_init_rasterizer_wm_gen6(const struct ilo_dev_info *dev,
+                                const struct pipe_rasterizer_state *state,
+                                struct ilo_rasterizer_wm *wm)
+{
+   uint32_t dw5, dw6;
+
+   ILO_GPE_VALID_GEN(dev, 6, 6);
+
+   /* only the FF unit states are set, as in GEN7 */
+
+   dw5 = GEN6_WM_LINE_AA_WIDTH_2_0;
+
+   /* same value as in 3DSTATE_SF */
+   if (state->line_smooth)
+      dw5 |= GEN6_WM_LINE_END_CAP_AA_WIDTH_1_0;
+
+   if (state->poly_stipple_enable)
+      dw5 |= GEN6_WM_POLYGON_STIPPLE_ENABLE;
+   if (state->line_stipple_enable)
+      dw5 |= GEN6_WM_LINE_STIPPLE_ENABLE;
+
+   dw6 = GEN6_WM_POSITION_ZW_PIXEL |
+         GEN6_WM_MSRAST_OFF_PIXEL |
+         GEN6_WM_MSDISPMODE_PERSAMPLE;
+
+   if (state->bottom_edge_rule)
+      dw6 |= GEN6_WM_POINT_RASTRULE_UPPER_RIGHT;
+
+   /*
+    * assertion that makes sure
+    *
+    *   dw6 |= wm->dw_msaa_rast | wm->dw_msaa_disp;
+    *
+    * is valid
+    */
+   STATIC_ASSERT(GEN6_WM_MSRAST_OFF_PIXEL == 0 &&
+                 GEN6_WM_MSDISPMODE_PERSAMPLE == 0);
+
+   wm->dw_msaa_rast =
+      (state->multisample) ? GEN6_WM_MSRAST_ON_PATTERN : 0;
+   wm->dw_msaa_disp = GEN6_WM_MSDISPMODE_PERPIXEL;
+
+   STATIC_ASSERT(Elements(wm->payload) >= 2);
+   wm->payload[0] = dw5;
+   wm->payload[1] = dw6;
+}
+
 static void
 gen6_emit_3DSTATE_WM(const struct ilo_dev_info *dev,
                      const struct ilo_shader *fs,
                      int num_samplers,
-                     const struct pipe_rasterizer_state *rasterizer,
+                     const struct ilo_rasterizer_state *rasterizer,
                      bool dual_blend, bool cc_may_kill,
                      struct ilo_cp *cp)
 {
@@ -2090,8 +2138,10 @@ gen6_emit_3DSTATE_WM(const struct ilo_dev_info *dev,
       dw4 |= GEN6_WM_HIERARCHICAL_DEPTH_RESOLVE;
    }
 
-   dw5 = (max_threads - 1) << GEN6_WM_MAX_THREADS_SHIFT |
-         GEN6_WM_LINE_AA_WIDTH_2_0;
+   dw5 = rasterizer->wm.payload[0];
+   dw6 = rasterizer->wm.payload[1];
+
+   dw5 |= (max_threads - 1) << GEN6_WM_MAX_THREADS_SHIFT;
 
    /*
     * From the Sandy Bridge PRM, volume 2 part 1, page 275:
@@ -2145,15 +2195,6 @@ gen6_emit_3DSTATE_WM(const struct ilo_dev_info *dev,
    if (true)
       dw5 |= GEN6_WM_DISPATCH_ENABLE;
 
-   /* same value as in 3DSTATE_SF */
-   if (rasterizer->line_smooth)
-      dw5 |= GEN6_WM_LINE_END_CAP_AA_WIDTH_1_0;
-
-   if (rasterizer->poly_stipple_enable)
-      dw5 |= GEN6_WM_POLYGON_STIPPLE_ENABLE;
-   if (rasterizer->line_stipple_enable)
-      dw5 |= GEN6_WM_LINE_STIPPLE_ENABLE;
-
    if (dual_blend)
       dw5 |= GEN6_WM_DUAL_SOURCE_BLEND_ENABLE;
 
@@ -2162,25 +2203,14 @@ gen6_emit_3DSTATE_WM(const struct ilo_dev_info *dev,
    else
       dw5 |= GEN6_WM_8_DISPATCH_ENABLE;
 
-   dw6 = fs->in.count << GEN6_WM_NUM_SF_OUTPUTS_SHIFT |
-         GEN6_WM_POSOFFSET_NONE |
-         GEN6_WM_POSITION_ZW_PIXEL |
-         fs->in.barycentric_interpolation_mode <<
-           GEN6_WM_BARYCENTRIC_INTERPOLATION_MODE_SHIFT;
-
-   if (rasterizer->bottom_edge_rule)
-      dw6 |= GEN6_WM_POINT_RASTRULE_UPPER_RIGHT;
+   dw6 |= fs->in.count << GEN6_WM_NUM_SF_OUTPUTS_SHIFT |
+          GEN6_WM_POSOFFSET_NONE |
+          fs->in.barycentric_interpolation_mode <<
+             GEN6_WM_BARYCENTRIC_INTERPOLATION_MODE_SHIFT;
 
    if (num_samples > 1) {
-      if (rasterizer->multisample)
-         dw6 |= GEN6_WM_MSRAST_ON_PATTERN;
-      else
-         dw6 |= GEN6_WM_MSRAST_OFF_PIXEL;
-      dw6 |= GEN6_WM_MSDISPMODE_PERPIXEL;
-   }
-   else {
-      dw6 |= GEN6_WM_MSRAST_OFF_PIXEL |
-             GEN6_WM_MSDISPMODE_PERSAMPLE;
+      dw6 |= rasterizer->wm.dw_msaa_rast |
+             rasterizer->wm.dw_msaa_disp;
    }
 
    ilo_cp_begin(cp, cmd_len);
index bf4ed7503419948f72ce6382c0bb627942e80721..a8a986a9440720921a82d6c3d63a82bc1583d352 100644 (file)
@@ -265,7 +265,7 @@ typedef void
 (*ilo_gpe_gen6_3DSTATE_WM)(const struct ilo_dev_info *dev,
                            const struct ilo_shader *fs,
                            int num_samplers,
-                           const struct pipe_rasterizer_state *rasterizer,
+                           const struct ilo_rasterizer_state *rasterizer,
                            bool dual_blend, bool cc_may_kill,
                            struct ilo_cp *cp);
 
index f374473b29103e2fc048c4848088ecb3dba356da..79e01d7968f91089374cc017a46a301ba3d8df1e 100644 (file)
@@ -194,10 +194,57 @@ gen7_emit_3DSTATE_SF(const struct ilo_dev_info *dev,
    ilo_cp_end(cp);
 }
 
+void
+ilo_gpe_init_rasterizer_wm_gen7(const struct ilo_dev_info *dev,
+                                const struct pipe_rasterizer_state *state,
+                                struct ilo_rasterizer_wm *wm)
+{
+   uint32_t dw1, dw2;
+
+   ILO_GPE_VALID_GEN(dev, 7, 7);
+
+   dw1 = GEN7_WM_POSITION_ZW_PIXEL |
+         GEN7_WM_LINE_AA_WIDTH_2_0 |
+         GEN7_WM_MSRAST_OFF_PIXEL;
+
+   /* same value as in 3DSTATE_SF */
+   if (state->line_smooth)
+      dw1 |= GEN7_WM_LINE_END_CAP_AA_WIDTH_1_0;
+
+   if (state->poly_stipple_enable)
+      dw1 |= GEN7_WM_POLYGON_STIPPLE_ENABLE;
+   if (state->line_stipple_enable)
+      dw1 |= GEN7_WM_LINE_STIPPLE_ENABLE;
+
+   if (state->bottom_edge_rule)
+      dw1 |= GEN7_WM_POINT_RASTRULE_UPPER_RIGHT;
+
+   dw2 = GEN7_WM_MSDISPMODE_PERSAMPLE;
+
+   /*
+    * assertion that makes sure
+    *
+    *   dw1 |= wm->dw_msaa_rast;
+    *   dw2 |= wm->dw_msaa_disp;
+    *
+    * is valid
+    */
+   STATIC_ASSERT(GEN7_WM_MSRAST_OFF_PIXEL == 0 &&
+                 GEN7_WM_MSDISPMODE_PERSAMPLE == 0);
+
+   wm->dw_msaa_rast =
+      (state->multisample) ? GEN7_WM_MSRAST_ON_PATTERN : 0;
+   wm->dw_msaa_disp = GEN7_WM_MSDISPMODE_PERPIXEL;
+
+   STATIC_ASSERT(Elements(wm->payload) >= 2);
+   wm->payload[0] = dw1;
+   wm->payload[1] = dw2;
+}
+
 static void
 gen7_emit_3DSTATE_WM(const struct ilo_dev_info *dev,
                      const struct ilo_shader *fs,
-                     const struct pipe_rasterizer_state *rasterizer,
+                     const struct ilo_rasterizer_state *rasterizer,
                      bool cc_may_kill,
                      struct ilo_cp *cp)
 {
@@ -208,8 +255,11 @@ gen7_emit_3DSTATE_WM(const struct ilo_dev_info *dev,
 
    ILO_GPE_VALID_GEN(dev, 7, 7);
 
-   dw1 = GEN7_WM_STATISTICS_ENABLE |
-         GEN7_WM_LINE_AA_WIDTH_2_0;
+   /* see ilo_gpe_init_rasterizer_wm() */
+   dw1 = rasterizer->wm.payload[0];
+   dw2 = rasterizer->wm.payload[1];
+
+   dw1 |= GEN7_WM_STATISTICS_ENABLE;
 
    if (false) {
       dw1 |= GEN7_WM_DEPTH_CLEAR;
@@ -269,32 +319,9 @@ gen7_emit_3DSTATE_WM(const struct ilo_dev_info *dev,
                 GEN7_WM_KILL_ENABLE;
    }
 
-   dw1 |= GEN7_WM_POSITION_ZW_PIXEL;
-
-   /* same value as in 3DSTATE_SF */
-   if (rasterizer->line_smooth)
-      dw1 |= GEN7_WM_LINE_END_CAP_AA_WIDTH_1_0;
-
-   if (rasterizer->poly_stipple_enable)
-      dw1 |= GEN7_WM_POLYGON_STIPPLE_ENABLE;
-   if (rasterizer->line_stipple_enable)
-      dw1 |= GEN7_WM_LINE_STIPPLE_ENABLE;
-
-   if (rasterizer->bottom_edge_rule)
-      dw1 |= GEN7_WM_POINT_RASTRULE_UPPER_RIGHT;
-
    if (num_samples > 1) {
-      if (rasterizer->multisample)
-         dw1 |= GEN7_WM_MSRAST_ON_PATTERN;
-      else
-         dw1 |= GEN7_WM_MSRAST_OFF_PIXEL;
-
-      dw2 = GEN7_WM_MSDISPMODE_PERPIXEL;
-   }
-   else {
-      dw1 |= GEN7_WM_MSRAST_OFF_PIXEL;
-
-      dw2 = GEN7_WM_MSDISPMODE_PERSAMPLE;
+      dw1 |= rasterizer->wm.dw_msaa_rast;
+      dw2 |= rasterizer->wm.dw_msaa_disp;
    }
 
    ilo_cp_begin(cp, cmd_len);
index f8e8745fcb46ada03818b54163dc2b8b646ba7ad..ac0fb0ee29fdfa1d11b272ccdc400b5c9de6634a 100644 (file)
@@ -173,7 +173,7 @@ typedef void
 typedef void
 (*ilo_gpe_gen7_3DSTATE_WM)(const struct ilo_dev_info *dev,
                            const struct ilo_shader *fs,
-                           const struct pipe_rasterizer_state *rasterizer,
+                           const struct ilo_rasterizer_state *rasterizer,
                            bool cc_may_kill,
                            struct ilo_cp *cp);