static void GLAPIENTRY _mesa_EndQueryIndexed(GLenum target, GLuint index) { struct gl_query_object *q, **bindpt; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); if (MESA_VERBOSE & VERBOSE_API) _mesa_debug(ctx, "glEndQueryIndexed(%s, %u)\n", _mesa_lookup_enum_by_nr(target), index); if (!query_error_check_index(ctx, target, index)) return; FLUSH_VERTICES(ctx, _NEW_DEPTH); bindpt = get_query_binding_point(ctx, target); if (!bindpt) { _mesa_error(ctx, GL_INVALID_ENUM, "glEndQuery{Indexed}(target)"); return; } /* XXX should probably refcount query objects */ q = *bindpt; *bindpt = NULL; if (!q || !q->Active) { _mesa_error(ctx, GL_INVALID_OPERATION, "glEndQuery{Indexed}(no matching glBeginQuery{Indexed})"); return; } q->Active = GL_FALSE; ctx->Driver.EndQuery(ctx, q); }
void GLAPIENTRY _mesa_EndQueryIndexed(GLenum target, GLuint index) { struct gl_query_object *q, **bindpt; GET_CURRENT_CONTEXT(ctx); if (MESA_VERBOSE & VERBOSE_API) _mesa_debug(ctx, "glEndQueryIndexed(%s, %u)\n", _mesa_lookup_enum_by_nr(target), index); if (!query_error_check_index(ctx, target, index)) return; FLUSH_VERTICES(ctx, _NEW_DEPTH); bindpt = get_query_binding_point(ctx, target); if (!bindpt) { _mesa_error(ctx, GL_INVALID_ENUM, "glEndQuery{Indexed}(target)"); return; } /* XXX should probably refcount query objects */ q = *bindpt; /* Check for GL_ANY_SAMPLES_PASSED vs GL_SAMPLES_PASSED. */ if (q && q->Target != target) { _mesa_error(ctx, GL_INVALID_OPERATION, "glEndQuery(target=%s with active query of target %s)", _mesa_lookup_enum_by_nr(target), _mesa_lookup_enum_by_nr(q->Target)); return; } *bindpt = NULL; if (!q || !q->Active) { _mesa_error(ctx, GL_INVALID_OPERATION, "glEndQuery{Indexed}(no matching glBeginQuery{Indexed})"); return; } q->Active = GL_FALSE; ctx->Driver.EndQuery(ctx, q); }
static void GLAPIENTRY _mesa_GetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint *params) { struct gl_query_object *q = NULL, **bindpt = NULL; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); if (MESA_VERBOSE & VERBOSE_API) _mesa_debug(ctx, "glGetQueryIndexediv(%s, %u, %s)\n", _mesa_lookup_enum_by_nr(target), index, _mesa_lookup_enum_by_nr(pname)); if (!query_error_check_index(ctx, target, index)) return; if (target == GL_TIMESTAMP) { if (!ctx->Extensions.ARB_timer_query) { _mesa_error(ctx, GL_INVALID_ENUM, "glGetQueryARB(target)"); return; } } else { bindpt = get_query_binding_point(ctx, target); if (!bindpt) { _mesa_error(ctx, GL_INVALID_ENUM, "glGetQuery{Indexed}iv(target)"); return; } q = *bindpt; } switch (pname) { case GL_QUERY_COUNTER_BITS_ARB: switch (target) { case GL_SAMPLES_PASSED: *params = ctx->Const.QueryCounterBits.SamplesPassed; break; case GL_ANY_SAMPLES_PASSED: /* 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_TIME_ELAPSED: *params = ctx->Const.QueryCounterBits.TimeElapsed; break; case GL_TIMESTAMP: *params = ctx->Const.QueryCounterBits.Timestamp; break; case GL_PRIMITIVES_GENERATED: *params = ctx->Const.QueryCounterBits.PrimitivesGenerated; break; case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: *params = ctx->Const.QueryCounterBits.PrimitivesWritten; break; default: _mesa_problem(ctx, "Unknown target in glGetQueryIndexediv(target = %s)", _mesa_lookup_enum_by_nr(target)); *params = 0; break; } break; case GL_CURRENT_QUERY_ARB: *params = q ? q->Id : 0; break; default: _mesa_error(ctx, GL_INVALID_ENUM, "glGetQuery{Indexed}iv(pname)"); return; } }
static void GLAPIENTRY _mesa_BeginQueryIndexed(GLenum target, GLuint index, GLuint id) { struct gl_query_object *q, **bindpt; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); if (MESA_VERBOSE & VERBOSE_API) _mesa_debug(ctx, "glBeginQueryIndexed(%s, %u, %u)\n", _mesa_lookup_enum_by_nr(target), index, id); if (!query_error_check_index(ctx, target, index)) return; FLUSH_VERTICES(ctx, _NEW_DEPTH); bindpt = get_query_binding_point(ctx, target); if (!bindpt) { _mesa_error(ctx, GL_INVALID_ENUM, "glBeginQuery{Indexed}(target)"); return; } if (id == 0) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginQuery{Indexed}(id==0)"); return; } q = _mesa_lookup_query_object(ctx, id); if (!q) { if (ctx->API == API_OPENGL_CORE) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginQuery{Indexed}(non-gen name)"); return; } else { /* create new object */ q = ctx->Driver.NewQueryObject(ctx, id); if (!q) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBeginQuery{Indexed}"); return; } _mesa_HashInsert(ctx->Query.QueryObjects, id, q); } } else { /* pre-existing object */ if (q->Active) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginQuery{Indexed}(query already active)"); return; } } q->Target = target; q->Active = GL_TRUE; q->Result = 0; q->Ready = GL_FALSE; /* XXX should probably refcount query objects */ *bindpt = q; ctx->Driver.BeginQuery(ctx, q); }
void GLAPIENTRY _mesa_BeginQueryIndexed(GLenum target, GLuint index, GLuint id) { struct gl_query_object *q, **bindpt; GET_CURRENT_CONTEXT(ctx); if (MESA_VERBOSE & VERBOSE_API) _mesa_debug(ctx, "glBeginQueryIndexed(%s, %u, %u)\n", _mesa_lookup_enum_by_nr(target), index, id); if (!query_error_check_index(ctx, target, index)) return; FLUSH_VERTICES(ctx, _NEW_DEPTH); bindpt = get_query_binding_point(ctx, target); if (!bindpt) { _mesa_error(ctx, GL_INVALID_ENUM, "glBeginQuery{Indexed}(target)"); return; } /* From the GL_ARB_occlusion_query spec: * * "If BeginQueryARB is called while another query is already in * progress with the same target, an INVALID_OPERATION error is * generated." */ if (*bindpt) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginQuery{Indexed}(target=%s is active)", _mesa_lookup_enum_by_nr(target)); return; } if (id == 0) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginQuery{Indexed}(id==0)"); return; } q = _mesa_lookup_query_object(ctx, id); if (!q) { if (ctx->API != API_OPENGL_COMPAT) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginQuery{Indexed}(non-gen name)"); return; } else { /* create new object */ q = ctx->Driver.NewQueryObject(ctx, id); if (!q) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBeginQuery{Indexed}"); return; } _mesa_HashInsert(ctx->Query.QueryObjects, id, q); } } else { /* pre-existing object */ if (q->Active) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginQuery{Indexed}(query already active)"); return; } } q->Target = target; q->Active = GL_TRUE; q->Result = 0; q->Ready = GL_FALSE; q->EverBound = GL_TRUE; /* XXX should probably refcount query objects */ *bindpt = q; ctx->Driver.BeginQuery(ctx, q); }