ilo: add gen6_pipeline_update_max_svbi()
authorChia-I Wu <olvaffe@gmail.com>
Wed, 1 May 2013 08:58:10 +0000 (16:58 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Wed, 1 May 2013 09:35:43 +0000 (17:35 +0800)
Move max_svbi calculation to a helper function and make it available for other
GENs.

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

index ae99e3e56e1e4c39e3ab6cd0b9c51120237b2a87..78aeadd5b343b7c9237f50dd14ee041e2b220a4f 100644 (file)
@@ -511,12 +511,11 @@ gen6_pipeline_gs(struct ilo_3d_pipeline *p,
    }
 }
 
-static void
-gen6_pipeline_gs_svbi(struct ilo_3d_pipeline *p,
-                      const struct ilo_context *ilo,
-                      struct gen6_pipeline_session *session)
+bool
+gen6_pipeline_update_max_svbi(struct ilo_3d_pipeline *p,
+                              const struct ilo_context *ilo,
+                              struct gen6_pipeline_session *session)
 {
-   /* 3DSTATE_GS_SVB_INDEX */
    if (DIRTY(VS) || DIRTY(GS) || DIRTY(STREAM_OUTPUT_TARGETS)) {
       const struct pipe_stream_output_info *so_info =
          (ilo->gs) ? &ilo->gs->info.stream_output :
@@ -524,8 +523,7 @@ gen6_pipeline_gs_svbi(struct ilo_3d_pipeline *p,
       unsigned max_svbi = 0xffffffff;
       int i;
 
-      /* get max_svbi */
-      for (i = 0; so_info && i < so_info->num_outputs; i++) {
+      for (i = 0; i < so_info->num_outputs; i++) {
          const int output_buffer = so_info->output[i].output_buffer;
          const struct pipe_stream_output_target *so =
             ilo->stream_output_targets.targets[output_buffer];
@@ -533,8 +531,10 @@ gen6_pipeline_gs_svbi(struct ilo_3d_pipeline *p,
          const int elem_size = so_info->output[i].num_components * 4;
          int buf_size, count;
 
-         if (!so)
-            continue;
+         if (!so) {
+            max_svbi = 0;
+            break;
+         }
 
          buf_size = so->buffer_size - so_info->output[i].dst_offset * 4;
 
@@ -546,14 +546,34 @@ gen6_pipeline_gs_svbi(struct ilo_3d_pipeline *p,
             max_svbi = count;
       }
 
+      if (p->state.so_max_vertices != max_svbi) {
+         p->state.so_max_vertices = max_svbi;
+         return true;
+      }
+   }
+
+   return false;
+}
+
+static void
+gen6_pipeline_gs_svbi(struct ilo_3d_pipeline *p,
+                      const struct ilo_context *ilo,
+                      struct gen6_pipeline_session *session)
+{
+   const bool emit = gen6_pipeline_update_max_svbi(p, ilo, session);
+
+   /* 3DSTATE_GS_SVB_INDEX */
+   if (emit) {
       if (p->dev->gen == ILO_GEN(6))
          gen6_wa_pipe_control_post_sync(p, false);
 
       p->gen6_3DSTATE_GS_SVB_INDEX(p->dev,
-            0, p->state.so_num_vertices, max_svbi,
+            0, p->state.so_num_vertices, p->state.so_max_vertices,
             false, p->cp);
 
       if (session->hw_ctx_changed) {
+         int i;
+
          /*
           * From the Sandy Bridge PRM, volume 2 part 1, page 148:
           *
@@ -568,9 +588,6 @@ gen6_pipeline_gs_svbi(struct ilo_3d_pipeline *p,
                   i, 0, 0xffffffff, false, p->cp);
          }
       }
-
-      /* remember the state for calculating primtive emitted in software */
-      p->state.so_max_vertices = max_svbi;
    }
 }
 
index 8cc6ab20030fd0d49ce5767d831b8c37e3a5c2f7..34d43206231958761d721d3e3b8c414c44133015 100644 (file)
@@ -144,6 +144,11 @@ gen6_pipeline_states(struct ilo_3d_pipeline *p,
                      const struct ilo_context *ilo,
                      struct gen6_pipeline_session *session);
 
+bool
+gen6_pipeline_update_max_svbi(struct ilo_3d_pipeline *p,
+                              const struct ilo_context *ilo,
+                              struct gen6_pipeline_session *session);
+
 void
 ilo_3d_pipeline_emit_flush_gen6(struct ilo_3d_pipeline *p);