Mesa (master): ilo: add gen6_3dstate_constant()

Chia-I Wu olv at kemper.freedesktop.org
Tue Nov 11 08:04:46 UTC 2014


Module: Mesa
Branch: master
Commit: 2ff88ce4be7f81403818e8c4662300abf68b09ea
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2ff88ce4be7f81403818e8c4662300abf68b09ea

Author: Chia-I Wu <olvaffe at gmail.com>
Date:   Tue Nov 11 11:06:12 2014 +0800

ilo: add gen6_3dstate_constant()

It replaces gen6_fill_3dstate_constant().  gen6_3DSTATE_CONSTANT_{VS,GS,PS}
are made wrappers of the new function.

Signed-off-by: Chia-I Wu <olvaffe at gmail.com>

---

 src/gallium/drivers/ilo/ilo_builder_3d_bottom.h |   24 +----
 src/gallium/drivers/ilo/ilo_builder_3d_top.h    |  127 ++++++++++++-----------
 2 files changed, 67 insertions(+), 84 deletions(-)

diff --git a/src/gallium/drivers/ilo/ilo_builder_3d_bottom.h b/src/gallium/drivers/ilo/ilo_builder_3d_bottom.h
index d7b6104..773ccbf 100644
--- a/src/gallium/drivers/ilo/ilo_builder_3d_bottom.h
+++ b/src/gallium/drivers/ilo/ilo_builder_3d_bottom.h
@@ -483,28 +483,8 @@ gen6_3DSTATE_CONSTANT_PS(struct ilo_builder *builder,
                          const uint32_t *bufs, const int *sizes,
                          int num_bufs)
 {
-   const uint8_t cmd_len = 5;
-   uint32_t buf_dw[4], buf_enabled;
-   uint32_t *dw;
-
-   ILO_DEV_ASSERT(builder->dev, 6, 6);
-   assert(num_bufs <= 4);
-
-   /*
-    * From the Sandy Bridge PRM, volume 2 part 1, page 287:
-    *
-    *     "The sum of all four read length fields (each incremented to
-    *      represent the actual read length) must be less than or equal to 64"
-    */
-   buf_enabled = gen6_fill_3dstate_constant(builder->dev,
-         bufs, sizes, num_bufs, 64, buf_dw, Elements(buf_dw));
-
-   ilo_builder_batch_pointer(builder, cmd_len, &dw);
-
-   dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_CONSTANT_PS) |
-           buf_enabled << 12 |
-           (cmd_len - 2);
-   memcpy(&dw[1], buf_dw, sizeof(buf_dw));
+   gen6_3dstate_constant(builder, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_PS,
+         bufs, sizes, num_bufs);
 }
 
 static inline void
diff --git a/src/gallium/drivers/ilo/ilo_builder_3d_top.h b/src/gallium/drivers/ilo/ilo_builder_3d_top.h
index 1b4f4a3..8f2a25a 100644
--- a/src/gallium/drivers/ilo/ilo_builder_3d_top.h
+++ b/src/gallium/drivers/ilo/ilo_builder_3d_top.h
@@ -1138,39 +1138,82 @@ gen7_3DSTATE_SAMPLER_STATE_POINTERS_GS(struct ilo_builder *builder,
          sampler_state);
 }
 
