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