It looks like you can have the SOL stage increment that counter even when not doing any actual streamout, which should give you the correct semantics.
See the definition of 3DSTATE_STREAMOUT in the Haswell PRM, Volume 2b. You want: - dw1.31 SO Function Enable = 1 - dw1.25 SO Statistics Enable = 1 - dw1.8-11 SO Buffer Enable [n] = 0 This should behave just like having the unit disabled, except the SO_PRIMITIVE_STORAGE_NEEDED registers will increment. -- Chris On Wed, Jun 18, 2014 at 9:51 PM, Iago Toral Quiroga <ito...@igalia.com> wrote: > 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. > > From ARB_transform_feedback3: > > "When a generated primitive query for a vertex stream is active, the > primitives-generated count is incremented every time a primitive emitted to > that stream reaches the Discarding Rasterization stage (see Section 3.x) > right before rasterization. This counter is incremented whether or not > transform feedback is active." > > Unfortunately, I don't see any registers that provide the number of primitives > written to a specific stream other than the ones that track the number of > primitives written to transform feedback in the SOL stage, so I think we can't > implement this exactly as specified. This should not be a major issue though, > since non-zero streams are pointless unless they are bound to transform > feedback > buffers anyway. > > Also in ARB_transform_feedback3: > > "These two types of queries can be used together to determine if all > primitives in a given vertex stream have been written to the bound > feedback buffers; if both queries are run simultaneously and the query > results are equal, all primitives have been written to the buffer(s). If > the number of primitives written is less than the number of primitives > generated, one or more buffers overflowed. > > This refers to GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN and > GL_PRIMITIVES_GENERATED. This behavior is achieved by implementing primitives > generated queries through GEN7_SO_PRIM_STORAGE_NEEDED for non-zero streams. > --- > src/mesa/drivers/dri/i965/gen6_queryobj.c | 13 +++++++++---- > 1 file 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..ee33e1d 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 && stream > 0) { > + 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: > -- > 1.9.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev