[Mesa-dev] [PATCH v2 19/23] mesa: Enable simultaneous queries on different streams.
Ian Romanick
idr at freedesktop.org
Wed Jun 18 13:43:51 PDT 2014
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
On 06/18/2014 02:51 AM, Iago Toral Quiroga wrote:
> It should be possible to query the number of primitives written to each
> individual stream by a geometry shader in a single draw call. For that
> we need to have up to MAX_VERTEX_STREAM separate query objects.
> ---
> src/mesa/main/mtypes.h | 4 ++--
> src/mesa/main/queryobj.c | 17 +++++++++--------
> 2 files changed, 11 insertions(+), 10 deletions(-)
>
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 2eaf2f5..7d5c789 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -2912,8 +2912,8 @@ struct gl_query_state
> struct gl_query_object *CondRenderQuery;
>
> /** GL_EXT_transform_feedback */
> - struct gl_query_object *PrimitivesGenerated;
> - struct gl_query_object *PrimitivesWritten;
> + struct gl_query_object *PrimitivesGenerated[MAX_VERTEX_STREAMS];
> + struct gl_query_object *PrimitivesWritten[MAX_VERTEX_STREAMS];
>
> /** GL_ARB_timer_query */
> struct gl_query_object *TimeElapsed;
> diff --git a/src/mesa/main/queryobj.c b/src/mesa/main/queryobj.c
> index 512f45a..932359c 100644
> --- a/src/mesa/main/queryobj.c
> +++ b/src/mesa/main/queryobj.c
> @@ -144,11 +144,12 @@ _mesa_init_query_object_functions(struct dd_function_table *driver)
>
>
> /**
> - * Return pointer to the query object binding point for the given target.
> + * Return pointer to the query object binding point for the given target and
> + * index.
> * \return NULL if invalid target, else the address of binding point
> */
> static struct gl_query_object **
> -get_query_binding_point(struct gl_context *ctx, GLenum target)
> +get_query_binding_point(struct gl_context *ctx, GLenum target, GLuint index)
> {
> switch (target) {
> case GL_SAMPLES_PASSED_ARB:
> @@ -174,12 +175,12 @@ get_query_binding_point(struct gl_context *ctx, GLenum target)
> return NULL;
> case GL_PRIMITIVES_GENERATED:
> if (ctx->Extensions.EXT_transform_feedback)
> - return &ctx->Query.PrimitivesGenerated;
> + return &ctx->Query.PrimitivesGenerated[index];
> else
> return NULL;
> case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
> if (ctx->Extensions.EXT_transform_feedback)
> - return &ctx->Query.PrimitivesWritten;
> + return &ctx->Query.PrimitivesWritten[index];
> else
> return NULL;
> default:
> @@ -240,7 +241,7 @@ _mesa_DeleteQueries(GLsizei n, const GLuint *ids)
> if (q) {
> if (q->Active) {
> struct gl_query_object **bindpt;
> - bindpt = get_query_binding_point(ctx, q->Target);
> + bindpt = get_query_binding_point(ctx, q->Target, q->Stream);
> assert(bindpt); /* Should be non-null for active q. */
> if (bindpt) {
> *bindpt = NULL;
> @@ -313,7 +314,7 @@ _mesa_BeginQueryIndexed(GLenum target, GLuint index, GLuint id)
>
> FLUSH_VERTICES(ctx, 0);
>
> - bindpt = get_query_binding_point(ctx, target);
> + bindpt = get_query_binding_point(ctx, target, index);
> if (!bindpt) {
> _mesa_error(ctx, GL_INVALID_ENUM, "glBeginQuery{Indexed}(target)");
> return;
> @@ -391,7 +392,7 @@ _mesa_EndQueryIndexed(GLenum target, GLuint index)
>
> FLUSH_VERTICES(ctx, 0);
>
> - bindpt = get_query_binding_point(ctx, target);
> + bindpt = get_query_binding_point(ctx, target, index);
> if (!bindpt) {
> _mesa_error(ctx, GL_INVALID_ENUM, "glEndQuery{Indexed}(target)");
> return;
> @@ -518,7 +519,7 @@ _mesa_GetQueryIndexediv(GLenum target, GLuint index, GLenum pname,
> }
> }
> else {
> - bindpt = get_query_binding_point(ctx, target);
> + bindpt = get_query_binding_point(ctx, target, index);
> if (!bindpt) {
> _mesa_error(ctx, GL_INVALID_ENUM, "glGetQuery{Indexed}iv(target)");
> return;
>
More information about the mesa-dev
mailing list