Mesa (master): ilo: replace software queries by hardware ones

Chia-I Wu olv at kemper.freedesktop.org
Sun Sep 21 16:06:19 UTC 2014


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

Author: Chia-I Wu <olvaffe at gmail.com>
Date:   Sun Sep 21 22:39:16 2014 +0800

ilo: replace software queries by hardware ones

Read PIPE_QUERY_PRIMITIVES_GENERATED and PIPE_QUERY_PRIMITIVES_EMITTED from
hardware registers.  Because all queries now have a bo, remove unnecessary
checks for q->bo.

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

---

 src/gallium/drivers/ilo/ilo_3d.c               |   84 +++++++++++-------------
 src/gallium/drivers/ilo/ilo_3d_pipeline.c      |   39 ++---------
 src/gallium/drivers/ilo/ilo_3d_pipeline.h      |    5 +-
 src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c |    2 +-
 4 files changed, 47 insertions(+), 83 deletions(-)

diff --git a/src/gallium/drivers/ilo/ilo_3d.c b/src/gallium/drivers/ilo/ilo_3d.c
index e30db26..ded5c6c 100644
--- a/src/gallium/drivers/ilo/ilo_3d.c
+++ b/src/gallium/drivers/ilo/ilo_3d.c
@@ -72,6 +72,8 @@ query_process_bo(const struct ilo_3d *hw3d, struct ilo_query *q)
    switch (q->type) {
    case PIPE_QUERY_OCCLUSION_COUNTER:
    case PIPE_QUERY_TIME_ELAPSED:
+   case PIPE_QUERY_PRIMITIVES_GENERATED:
+   case PIPE_QUERY_PRIMITIVES_EMITTED:
       assert(q->stride == sizeof(*vals) * 2);
 
       tmp = 0;
@@ -157,6 +159,8 @@ ilo_3d_init_query(struct pipe_context *pipe, struct ilo_query *q)
    switch (q->type) {
    case PIPE_QUERY_OCCLUSION_COUNTER:
    case PIPE_QUERY_TIME_ELAPSED:
+   case PIPE_QUERY_PRIMITIVES_GENERATED:
+   case PIPE_QUERY_PRIMITIVES_EMITTED:
       q->stride = sizeof(uint64_t);
       q->in_pairs = true;
       break;
@@ -168,10 +172,6 @@ ilo_3d_init_query(struct pipe_context *pipe, struct ilo_query *q)
       q->stride = sizeof(uint64_t) * 11;
       q->in_pairs = true;
       break;
-   case PIPE_QUERY_PRIMITIVES_GENERATED:
-   case PIPE_QUERY_PRIMITIVES_EMITTED:
-      return true;
-      break;
    default:
       return false;
       break;
@@ -201,23 +201,21 @@ ilo_3d_begin_query(struct pipe_context *pipe, struct ilo_query *q)
 
    ilo_3d_own_render_ring(hw3d);
 
-   if (q->bo) {
-      /* need to submit first */
-      if (!ilo_builder_validate(&hw3d->cp->builder, 1, &q->bo) ||
-          ilo_cp_space(hw3d->cp) < q->cmd_len) {
-         ilo_cp_submit(hw3d->cp, "out of aperture or space");
+   /* need to submit first */
+   if (!ilo_builder_validate(&hw3d->cp->builder, 1, &q->bo) ||
+         ilo_cp_space(hw3d->cp) < q->cmd_len) {
+      ilo_cp_submit(hw3d->cp, "out of aperture or space");
 
-         assert(ilo_builder_validate(&hw3d->cp->builder, 1, &q->bo));
-         assert(ilo_cp_space(hw3d->cp) >= q->cmd_len);
+      assert(ilo_builder_validate(&hw3d->cp->builder, 1, &q->bo));
+      assert(ilo_cp_space(hw3d->cp) >= q->cmd_len);
 
-         ilo_3d_own_render_ring(hw3d);
-      }
+      ilo_3d_own_render_ring(hw3d);
+   }
 
-      /* reserve the space for ending/pausing the query */
-      hw3d->owner.reserve += q->cmd_len >> q->in_pairs;
+   /* reserve the space for ending/pausing the query */
+   hw3d->owner.reserve += q->cmd_len >> q->in_pairs;
 
-      query_begin_bo(hw3d, q);
-   }
+   query_begin_bo(hw3d, q);
 
    switch (q->type) {
    case PIPE_QUERY_OCCLUSION_COUNTER:
@@ -251,13 +249,11 @@ ilo_3d_end_query(struct pipe_context *pipe, struct ilo_query *q)
 
    ilo_3d_own_render_ring(hw3d);
 
-   if (q->bo) {
-      /* reclaim the reserved space */
-      hw3d->owner.reserve -= q->cmd_len >> q->in_pairs;
-      assert(hw3d->owner.reserve >= 0);
+   /* reclaim the reserved space */
+   hw3d->owner.reserve -= q->cmd_len >> q->in_pairs;
+   assert(hw3d->owner.reserve >= 0);
 
-      query_end_bo(hw3d, q);
-   }
+   query_end_bo(hw3d, q);
 
    list_delinit(&q->list);
 }
@@ -270,8 +266,7 @@ ilo_3d_process_query(struct pipe_context *pipe, struct ilo_query *q)
 {
    struct ilo_3d *hw3d = ilo_context(pipe)->hw3d;
 
-   if (q->bo)
-      query_process_bo(hw3d, q);
+   query_process_bo(hw3d, q);
 }
 
 static void
@@ -299,6 +294,14 @@ ilo_3d_own_cp(struct ilo_cp *cp, void *data)
       LIST_FOR_EACH_ENTRY(q, &hw3d->time_elapsed_queries, list)
          query_begin_bo(hw3d, q);
 
+      /* resume prim generated queries */
+      LIST_FOR_EACH_ENTRY(q, &hw3d->prim_generated_queries, list)
+         query_begin_bo(hw3d, q);
+
+      /* resume prim emitted queries */
+      LIST_FOR_EACH_ENTRY(q, &hw3d->prim_emitted_queries, list)
+         query_begin_bo(hw3d, q);
+
       /* resume pipeline statistics queries */
       LIST_FOR_EACH_ENTRY(q, &hw3d->pipeline_statistics_queries, list)
          query_begin_bo(hw3d, q);
@@ -334,6 +337,14 @@ ilo_3d_release_cp(struct ilo_cp *cp, void *data)
    LIST_FOR_EACH_ENTRY(q, &hw3d->time_elapsed_queries, list)
       query_end_bo(hw3d, q);
 
+   /* pause prim generated queries */
+   LIST_FOR_EACH_ENTRY(q, &hw3d->prim_generated_queries, list)
+      query_end_bo(hw3d, q);
+
+   /* pause prim emitted queries */
+   LIST_FOR_EACH_ENTRY(q, &hw3d->prim_emitted_queries, list)
+      query_end_bo(hw3d, q);
+
    /* pause pipeline statistics queries */
    LIST_FOR_EACH_ENTRY(q, &hw3d->pipeline_statistics_queries, list)
       query_end_bo(hw3d, q);
@@ -400,8 +411,7 @@ ilo_3d_destroy(struct ilo_3d *hw3d)
 }
 
 static bool
-draw_vbo(struct ilo_3d *hw3d, const struct ilo_state_vector *vec,
-         int *prim_generated, int *prim_emitted)
+draw_vbo(struct ilo_3d *hw3d, const struct ilo_state_vector *vec)
 {
    bool need_flush = false;
    int max_len;
@@ -438,20 +448,7 @@ draw_vbo(struct ilo_3d *hw3d, const struct ilo_state_vector *vec,
    if (need_flush)
       ilo_3d_pipeline_emit_flush(hw3d->pipeline);
 
-   return ilo_3d_pipeline_emit_draw(hw3d->pipeline, vec,
-         prim_generated, prim_emitted);
-}
-
-static void
-update_prim_count(struct ilo_3d *hw3d, int generated, int emitted)
-{
-   struct ilo_query *q;
-
-   LIST_FOR_EACH_ENTRY(q, &hw3d->prim_generated_queries, list)
-      q->result.u64 += generated;
-
-   LIST_FOR_EACH_ENTRY(q, &hw3d->prim_emitted_queries, list)
-      q->result.u64 += emitted;
+   return ilo_3d_pipeline_emit_draw(hw3d->pipeline, vec);
 }
 
 bool
@@ -708,7 +705,6 @@ ilo_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
 {
    struct ilo_context *ilo = ilo_context(pipe);
    struct ilo_3d *hw3d = ilo->hw3d;
-   int prim_generated, prim_emitted;
 
    if (ilo_debug & ILO_DEBUG_DRAW) {
       if (info->indexed) {
@@ -747,7 +743,7 @@ ilo_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
    ilo_blit_resolve_framebuffer(ilo);
 
    /* If draw_vbo ever fails, return immediately. */
-   if (!draw_vbo(hw3d, &ilo->state_vector, &prim_generated, &prim_emitted))
+   if (!draw_vbo(hw3d, &ilo->state_vector))
       return;
 
    /* clear dirty status */
@@ -757,8 +753,6 @@ ilo_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
    /* avoid dangling pointer reference */
    ilo->state_vector.draw = NULL;
 
-   update_prim_count(hw3d, prim_generated, prim_emitted);
-
    if (ilo_debug & ILO_DEBUG_NOCACHE)
       ilo_3d_pipeline_emit_flush(hw3d->pipeline);
 }
diff --git a/src/gallium/drivers/ilo/ilo_3d_pipeline.c b/src/gallium/drivers/ilo/ilo_3d_pipeline.c
index a14da4b..cfe3c5d 100644
--- a/src/gallium/drivers/ilo/ilo_3d_pipeline.c
+++ b/src/gallium/drivers/ilo/ilo_3d_pipeline.c
@@ -150,25 +150,14 @@ handle_invalid_batch_bo(struct ilo_3d_pipeline *p, bool unset)
  */
 bool
 ilo_3d_pipeline_emit_draw(struct ilo_3d_pipeline *p,
-                          const struct ilo_state_vector *vec,
-                          int *prim_generated, int *prim_emitted)
+                          const struct ilo_state_vector *vec)
 {
    bool success;
 
-   if (vec->dirty & ILO_DIRTY_SO &&
-       vec->so.enabled && !vec->so.append_bitmask) {
-      /*
-       * We keep track of the SVBI in the driver, so that we can restore it
-       * when the HW context is invalidated (by another process).  The value
-       * needs to be reset when stream output is enabled and the targets are
-       * changed.
-       */
-      p->state.so_num_vertices = 0;
-
-      /* on GEN7+, we need SOL_RESET to reset the SO write offsets */
-      if (ilo_dev_gen(p->dev) >= ILO_GEN(7))
-         ilo_cp_set_one_off_flags(p->cp, INTEL_EXEC_GEN7_SOL_RESET);
-   }
+   /* on GEN7+, we need SOL_RESET to reset the SO write offsets */
+   if (ilo_dev_gen(p->dev) >= ILO_GEN(7) && (vec->dirty & ILO_DIRTY_SO) &&
+       vec->so.enabled && !vec->so.append_bitmask)
+      ilo_cp_set_one_off_flags(p->cp, INTEL_EXEC_GEN7_SOL_RESET);
 
    while (true) {
       struct ilo_builder_snapshot snapshot;
@@ -199,24 +188,6 @@ ilo_3d_pipeline_emit_draw(struct ilo_3d_pipeline *p,
       break;
    }
 
-   if (success) {
-      const int num_verts =
-         u_vertices_per_prim(u_reduced_prim(vec->draw->mode));
-      const int max_emit =
-         (p->state.so_max_vertices - p->state.so_num_vertices) / num_verts;
-      const int generated =
-         u_reduced_prims_for_vertices(vec->draw->mode, vec->draw->count);
-      const int emitted = MIN2(generated, max_emit);
-
-      p->state.so_num_vertices += emitted * num_verts;
-
-      if (prim_generated)
-         *prim_generated = generated;
-
-      if (prim_emitted)
-         *prim_emitted = emitted;
-   }
-
    p->invalidate_flags = 0x0;
 
    return success;
diff --git a/src/gallium/drivers/ilo/ilo_3d_pipeline.h b/src/gallium/drivers/ilo/ilo_3d_pipeline.h
index cf3e846..802c965 100644
--- a/src/gallium/drivers/ilo/ilo_3d_pipeline.h
+++ b/src/gallium/drivers/ilo/ilo_3d_pipeline.h
@@ -93,7 +93,7 @@ struct ilo_3d_pipeline {
 
       bool primitive_restart;
       int reduced_prim;
-      int so_num_vertices, so_max_vertices;
+      int so_max_vertices;
 
       uint32_t SF_VIEWPORT;
       uint32_t CLIP_VIEWPORT;
@@ -161,8 +161,7 @@ ilo_3d_pipeline_estimate_size(struct ilo_3d_pipeline *pipeline,
 
 bool
 ilo_3d_pipeline_emit_draw(struct ilo_3d_pipeline *p,
-                          const struct ilo_state_vector *vec,
-                          int *prim_generated, int *prim_emitted);
+                          const struct ilo_state_vector *vec);
 
 void
 ilo_3d_pipeline_emit_flush(struct ilo_3d_pipeline *p);
diff --git a/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c b/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c
index 718afe7..49bd7e7 100644
--- a/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c
+++ b/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c
@@ -583,7 +583,7 @@ gen6_pipeline_gs_svbi(struct ilo_3d_pipeline *p,
          gen6_wa_pipe_control_post_sync(p, false);
 
       gen6_3DSTATE_GS_SVB_INDEX(p->builder,
-            0, p->state.so_num_vertices, p->state.so_max_vertices,
+            0, 0, p->state.so_max_vertices,
             false);
 
       if (session->hw_ctx_changed) {




More information about the mesa-commit mailing list