ilo: speed up 3DSTATE_VERTEX_BUFFERS emission a bit
authorChia-I Wu <olvaffe@gmail.com>
Wed, 7 Aug 2013 04:21:26 +0000 (12:21 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Wed, 7 Aug 2013 15:13:50 +0000 (23:13 +0800)
Ignore vbuffer_mask which does not gain us anything.

src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c
src/gallium/drivers/ilo/ilo_gpe_gen6.c
src/gallium/drivers/ilo/ilo_gpe_gen6.h

index eefb2f96b598331af930145cb18e8499ec098155..a441fca85d056f04254d963cc820f7e4f7cb1643 100644 (file)
@@ -406,10 +406,8 @@ gen6_pipeline_vf(struct ilo_3d_pipeline *p,
    }
 
    /* 3DSTATE_VERTEX_BUFFERS */
-   if (DIRTY(VB) || DIRTY(VE) || session->batch_bo_changed) {
-      p->gen6_3DSTATE_VERTEX_BUFFERS(p->dev,
-            ilo->vb.states, ilo->vb.enabled_mask, ilo->ve, p->cp);
-   }
+   if (DIRTY(VB) || DIRTY(VE) || session->batch_bo_changed)
+      p->gen6_3DSTATE_VERTEX_BUFFERS(p->dev, ilo->ve, &ilo->vb, p->cp);
 
    /* 3DSTATE_VERTEX_ELEMENTS */
    if (DIRTY(VE) || DIRTY(VS)) {
index 442bef189135d0e8c285003102b5833d1c5d0702..1da2925d653753ca084f5452b1546b70976f5047 100644 (file)
@@ -711,9 +711,8 @@ gen6_emit_3DSTATE_URB(const struct ilo_dev_info *dev,
 
 static void
 gen6_emit_3DSTATE_VERTEX_BUFFERS(const struct ilo_dev_info *dev,
-                                 const struct pipe_vertex_buffer *vbuffers,
-                                 uint64_t vbuffer_mask,
                                  const struct ilo_ve_state *ve,
+                                 const struct ilo_vb_state *vb,
                                  struct ilo_cp *cp)
 {
    const uint32_t cmd = ILO_GPE_CMD(0x3, 0x0, 0x08);
@@ -727,19 +726,12 @@ gen6_emit_3DSTATE_VERTEX_BUFFERS(const struct ilo_dev_info *dev,
     *
     *     "From 1 to 33 VBs can be specified..."
     */
-   assert(vbuffer_mask <= (1UL << 33));
+   assert(ve->vb_count <= 33);
 
-   if (!vbuffer_mask)
+   if (!ve->vb_count)
       return;
 
-   cmd_len = 1;
-
-   for (hw_idx = 0; hw_idx < ve->vb_count; hw_idx++) {
-      const unsigned pipe_idx = ve->vb_mapping[hw_idx];
-
-      if (vbuffer_mask & (1 << pipe_idx))
-         cmd_len += 4;
-   }
+   cmd_len = 1 + 4 * ve->vb_count;
 
    ilo_cp_begin(cp, cmd_len);
    ilo_cp_write(cp, cmd | (cmd_len - 2));
@@ -747,12 +739,9 @@ gen6_emit_3DSTATE_VERTEX_BUFFERS(const struct ilo_dev_info *dev,
    for (hw_idx = 0; hw_idx < ve->vb_count; hw_idx++) {
       const unsigned instance_divisor = ve->instance_divisors[hw_idx];
       const unsigned pipe_idx = ve->vb_mapping[hw_idx];
-      const struct pipe_vertex_buffer *vb = &vbuffers[pipe_idx];
+      const struct pipe_vertex_buffer *cso = &vb->states[pipe_idx];
       uint32_t dw;
 
-      if (!(vbuffer_mask & (1 << pipe_idx)))
-         continue;
-
       dw = hw_idx << GEN6_VB0_INDEX_SHIFT;
 
       if (instance_divisor)
@@ -764,9 +753,9 @@ gen6_emit_3DSTATE_VERTEX_BUFFERS(const struct ilo_dev_info *dev,
          dw |= GEN7_VB0_ADDRESS_MODIFYENABLE;
 
       /* use null vb if there is no buffer or the stride is out of range */
-      if (vb->buffer && vb->stride <= 2048) {
-         const struct ilo_buffer *buf = ilo_buffer(vb->buffer);
-         const uint32_t start_offset = vb->buffer_offset;
+      if (cso->buffer && cso->stride <= 2048) {
+         const struct ilo_buffer *buf = ilo_buffer(cso->buffer);
+         const uint32_t start_offset = cso->buffer_offset;
          /*
           * As noted in ilo_translate_format(), we treat some 3-component
           * formats as 4-component formats to work around hardware
@@ -782,7 +771,7 @@ gen6_emit_3DSTATE_VERTEX_BUFFERS(const struct ilo_dev_info *dev,
           */
          const uint32_t end_offset = intel_bo_get_size(buf->bo) - 1;
 
-         dw |= vb->stride << BRW_VB0_PITCH_SHIFT;
+         dw |= cso->stride << BRW_VB0_PITCH_SHIFT;
 
          ilo_cp_write(cp, dw);
          ilo_cp_write_bo(cp, start_offset, buf->bo, INTEL_DOMAIN_VERTEX, 0);
index 7e24f97b8ca12b5d6a36a2586057e87cb572f4b2..300176428c19a9a86f7c5270dbeb34a1c24d1b69 100644 (file)
@@ -195,9 +195,8 @@ typedef void
 
 typedef void
 (*ilo_gpe_gen6_3DSTATE_VERTEX_BUFFERS)(const struct ilo_dev_info *dev,
-                                       const struct pipe_vertex_buffer *vbuffers,
-                                       uint64_t vbuffer_mask,
                                        const struct ilo_ve_state *ve,
+                                       const struct ilo_vb_state *vb,
                                        struct ilo_cp *cp);
 
 typedef void