panfrost: Wire up statistics for primitives
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 8 Aug 2019 14:10:24 +0000 (07:10 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tue, 13 Aug 2019 16:43:04 +0000 (09:43 -0700)
GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN should now be handled.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
src/gallium/drivers/panfrost/pan_context.c

index 0b9360c0f63e0c494e962d6f2f1f90cc9d9ec470..661c1474cd50581eb8fd57562e7237e4783c08c4 100644 (file)
@@ -38,6 +38,7 @@
 #include "util/half_float.h"
 #include "util/u_helpers.h"
 #include "util/u_format.h"
+#include "util/u_prim.h"
 #include "util/u_prim_restart.h"
 #include "indices/u_primconvert.h"
 #include "tgsi/tgsi_parse.h"
@@ -234,6 +235,9 @@ panfrost_invalidate_frame(struct panfrost_context *ctx)
 
         /* XXX */
         ctx->dirty |= PAN_DIRTY_SAMPLERS | PAN_DIRTY_TEXTURES;
+
+        /* TODO: When does this need to be handled? */
+        ctx->active_queries = true;
 }
 
 /* In practice, every field of these payloads should be configurable
@@ -1560,6 +1564,26 @@ panfrost_scissor_culls_everything(struct panfrost_context *ctx)
         return (ss->minx == ss->maxx) || (ss->miny == ss->maxy);
 }
 
+/* Count generated primitives (when there is no geom/tess shaders) for
+ * transform feedback */
+
+static void
+panfrost_statistics_record(
+                struct panfrost_context *ctx,
+                const struct pipe_draw_info *info)
+{
+        if (!ctx->active_queries)
+                return;
+
+        uint32_t prims = u_prims_for_vertices(info->mode, info->count);
+        ctx->prims_generated += prims;
+
+        if (ctx->streamout.num_targets <= 0)
+                return;
+
+        ctx->tf_prims_generated += prims;
+}
+
 static void
 panfrost_draw_vbo(
         struct pipe_context *pipe,
@@ -1646,6 +1670,8 @@ panfrost_draw_vbo(
                 draw_flags |= 0x800;
         }
 
+        panfrost_statistics_record(ctx, info);
+
         if (info->index_size) {
                 /* Calculate the min/max index used so we can figure out how
                  * many times to invoke the vertex shader */