From a80ebff1b9954173308b35cd1d6c73c8366522c0 Mon Sep 17 00:00:00 2001 From: Rafael Antognolli Date: Fri, 20 Jan 2017 09:53:23 -0800 Subject: [PATCH] mesa: Track transform feedback overflow query objects. Also update checks on conditional rendering. Signed-off-by: Rafael Antognolli Reviewed-by: Kenneth Graunke --- src/mesa/main/condrender.c | 4 +++- src/mesa/main/queryobj.c | 21 +++++++++++++++++++++ src/mesa/state_tracker/st_cb_queryobj.c | 6 ++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/mesa/main/condrender.c b/src/mesa/main/condrender.c index 46c6036..2ea2c88 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 1fa0279..e4edb51 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 2489676..b1ac2aa 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; -- 2.7.4