-static inline unsigned
-gen6_fill_3dstate_constant(const struct ilo_dev_info *dev,
-                           const uint32_t *bufs, const int *sizes,
-                           int num_bufs, int max_read_length,
-                           uint32_t *dw, int num_dwords)
+static inline void
+gen6_3dstate_constant(struct ilo_builder *builder, int subop,
+                      const uint32_t *bufs, const int *sizes,
+                      int num_bufs)
 {
-   unsigned enabled = 0x0;
-   int total_read_length, i;
+   const uint32_t cmd = GEN6_RENDER_TYPE_RENDER |
+                        GEN6_RENDER_SUBTYPE_3D |
+                        subop;
+   const uint8_t cmd_len = 5;
+   unsigned buf_enabled = 0x0;
+   uint32_t buf_dw[4], *dw;
+   int max_read_length, total_read_length;
+   int i;
 
-   assert(num_dwords == 4);
+   ILO_DEV_ASSERT(builder->dev, 6, 6);
+
+   assert(num_bufs <= 4);
+
+   /*
+    * From the Sandy Bridge PRM, volume 2 part 1, page 138:
+    *
+    *     "(3DSTATE_CONSTANT_VS) The sum of all four read length fields (each
+    *      incremented to represent the actual read length) must be less than
+    *      or equal to 32"
+    *
+    * From the Sandy Bridge PRM, volume 2 part 1, page 161:
+    *
+    *     "(3DSTATE_CONSTANT_GS) The sum of all four read length fields (each
+    *      incremented to represent the actual read length) must be less than
+    *      or equal to 64"
+    *
+    * From the Sandy Bridge PRM, volume 2 part 1, page 287:
+    *
+    *     "(3DSTATE_CONSTANT_PS) The sum of all four read length fields (each
+    *      incremented to represent the actual read length) must be less than
+    *      or equal to 64"
+    */
+   switch (subop) {
+   case GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_VS:
+      max_read_length = 32;
+      break;
+   case GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_GS:
+   case GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_PS:
+      max_read_length = 64;
+      break;
+   default:
+      assert(!"unknown pcb subop");
+      max_read_length = 0;
+      break;
+   }
 
    total_read_length = 0;
    for (i = 0; i < 4; i++) {
       if (i < num_bufs && sizes[i]) {
-         /* in 256-bit units minus one */
-         const int read_len = (sizes[i] + 31) / 32 - 1;
+         /* in 256-bit units */
+         const int read_len = (sizes[i] + 31) / 32;
 
          assert(bufs[i] % 32 == 0);
-         assert(read_len < 32);
+         assert(read_len <= 32);
 
-         enabled |= 1 << i;
-         dw[i] = bufs[i] | read_len;
+         buf_enabled |= 1 << i;
+         buf_dw[i] = bufs[i] | (read_len - 1);
 
-         total_read_length += read_len + 1;
-      }
-      else {
-         dw[i] = 0;
+         total_read_length += read_len;
+      } else {
+         buf_dw[i] = 0;
       }
    }
 
    assert(total_read_length <= max_read_length);
 
-   return enabled;
+   ilo_builder_batch_pointer(builder, cmd_len, &dw);
+
+   dw[0] = cmd | (cmd_len - 2) |
+           buf_enabled << 12;
+   memcpy(&dw[1], buf_dw, sizeof(buf_dw));
 }
 
 static inline void
@@ -1178,28 +1221,8 @@ gen6_3DSTATE_CONSTANT_VS(struct ilo_builder *builder,
                          const uint32_t *bufs, const int *sizes,
                          int num_bufs)
 {
-   const uint8_t cmd_len = 5;
-   uint32_t buf_dw[4], buf_enabled, *dw;
-
-   ILO_DEV_ASSERT(builder->dev, 6, 6);
-
-   assert(num_bufs <= 4);
-
-   /*
-    * From the Sandy Bridge PRM, volume 2 part 1, page 138:
-    *
-    *     "The sum of all four read length fields (each incremented to
-    *      represent the actual read length) must be less than or equal to 32"
-    */
-   buf_enabled = gen6_fill_3dstate_constant(builder->dev,
-         bufs, sizes, num_bufs, 32, buf_dw, Elements(buf_dw));
-
-   ilo_builder_batch_pointer(builder, cmd_len, &dw);
-
-   dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_CONSTANT_VS) |
-           buf_enabled << 12 |
-           (cmd_len - 2);
-   memcpy(&dw[1], buf_dw, sizeof(buf_dw));
+   gen6_3dstate_constant(builder, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_VS,
+         bufs, sizes, num_bufs);
 }
 
 static inline void
@@ -1207,28 +1230,8 @@ gen6_3DSTATE_CONSTANT_GS(struct ilo_builder *builder,
                          const uint32_t *bufs, const int *sizes,
                          int num_bufs)
 {
-   const uint8_t cmd_len = 5;
-   uint32_t buf_dw[4], buf_enabled, *dw;
-
-   ILO_DEV_ASSERT(builder->dev, 6, 6);
-
-   assert(num_bufs <= 4);
-
-   /*
-    * From the Sandy Bridge PRM, volume 2 part 1, page 161:
-    *
-    *     "The sum of all four read length fields (each incremented to
-    *      represent the actual read length) must be less than or equal to 64"
-    */
-   buf_enabled = gen6_fill_3dstate_constant(builder->dev,
-         bufs, sizes, num_bufs, 64, buf_dw, Elements(buf_dw));
-
-   ilo_builder_batch_pointer(builder, cmd_len, &dw);
-
-   dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_CONSTANT_GS) |
-           buf_enabled << 12 |
-           (cmd_len - 2);
-   memcpy(&dw[1], buf_dw, sizeof(buf_dw));
+   gen6_3dstate_constant(builder, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_GS,
+         bufs, sizes, num_bufs);
 }
 
 static inline void




More information about the mesa-commit mailing list