panfrost: Wire up statistics for primitives

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>
This commit is contained in:
Alyssa Rosenzweig 2019-08-08 07:10:24 -07:00
parent 7c224c1008
commit 72fc06df9c

View 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 */