Commit 2186c385 by Geoff Lang Committed by Commit Bot

Implement robust GetQuery entry points.

BUG=angleproject:1354 Change-Id: Ic1aaab56d2313a19fb0362f280dbfbf804fb3fcc Reviewed-on: https://chromium-review.googlesource.com/399040 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent b2792db1
......@@ -97,22 +97,21 @@ std::vector<gl::Path *> GatherPaths(gl::ResourceManager &resourceManager,
}
template <typename T>
gl::Error GetQueryObjectParameter(gl::Context *context, GLuint id, GLenum pname, T *params)
gl::Error GetQueryObjectParameter(gl::Query *query, GLenum pname, T *params)
{
gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
ASSERT(queryObject != nullptr);
ASSERT(query != nullptr);
switch (pname)
{
case GL_QUERY_RESULT_EXT:
return queryObject->getResult(params);
return query->getResult(params);
case GL_QUERY_RESULT_AVAILABLE_EXT:
{
bool available;
gl::Error error = queryObject->isResultAvailable(&available);
gl::Error error = query->isResultAvailable(&available);
if (!error.isError())
{
*params = static_cast<T>(available ? GL_TRUE : GL_FALSE);
*params = gl::ConvertFromGLboolean<T>(available);
}
return error;
}
......@@ -1133,24 +1132,24 @@ void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
}
}
Error Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
{
return GetQueryObjectParameter(this, id, pname, params);
handleError(GetQueryObjectParameter(getQuery(id), pname, params));
}
Error Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
void Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
{
return GetQueryObjectParameter(this, id, pname, params);
handleError(GetQueryObjectParameter(getQuery(id), pname, params));
}
Error Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
void Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
{
return GetQueryObjectParameter(this, id, pname, params);
handleError(GetQueryObjectParameter(getQuery(id), pname, params));
}
Error Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
void Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
{
return GetQueryObjectParameter(this, id, pname, params);
handleError(GetQueryObjectParameter(getQuery(id), pname, params));
}
Framebuffer *Context::getFramebuffer(unsigned int handle) const
......
......@@ -149,10 +149,10 @@ class Context final : public ValidationContext
Error endQuery(GLenum target);
Error queryCounter(GLuint id, GLenum target);
void getQueryiv(GLenum target, GLenum pname, GLint *params);
Error getQueryObjectiv(GLuint id, GLenum pname, GLint *params);
Error getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
Error getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
Error getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
void getQueryObjectiv(GLuint id, GLenum pname, GLint *params);
void getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
void getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
void getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
void setVertexAttribDivisor(GLuint index, GLuint divisor);
......
......@@ -2001,8 +2001,13 @@ bool ValidateQueryCounterEXT(Context *context, GLuint id, GLenum target)
return true;
}
bool ValidateGetQueryivBase(Context *context, GLenum target, GLenum pname)
bool ValidateGetQueryivBase(Context *context, GLenum target, GLenum pname, GLsizei *numParams)
{
if (numParams)
{
*numParams = 0;
}
if (!ValidQueryType(context, target) && target != GL_TIMESTAMP_EXT)
{
context->handleError(Error(GL_INVALID_ENUM, "Invalid query type"));
......@@ -2032,6 +2037,12 @@ bool ValidateGetQueryivBase(Context *context, GLenum target, GLenum pname)
return false;
}
if (numParams)
{
// All queries return only one value
*numParams = 1;
}
return true;
}
......@@ -2044,11 +2055,41 @@ bool ValidateGetQueryivEXT(Context *context, GLenum target, GLenum pname, GLint
return false;
}
return ValidateGetQueryivBase(context, target, pname);
return ValidateGetQueryivBase(context, target, pname, nullptr);
}
bool ValidateGetQueryObjectValueBase(Context *context, GLuint id, GLenum pname)
bool ValidateGetQueryivRobustANGLE(Context *context,
GLenum target,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLint *params)
{
if (!ValidateRobustEntryPoint(context, bufSize))
{
return false;
}
if (!ValidateGetQueryivBase(context, target, pname, length))
{
return false;
}
if (!ValidateRobustBufferSize(context, bufSize, *length))
{
return false;
}
return true;
}
bool ValidateGetQueryObjectValueBase(Context *context, GLuint id, GLenum pname, GLsizei *numParams)
{
if (numParams)
{
*numParams = 0;
}
Query *queryObject = context->getQuery(id, false, GL_NONE);
if (!queryObject)
......@@ -2074,6 +2115,11 @@ bool ValidateGetQueryObjectValueBase(Context *context, GLuint id, GLenum pname)
return false;
}
if (numParams)
{
*numParams = 1;
}
return true;
}
......@@ -2084,7 +2130,38 @@ bool ValidateGetQueryObjectivEXT(Context *context, GLuint id, GLenum pname, GLin
context->handleError(Error(GL_INVALID_OPERATION, "Timer query extension not enabled"));
return false;
}
return ValidateGetQueryObjectValueBase(context, id, pname);
return ValidateGetQueryObjectValueBase(context, id, pname, nullptr);
}
bool ValidateGetQueryObjectivRobustANGLE(Context *context,
GLuint id,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLint *params)
{
if (!context->getExtensions().disjointTimerQuery)
{
context->handleError(Error(GL_INVALID_OPERATION, "Timer query extension not enabled"));
return false;
}
if (!ValidateRobustEntryPoint(context, bufSize))
{
return false;
}
if (!ValidateGetQueryObjectValueBase(context, id, pname, length))
{
return false;
}
if (!ValidateRobustBufferSize(context, bufSize, *length))
{
return false;
}
return true;
}
bool ValidateGetQueryObjectuivEXT(Context *context, GLuint id, GLenum pname, GLuint *params)
......@@ -2095,7 +2172,39 @@ bool ValidateGetQueryObjectuivEXT(Context *context, GLuint id, GLenum pname, GLu
context->handleError(Error(GL_INVALID_OPERATION, "Query extension not enabled"));
return false;
}
return ValidateGetQueryObjectValueBase(context, id, pname);
return ValidateGetQueryObjectValueBase(context, id, pname, nullptr);
}
bool ValidateGetQueryObjectuivRobustANGLE(Context *context,
GLuint id,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLuint *params)
{
if (!context->getExtensions().disjointTimerQuery &&
!context->getExtensions().occlusionQueryBoolean && !context->getExtensions().syncQuery)
{
context->handleError(Error(GL_INVALID_OPERATION, "Query extension not enabled"));
return false;
}
if (!ValidateRobustEntryPoint(context, bufSize))
{
return false;
}
if (!ValidateGetQueryObjectValueBase(context, id, pname, length))
{
return false;
}
if (!ValidateRobustBufferSize(context, bufSize, *length))
{
return false;
}
return true;
}
bool ValidateGetQueryObjecti64vEXT(Context *context, GLuint id, GLenum pname, GLint64 *params)
......@@ -2105,7 +2214,38 @@ bool ValidateGetQueryObjecti64vEXT(Context *context, GLuint id, GLenum pname, GL
context->handleError(Error(GL_INVALID_OPERATION, "Timer query extension not enabled"));
return false;
}
return ValidateGetQueryObjectValueBase(context, id, pname);
return ValidateGetQueryObjectValueBase(context, id, pname, nullptr);
}
bool ValidateGetQueryObjecti64vRobustANGLE(Context *context,
GLuint id,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLint64 *params)
{
if (!context->getExtensions().disjointTimerQuery)
{
context->handleError(Error(GL_INVALID_OPERATION, "Timer query extension not enabled"));
return false;
}
if (!ValidateRobustEntryPoint(context, bufSize))
{
return false;
}
if (!ValidateGetQueryObjectValueBase(context, id, pname, length))
{
return false;
}
if (!ValidateRobustBufferSize(context, bufSize, *length))
{
return false;
}
return true;
}
bool ValidateGetQueryObjectui64vEXT(Context *context, GLuint id, GLenum pname, GLuint64 *params)
......@@ -2115,7 +2255,38 @@ bool ValidateGetQueryObjectui64vEXT(Context *context, GLuint id, GLenum pname, G
context->handleError(Error(GL_INVALID_OPERATION, "Timer query extension not enabled"));
return false;
}
return ValidateGetQueryObjectValueBase(context, id, pname);
return ValidateGetQueryObjectValueBase(context, id, pname, nullptr);
}
bool ValidateGetQueryObjectui64vRobustANGLE(Context *context,
GLuint id,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLuint64 *params)
{
if (!context->getExtensions().disjointTimerQuery)
{
context->handleError(Error(GL_INVALID_OPERATION, "Timer query extension not enabled"));
return false;
}
if (!ValidateRobustEntryPoint(context, bufSize))
{
return false;
}
if (!ValidateGetQueryObjectValueBase(context, id, pname, length))
{
return false;
}
if (!ValidateRobustBufferSize(context, bufSize, *length))
{
return false;
}
return true;
}
static bool ValidateUniformCommonBase(gl::Context *context,
......
......@@ -138,13 +138,46 @@ bool ValidateBeginQueryEXT(Context *context, GLenum target, GLuint id);
bool ValidateEndQueryBase(Context *context, GLenum target);
bool ValidateEndQueryEXT(Context *context, GLenum target);
bool ValidateQueryCounterEXT(Context *context, GLuint id, GLenum target);
bool ValidateGetQueryivBase(Context *context, GLenum target, GLenum pname);
bool ValidateGetQueryivBase(Context *context, GLenum target, GLenum pname, GLsizei *numParams);
bool ValidateGetQueryivEXT(Context *context, GLenum target, GLenum pname, GLint *params);
bool ValidateGetQueryObjectValueBase(Context *context, GLenum target, GLenum pname);
bool ValidateGetQueryivRobustANGLE(Context *context,
GLenum target,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLint *params);
bool ValidateGetQueryObjectValueBase(Context *context,
GLenum target,
GLenum pname,
GLsizei *numParams);
bool ValidateGetQueryObjectivEXT(Context *context, GLuint id, GLenum pname, GLint *params);
bool ValidateGetQueryObjectivRobustANGLE(Context *context,
GLuint id,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLint *params);
bool ValidateGetQueryObjectuivEXT(Context *context, GLuint id, GLenum pname, GLuint *params);
bool ValidateGetQueryObjectuivRobustANGLE(Context *context,
GLuint id,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLuint *params);
bool ValidateGetQueryObjecti64vEXT(Context *context, GLuint id, GLenum pname, GLint64 *params);
bool ValidateGetQueryObjecti64vRobustANGLE(Context *context,
GLuint id,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLint64 *params);
bool ValidateGetQueryObjectui64vEXT(Context *context, GLuint id, GLenum pname, GLuint64 *params);
bool ValidateGetQueryObjectui64vRobustANGLE(Context *context,
GLuint id,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLuint64 *params);
bool ValidateUniform(Context *context, GLenum uniformType, GLint location, GLsizei count);
bool ValidateUniformMatrix(Context *context, GLenum matrixType, GLint location, GLsizei count,
......
......@@ -945,7 +945,7 @@ bool ValidateGetQueryiv(Context *context, GLenum target, GLenum pname, GLint *pa
return false;
}
return ValidateGetQueryivBase(context, target, pname);
return ValidateGetQueryivBase(context, target, pname, nullptr);
}
bool ValidateGetQueryObjectuiv(Context *context, GLuint id, GLenum pname, GLuint *params)
......@@ -956,7 +956,7 @@ bool ValidateGetQueryObjectuiv(Context *context, GLuint id, GLenum pname, GLuint
return false;
}
return ValidateGetQueryObjectValueBase(context, id, pname);
return ValidateGetQueryObjectValueBase(context, id, pname, nullptr);
}
bool ValidateFramebufferTextureLayer(Context *context, GLenum target, GLenum attachment,
......
......@@ -187,12 +187,7 @@ void GL_APIENTRY GetQueryObjectivEXT(GLuint id, GLenum pname, GLint *params)
return;
}
Error error = context->getQueryObjectiv(id, pname, params);
if (error.isError())
{
context->handleError(error);
return;
}
context->getQueryObjectiv(id, pname, params);
}
}
......@@ -208,12 +203,7 @@ void GL_APIENTRY GetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
return;
}
Error error = context->getQueryObjectuiv(id, pname, params);
if (error.isError())
{
context->handleError(error);
return;
}
context->getQueryObjectuiv(id, pname, params);
}
}
......@@ -229,12 +219,7 @@ void GL_APIENTRY GetQueryObjecti64vEXT(GLuint id, GLenum pname, GLint64 *params)
return;
}
Error error = context->getQueryObjecti64v(id, pname, params);
if (error.isError())
{
context->handleError(error);
return;
}
context->getQueryObjecti64v(id, pname, params);
}
}
......@@ -250,12 +235,7 @@ void GL_APIENTRY GetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64 *param
return;
}
Error error = context->getQueryObjectui64v(id, pname, params);
if (error.isError())
{
context->handleError(error);
return;
}
context->getQueryObjectui64v(id, pname, params);
}
}
......@@ -2584,7 +2564,19 @@ GetQueryivRobustANGLE(GLenum target, GLenum pname, GLsizei bufSize, GLsizei *len
"(GLenum target = 0x%X, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = "
"0x%0.8p, GLint* params = 0x%0.8p)",
target, pname, bufSize, length, params);
UNIMPLEMENTED();
Context *context = GetValidGlobalContext();
if (context)
{
GLsizei numParams = 0;
if (!ValidateGetQueryivRobustANGLE(context, target, pname, bufSize, &numParams, params))
{
return;
}
context->getQueryiv(target, pname, params);
SetRobustLengthParam(length, numParams);
}
}
ANGLE_EXPORT void GL_APIENTRY GetQueryObjectuivRobustANGLE(GLuint id,
......@@ -2597,7 +2589,19 @@ ANGLE_EXPORT void GL_APIENTRY GetQueryObjectuivRobustANGLE(GLuint id,
"(GLuint id = %u, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, "
"GLint* params = 0x%0.8p)",
id, pname, bufSize, length, params);
UNIMPLEMENTED();
Context *context = GetValidGlobalContext();
if (context)
{
GLsizei numParams = 0;
if (!ValidateGetQueryObjectuivRobustANGLE(context, id, pname, bufSize, &numParams, params))
{
return;
}
context->getQueryObjectuiv(id, pname, params);
SetRobustLengthParam(length, numParams);
}
}
ANGLE_EXPORT void GL_APIENTRY GetBufferPointervRobustANGLE(GLenum target,
......@@ -3174,7 +3178,19 @@ ANGLE_EXPORT void GL_APIENTRY GetQueryObjectivRobustANGLE(GLuint id,
"(GLuint id = %d, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, "
"GLuint *params = 0x%0.8p)",
id, pname, bufSize, length, params);
UNIMPLEMENTED();
Context *context = GetValidGlobalContext();
if (context)
{
GLsizei numParams = 0;
if (!ValidateGetQueryObjectivRobustANGLE(context, id, pname, bufSize, &numParams, params))
{
return;
}
context->getQueryObjectiv(id, pname, params);
SetRobustLengthParam(length, numParams);
}
}
ANGLE_EXPORT void GL_APIENTRY GetQueryObjecti64vRobustANGLE(GLuint id,
......@@ -3187,7 +3203,19 @@ ANGLE_EXPORT void GL_APIENTRY GetQueryObjecti64vRobustANGLE(GLuint id,
"(GLuint id = %d, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, "
"GLint64 *params = 0x%0.8p)",
id, pname, bufSize, length, params);
UNIMPLEMENTED();
Context *context = GetValidGlobalContext();
if (context)
{
GLsizei numParams = 0;
if (!ValidateGetQueryObjecti64vRobustANGLE(context, id, pname, bufSize, &numParams, params))
{
return;
}
context->getQueryObjecti64v(id, pname, params);
SetRobustLengthParam(length, numParams);
}
}
ANGLE_EXPORT void GL_APIENTRY GetQueryObjectui64vRobustANGLE(GLuint id,
......@@ -3200,7 +3228,20 @@ ANGLE_EXPORT void GL_APIENTRY GetQueryObjectui64vRobustANGLE(GLuint id,
"(GLuint id = %d, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, "
"GLuint64 *params = 0x%0.8p)",
id, pname, bufSize, length, params);
UNIMPLEMENTED();
Context *context = GetValidGlobalContext();
if (context)
{
GLsizei numParams = 0;
if (!ValidateGetQueryObjectui64vRobustANGLE(context, id, pname, bufSize, &numParams,
params))
{
return;
}
context->getQueryObjectui64v(id, pname, params);
SetRobustLengthParam(length, numParams);
}
}
} // gl
......@@ -310,12 +310,7 @@ void GL_APIENTRY GetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
return;
}
Error error = context->getQueryObjectuiv(id, pname, params);
if (error.isError())
{
context->handleError(error);
return;
}
context->getQueryObjectuiv(id, pname, params);
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment