diff options
author | Rafael Antognolli <[email protected]> | 2017-01-20 09:53:23 -0800 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2017-02-21 16:28:31 -0800 |
commit | a80ebff1b9954173308b35cd1d6c73c8366522c0 (patch) | |
tree | 80280540051803329fa67e52958c0b7287603967 | |
parent | 273bab26af543535d34b5e8accfd20c9314debde (diff) |
mesa: Track transform feedback overflow query objects.
Also update checks on conditional rendering.
Signed-off-by: Rafael Antognolli <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r-- | src/mesa/main/condrender.c | 4 | ||||
-rw-r--r-- | src/mesa/main/queryobj.c | 21 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_cb_queryobj.c | 6 |
3 files changed, 30 insertions, 1 deletions
diff --git a/src/mesa/main/condrender.c b/src/mesa/main/condrender.c index 46c6036d2a5..2ea2c8821d8 100644 --- a/src/mesa/main/condrender.c +++ b/src/mesa/main/condrender.c @@ -99,7 +99,9 @@ _mesa_BeginConditionalRender(GLuint queryId, GLenum mode) */ if ((q->Target != GL_SAMPLES_PASSED && q->Target != GL_ANY_SAMPLES_PASSED && - q->Target != GL_ANY_SAMPLES_PASSED_CONSERVATIVE) || q->Active) { + q->Target != GL_ANY_SAMPLES_PASSED_CONSERVATIVE && + q->Target != GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB && + q->Target != GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB) || q->Active) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginConditionalRender()"); return; } diff --git a/src/mesa/main/queryobj.c b/src/mesa/main/queryobj.c index 1fa02795c1c..e4edb519344 100644 --- a/src/mesa/main/queryobj.c +++ b/src/mesa/main/queryobj.c @@ -197,6 +197,16 @@ get_query_binding_point(struct gl_context *ctx, GLenum target, GLuint index) return &ctx->Query.PrimitivesWritten[index]; else return NULL; + case GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB: + if (ctx->Extensions.ARB_transform_feedback_overflow_query) + return &ctx->Query.TransformFeedbackOverflow[index]; + else + return NULL; + case GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB: + if (ctx->Extensions.ARB_transform_feedback_overflow_query) + return &ctx->Query.TransformFeedbackOverflowAny; + else + return NULL; case GL_VERTICES_SUBMITTED_ARB: case GL_PRIMITIVES_SUBMITTED_ARB: @@ -293,6 +303,8 @@ _mesa_CreateQueries(GLenum target, GLsizei n, GLuint *ids) case GL_TIMESTAMP: case GL_PRIMITIVES_GENERATED: case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: + case GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB: + case GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB: break; default: _mesa_error(ctx, GL_INVALID_ENUM, "glCreateQueries(invalid target = %s)", @@ -368,6 +380,7 @@ query_error_check_index(struct gl_context *ctx, GLenum target, GLuint index) switch (target) { case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: case GL_PRIMITIVES_GENERATED: + case GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB: if (index >= ctx->Const.MaxVertexStreams) { _mesa_error(ctx, GL_INVALID_VALUE, "glBeginQueryIndexed(index>=MaxVertexStreams)"); @@ -677,6 +690,14 @@ _mesa_GetQueryIndexediv(GLenum target, GLuint index, GLenum pname, case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: *params = ctx->Const.QueryCounterBits.PrimitivesWritten; break; + case GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB: + case GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB: + /* The minimum value of this is 1 if it's nonzero, and the value + * is only ever GL_TRUE or GL_FALSE, so no sense in reporting more + * bits. + */ + *params = 1; + break; case GL_VERTICES_SUBMITTED_ARB: *params = ctx->Const.QueryCounterBits.VerticesSubmitted; break; diff --git a/src/mesa/state_tracker/st_cb_queryobj.c b/src/mesa/state_tracker/st_cb_queryobj.c index 24896762340..b1ac2aab6da 100644 --- a/src/mesa/state_tracker/st_cb_queryobj.c +++ b/src/mesa/state_tracker/st_cb_queryobj.c @@ -114,6 +114,12 @@ st_BeginQuery(struct gl_context *ctx, struct gl_query_object *q) case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: type = PIPE_QUERY_PRIMITIVES_EMITTED; break; + case GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB: + type = PIPE_QUERY_SO_OVERFLOW_PREDICATE; + break; + case GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB: + type = PIPE_QUERY_SO_OVERFLOW_PREDICATE; + break; case GL_TIME_ELAPSED: if (st->has_time_elapsed) type = PIPE_QUERY_TIME_ELAPSED; |