X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fqueryobj.c;h=79600d7db19c2d708218598c9be14430893bf010;hb=105178db8f5d7d45b268c7664388d7db90350704;hp=7a70b592c479435a48209e2cf88ab46bbf204bd6;hpb=922be4eab9d2a5d169dc84b3f2d99f08f3d16e5c;p=mesa.git diff --git a/src/mesa/main/queryobj.c b/src/mesa/main/queryobj.c index 7a70b592c47..79600d7db19 100644 --- a/src/mesa/main/queryobj.c +++ b/src/mesa/main/queryobj.c @@ -165,6 +165,20 @@ get_pipe_stats_binding_point(struct gl_context *ctx, static struct gl_query_object ** get_query_binding_point(struct gl_context *ctx, GLenum target, GLuint index) { + + /* From GL_EXT_occlusion_query_boolean spec: + * + * "Accepted by the parameter of BeginQueryEXT, EndQueryEXT, + * and GetQueryivEXT: + * + * ANY_SAMPLES_PASSED_EXT 0x8C2F + * ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A" + */ + if ((_mesa_is_gles(ctx) && ctx->Version == 20) && + (target != GL_ANY_SAMPLES_PASSED && + target != GL_ANY_SAMPLES_PASSED_CONSERVATIVE)) + return NULL; + switch (target) { case GL_SAMPLES_PASSED_ARB: if (ctx->Extensions.ARB_occlusion_query) @@ -197,6 +211,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: @@ -268,7 +292,7 @@ create_queries(struct gl_context *ctx, GLenum target, GLsizei n, GLuint *ids, q->EverBound = GL_TRUE; } ids[i] = first + i; - _mesa_HashInsert(ctx->Query.QueryObjects, first + i, q); + _mesa_HashInsertLocked(ctx->Query.QueryObjects, first + i, q); } } } @@ -293,6 +317,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)", @@ -333,7 +359,7 @@ _mesa_DeleteQueries(GLsizei n, const GLuint *ids) q->Active = GL_FALSE; ctx->Driver.EndQuery(ctx, q); } - _mesa_HashRemove(ctx->Query.QueryObjects, ids[i]); + _mesa_HashRemoveLocked(ctx->Query.QueryObjects, ids[i]); ctx->Driver.DeleteQuery(ctx, q); } } @@ -368,6 +394,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)"); @@ -435,7 +462,7 @@ _mesa_BeginQueryIndexed(GLenum target, GLuint index, GLuint id) _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBeginQuery{Indexed}"); return; } - _mesa_HashInsert(ctx->Query.QueryObjects, id, q); + _mesa_HashInsertLocked(ctx->Query.QueryObjects, id, q); } } else { @@ -577,7 +604,7 @@ _mesa_QueryCounter(GLuint id, GLenum target) _mesa_error(ctx, GL_OUT_OF_MEMORY, "glQueryCounter"); return; } - _mesa_HashInsert(ctx->Query.QueryObjects, id, q); + _mesa_HashInsertLocked(ctx->Query.QueryObjects, id, q); } else { if (q->Target && q->Target != GL_TIMESTAMP) { @@ -636,6 +663,19 @@ _mesa_GetQueryIndexediv(GLenum target, GLuint index, GLenum pname, if (!query_error_check_index(ctx, target, index)) return; + /* From the GL_EXT_occlusion_query_boolean spec: + * + * "The error INVALID_ENUM is generated if GetQueryivEXT is called where + * is not CURRENT_QUERY_EXT." + * + * Same rule is present also in ES 3.2 spec. + */ + if (_mesa_is_gles(ctx) && pname != GL_CURRENT_QUERY) { + _mesa_error(ctx, GL_INVALID_ENUM, "glGetQueryivEXT(%s)", + _mesa_enum_to_string(pname)); + return; + } + if (target == GL_TIMESTAMP) { if (!ctx->Extensions.ARB_timer_query) { _mesa_error(ctx, GL_INVALID_ENUM, "glGetQueryARB(target)"); @@ -677,6 +717,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; @@ -754,10 +802,28 @@ get_query_object(struct gl_context *ctx, const char *func, return; } + /* From GL_EXT_occlusion_query_boolean spec: + * + * "Accepted by the parameter of GetQueryObjectivEXT and + * GetQueryObjectuivEXT: + * + * QUERY_RESULT_EXT 0x8866 + * QUERY_RESULT_AVAILABLE_EXT 0x8867" + * + * Same rule is present also in ES 3.2 spec. + */ + if (_mesa_is_gles(ctx) && + (pname != GL_QUERY_RESULT && pname != GL_QUERY_RESULT_AVAILABLE)) { + _mesa_error(ctx, GL_INVALID_ENUM, "%s(%s)", func, + _mesa_enum_to_string(pname)); + return; + } + if (buf && buf != ctx->Shared->NullBufferObj) { bool is_64bit = ptype == GL_INT64_ARB || ptype == GL_UNSIGNED_INT64_ARB; - if (!ctx->Extensions.ARB_query_buffer_object) { + if (!ctx->Extensions.ARB_query_buffer_object && + !ctx->Extensions.EXT_disjoint_timer_query) { _mesa_error(ctx, GL_INVALID_OPERATION, "%s(not supported)", func); return; } @@ -766,6 +832,11 @@ get_query_object(struct gl_context *ctx, const char *func, return; } + if (offset < 0) { + _mesa_error(ctx, GL_INVALID_VALUE, "%s(offset is negative)", func); + return; + } + switch (pname) { case GL_QUERY_RESULT: case GL_QUERY_RESULT_NO_WAIT: