Mesa (master): draw: fix clipper invocation statistics

Zack Rusin zack at kemper.freedesktop.org
Tue Jun 11 22:11:11 UTC 2013


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

Author: Zack Rusin <zackr at vmware.com>
Date:   Thu Jun  6 08:49:09 2013 -0400

draw: fix clipper invocation statistics

We need to figure out the number of invocations of the clipper
before the emit, because in the emit we are after clipping
where the number of primitives will be equal to number of clipper
invocations minus the clipped primitives. So our computations
were always off by the number of clipped primitives.

Signed-off-by: Zack Rusin <zackr at vmware.com>
Reviewed-by: Jose Fonseca <jfonseca at vmware.com>
Reviewed-by: Brian Paul <brianp at vmware.com>
Reviewed-by: Roland Scheidegger <sroland at vmware.com>

---

 src/gallium/auxiliary/draw/draw_context.c          |   25 ++++++++++++++++++++
 src/gallium/auxiliary/draw/draw_private.h          |    4 +++
 src/gallium/auxiliary/draw/draw_pt_emit.c          |    6 ----
 .../auxiliary/draw/draw_pt_fetch_shade_pipeline.c  |    2 +
 .../draw/draw_pt_fetch_shade_pipeline_llvm.c       |    2 +
 5 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c
index e8480f6..81b3068 100644
--- a/src/gallium/auxiliary/draw/draw_context.c
+++ b/src/gallium/auxiliary/draw/draw_context.c
@@ -37,6 +37,7 @@
 #include "util/u_cpu_detect.h"
 #include "util/u_inlines.h"
 #include "util/u_helpers.h"
+#include "util/u_prim.h"
 #include "draw_context.h"
 #include "draw_vs.h"
 #include "draw_gs.h"
@@ -925,3 +926,27 @@ draw_collect_pipeline_statistics(struct draw_context *draw,
 {
    draw->collect_statistics = enable;
 }
+
+/**
+ * Computes clipper invocation statistics.
+ *
+ * Figures out how many primitives would have been
+ * sent to the clipper given the specified
+ * prim info data.
+ */
+void
+draw_stats_clipper_primitives(struct draw_context *draw,
+                              const struct draw_prim_info *prim_info)
+{
+   if (draw->collect_statistics) {
+      unsigned start, i;
+      for (start = i = 0;
+           i < prim_info->primitive_count;
+           start += prim_info->primitive_lengths[i], i++)
+      {
+         draw->statistics.c_invocations +=
+            u_decomposed_prims_for_vertices(prim_info->prim,
+                                            prim_info->primitive_lengths[i]);
+      }
+   }
+}
diff --git a/src/gallium/auxiliary/draw/draw_private.h b/src/gallium/auxiliary/draw/draw_private.h
index 8777e86..e081735 100644
--- a/src/gallium/auxiliary/draw/draw_private.h
+++ b/src/gallium/auxiliary/draw/draw_private.h
@@ -461,6 +461,10 @@ draw_get_rasterizer_no_cull( struct draw_context *draw,
                              boolean scissor,
                              boolean flatshade );
 
+void
+draw_stats_clipper_primitives(struct draw_context *draw,
+                              const struct draw_prim_info *prim_info);
+
 
 /** 
  * Return index i from the index buffer.
diff --git a/src/gallium/auxiliary/draw/draw_pt_emit.c b/src/gallium/auxiliary/draw/draw_pt_emit.c
index b3d3546..ea02554 100644
--- a/src/gallium/auxiliary/draw/draw_pt_emit.c
+++ b/src/gallium/auxiliary/draw/draw_pt_emit.c
@@ -180,12 +180,6 @@ draw_pt_emit(struct pt_emit *emit,
         i < prim_info->primitive_count;
         start += prim_info->primitive_lengths[i], i++)
    {
-      if (draw->collect_statistics) {
-         draw->statistics.c_invocations +=
-            u_decomposed_prims_for_vertices(prim_info->prim,
-                                            prim_info->primitive_lengths[i]);
-      }
-         
       render->draw_elements(render,
                             elts + start,
                             prim_info->primitive_lengths[i]);
diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c
index 6d1bd11..84f86ae 100644
--- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c
+++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c
@@ -317,6 +317,8 @@ static void fetch_pipeline_generic( struct draw_pt_middle_end *middle,
     */
    draw_pt_so_emit( fpme->so_emit, vert_info, prim_info );
 
+   draw_stats_clipper_primitives(draw, prim_info);
+
    /*
     * if there's no position, need to stop now, or the latter stages
     * will try to access non-existent position output.
diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
index ecb7a6b..2e47fad 100644
--- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
+++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
@@ -411,6 +411,8 @@ llvm_pipeline_generic( struct draw_pt_middle_end *middle,
    /* stream output needs to be done before clipping */
    draw_pt_so_emit( fpme->so_emit, vert_info, prim_info );
 
+   draw_stats_clipper_primitives(draw, prim_info);
+
    /*
     * if there's no position, need to stop now, or the latter stages
     * will try to access non-existent position output.




More information about the mesa-commit mailing list