void GL_APIENTRY GetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params) { EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params); Context *context = GetValidGlobalContext(); if (context) { Query *queryObject = context->getQuery(id, false, GL_NONE); if (!queryObject) { context->recordError(Error(GL_INVALID_OPERATION)); return; } if (context->getState().getActiveQueryId(queryObject->getType()) == id) { context->recordError(Error(GL_INVALID_OPERATION)); return; } switch(pname) { case GL_QUERY_RESULT_EXT: { Error error = queryObject->getResult(params); if (error.isError()) { context->recordError(error); return; } } break; case GL_QUERY_RESULT_AVAILABLE_EXT: { Error error = queryObject->isResultAvailable(params); if (error.isError()) { context->recordError(error); return; } } break; default: context->recordError(Error(GL_INVALID_ENUM)); return; } } }
bool ValidateBeginQuery(gl::Context *context, GLenum target, GLuint id) { if (!ValidQueryType(context, target)) { return gl::error(GL_INVALID_ENUM, false); } if (id == 0) { return gl::error(GL_INVALID_OPERATION, false); } // From EXT_occlusion_query_boolean: If BeginQueryEXT is called with an <id> // of zero, if the active query object name for <target> is non-zero (for the // targets ANY_SAMPLES_PASSED_EXT and ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, if // the active query for either target is non-zero), if <id> is the name of an // existing query object whose type does not match <target>, or if <id> is the // active query object name for any query type, the error INVALID_OPERATION is // generated. // Ensure no other queries are active // NOTE: If other queries than occlusion are supported, we will need to check // separately that: // a) The query ID passed is not the current active query for any target/type // b) There are no active queries for the requested target (and in the case // of GL_ANY_SAMPLES_PASSED_EXT and GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, // no query may be active for either if glBeginQuery targets either. if (context->isQueryActive()) { return gl::error(GL_INVALID_OPERATION, false); } Query *queryObject = context->getQuery(id, true, target); // check that name was obtained with glGenQueries if (!queryObject) { return gl::error(GL_INVALID_OPERATION, false); } // check for type mismatch if (queryObject->getType() != target) { return gl::error(GL_INVALID_OPERATION, false); } return true; }