st/mesa: Only pause queries if there are any active queries to pause.
Previously, ReadPixels, PBO upload/download, and clears would call cso_save_state with CSO_PAUSE_QUERIES, causing cso_context to call pipe->set_active_query_state() twice for each operation. This can potentially cause driver work to enable/disable statistics counters. But often, there are no queries happening which need to be paused. By keeping a simple tally of active queries, we can skip this work. Reviewed-by: Tapani Pälli <tapani.palli@intel.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
2c1983f757
commit
73e4f974b8
|
@ -267,7 +267,7 @@ clear_with_quad(struct gl_context *ctx, unsigned clear_buffers)
|
|||
CSO_BIT_STREAM_OUTPUTS |
|
||||
CSO_BIT_VERTEX_ELEMENTS |
|
||||
CSO_BIT_AUX_VERTEX_BUFFER_SLOT |
|
||||
CSO_BIT_PAUSE_QUERIES |
|
||||
(st->active_queries ? CSO_BIT_PAUSE_QUERIES : 0) |
|
||||
CSO_BITS_ALL_SHADERS));
|
||||
|
||||
/* blend state: RGBA masking */
|
||||
|
|
|
@ -221,6 +221,9 @@ st_BeginQuery(struct gl_context *ctx, struct gl_query_object *q)
|
|||
return;
|
||||
}
|
||||
|
||||
if (stq->type != PIPE_QUERY_TIMESTAMP)
|
||||
st->active_queries++;
|
||||
|
||||
assert(stq->type == type);
|
||||
}
|
||||
|
||||
|
@ -228,7 +231,8 @@ st_BeginQuery(struct gl_context *ctx, struct gl_query_object *q)
|
|||
static void
|
||||
st_EndQuery(struct gl_context *ctx, struct gl_query_object *q)
|
||||
{
|
||||
struct pipe_context *pipe = st_context(ctx)->pipe;
|
||||
struct st_context *st = st_context(ctx);
|
||||
struct pipe_context *pipe = st->pipe;
|
||||
struct st_query_object *stq = st_query_object(q);
|
||||
bool ret = false;
|
||||
|
||||
|
@ -248,6 +252,9 @@ st_EndQuery(struct gl_context *ctx, struct gl_query_object *q)
|
|||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glEndQuery");
|
||||
return;
|
||||
}
|
||||
|
||||
if (stq->type != PIPE_QUERY_TIMESTAMP)
|
||||
st->active_queries--;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -141,7 +141,7 @@ try_pbo_readpixels(struct st_context *st, struct st_renderbuffer *strb,
|
|||
CSO_BIT_RASTERIZER |
|
||||
CSO_BIT_DEPTH_STENCIL_ALPHA |
|
||||
CSO_BIT_STREAM_OUTPUTS |
|
||||
CSO_BIT_PAUSE_QUERIES |
|
||||
(st->active_queries ? CSO_BIT_PAUSE_QUERIES : 0) |
|
||||
CSO_BIT_SAMPLE_MASK |
|
||||
CSO_BIT_MIN_SAMPLES |
|
||||
CSO_BIT_RENDER_CONDITION |
|
||||
|
|
|
@ -1233,7 +1233,7 @@ try_pbo_upload_common(struct gl_context *ctx,
|
|||
CSO_BIT_DEPTH_STENCIL_ALPHA |
|
||||
CSO_BIT_RASTERIZER |
|
||||
CSO_BIT_STREAM_OUTPUTS |
|
||||
CSO_BIT_PAUSE_QUERIES |
|
||||
(st->active_queries ? CSO_BIT_PAUSE_QUERIES : 0) |
|
||||
CSO_BIT_SAMPLE_MASK |
|
||||
CSO_BIT_MIN_SAMPLES |
|
||||
CSO_BIT_RENDER_CONDITION |
|
||||
|
|
|
@ -222,6 +222,12 @@ struct st_context
|
|||
GLboolean vertdata_edgeflags;
|
||||
GLboolean edgeflag_culls_prims;
|
||||
|
||||
/**
|
||||
* The number of currently active queries (excluding timer queries).
|
||||
* This is used to know if we need to pause any queries for meta ops.
|
||||
*/
|
||||
unsigned active_queries;
|
||||
|
||||
struct st_vertex_program *vp; /**< Currently bound vertex program */
|
||||
struct st_fragment_program *fp; /**< Currently bound fragment program */
|
||||
struct st_common_program *gp; /**< Currently bound geometry program */
|
||||
|
|
Loading…
Reference in New Issue