summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/gen6_queryobj.c
diff options
context:
space:
mode:
authorIago Toral Quiroga <itoral@igalia.com>2014-06-17 13:45:18 +0200
committerIago Toral Quiroga <itoral@igalia.com>2014-06-30 08:08:50 +0200
commit3178d2474ae5bdd1102fb3d76a60d1d63c961ff5 (patch)
tree1d0ae7109ebf0a1603a763cfea133ce99f98db39 /src/mesa/drivers/dri/i965/gen6_queryobj.c
parenta374685f092cbe57aae89e6977b8bdde0c8ec623 (diff)
downloadexternal_mesa3d-3178d2474ae5bdd1102fb3d76a60d1d63c961ff5.zip
external_mesa3d-3178d2474ae5bdd1102fb3d76a60d1d63c961ff5.tar.gz
external_mesa3d-3178d2474ae5bdd1102fb3d76a60d1d63c961ff5.tar.bz2
i965: Implement GL_PRIMITIVES_GENERATED with non-zero streams.
So far we have been using CL_INVOCATION_COUNT to resolve this query but this is no good with streams, as only stream 0 reaches the clipping stage. Instead we will use SO_PRIM_STORAGE_NEEDED which can keep track of the primitives sent to each individual stream. Since SO_PRIM_STORAGE_NEEDED is related to the SOL stage and according to ARB_transform_feedback3 we need to be able to query primitives generated in each stream whether transform feedback is active or not what we do is to enable the SOL unit even if transform feedback is not active but disable all output buffers in that case. This effectively disables transform feedback but permits activation of statistics enabling SO_PRIM_STORAGE_NEEDED even when transform feedback is not active. Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
Diffstat (limited to 'src/mesa/drivers/dri/i965/gen6_queryobj.c')
-rw-r--r--src/mesa/drivers/dri/i965/gen6_queryobj.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/mesa/drivers/dri/i965/gen6_queryobj.c b/src/mesa/drivers/dri/i965/gen6_queryobj.c
index 0cb64ca..b4b1509 100644
--- a/src/mesa/drivers/dri/i965/gen6_queryobj.c
+++ b/src/mesa/drivers/dri/i965/gen6_queryobj.c
@@ -84,11 +84,16 @@ brw_store_register_mem64(struct brw_context *brw,
static void
write_primitives_generated(struct brw_context *brw,
- drm_intel_bo *query_bo, int idx)
+ drm_intel_bo *query_bo, int stream, int idx)
{
intel_batchbuffer_emit_mi_flush(brw);
- brw_store_register_mem64(brw, query_bo, CL_INVOCATION_COUNT, idx);
+ if (brw->gen >= 7) {
+ brw_store_register_mem64(brw, query_bo,
+ GEN7_SO_PRIM_STORAGE_NEEDED(stream), idx);
+ } else {
+ brw_store_register_mem64(brw, query_bo, CL_INVOCATION_COUNT, idx);
+ }
}
static void
@@ -240,7 +245,7 @@ gen6_begin_query(struct gl_context *ctx, struct gl_query_object *q)
break;
case GL_PRIMITIVES_GENERATED:
- write_primitives_generated(brw, query->bo, 0);
+ write_primitives_generated(brw, query->bo, query->Base.Stream, 0);
break;
case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
@@ -279,7 +284,7 @@ gen6_end_query(struct gl_context *ctx, struct gl_query_object *q)
break;
case GL_PRIMITIVES_GENERATED:
- write_primitives_generated(brw, query->bo, 1);
+ write_primitives_generated(brw, query->bo, query->Base.Stream, 1);
break;
case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: