[Mesa-dev,v2,19/23] mesa: Enable simultaneous queries on different streams.

Submitted by Iago Toral Quiroga on June 18, 2014, 9:51 a.m.

Details

Message ID 1403085110-31168-20-git-send-email-itoral@igalia.com
State Accepted
Commit 0b84fa2c52cbaff5963b7d7aa4f27c316fe0a89c
Headers show

Not browsing as part of any series.

Commit Message

Iago Toral Quiroga June 18, 2014, 9:51 a.m.
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(-)

Patch hide | download patch | download mbox

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;

Comments

Reviewed-by: Ian Romanick <ian.d.romanick@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;
>