Commit 79f2f45c by Jamie Madill

Fix allowing ES3 enum queries to call through to ES2 contexts.

In some cases we would not validate the enums against the context version, allowing the app to call through to unimplemented features. BUG=angle:540 Change-Id: Ic89422a3a48882314c054f133961af0b4d8d739a Reviewed-on: https://chromium-review.googlesource.com/180970Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Reviewed-by: 's avatarNicolas Capens <nicolascapens@chromium.org> Commit-Queue: Nicolas Capens <nicolascapens@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 2e503557
......@@ -2565,67 +2565,69 @@ void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
if (context)
{
if (!(context->getBooleanv(pname, params)))
{
GLenum nativeType;
unsigned int numParams = 0;
if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
return gl::error(GL_INVALID_ENUM);
if (numParams == 0)
return; // it is known that the pname is valid, but there are no parameters to return
GLenum nativeType;
unsigned int numParams = 0;
if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
return gl::error(GL_INVALID_ENUM);
if (nativeType == GL_FLOAT)
{
GLfloat *floatParams = NULL;
floatParams = new GLfloat[numParams];
// pname is valid, but there are no parameters to return
if (numParams == 0)
return;
context->getFloatv(pname, floatParams);
if (nativeType == GL_BOOL)
{
context->getBooleanv(pname, params);
}
else if (nativeType == GL_FLOAT)
{
GLfloat *floatParams = NULL;
floatParams = new GLfloat[numParams];
for (unsigned int i = 0; i < numParams; ++i)
{
if (floatParams[i] == 0.0f)
params[i] = GL_FALSE;
else
params[i] = GL_TRUE;
}
context->getFloatv(pname, floatParams);
delete [] floatParams;
}
else if (nativeType == GL_INT)
for (unsigned int i = 0; i < numParams; ++i)
{
GLint *intParams = NULL;
intParams = new GLint[numParams];
if (floatParams[i] == 0.0f)
params[i] = GL_FALSE;
else
params[i] = GL_TRUE;
}
context->getIntegerv(pname, intParams);
delete [] floatParams;
}
else if (nativeType == GL_INT)
{
GLint *intParams = NULL;
intParams = new GLint[numParams];
for (unsigned int i = 0; i < numParams; ++i)
{
if (intParams[i] == 0)
params[i] = GL_FALSE;
else
params[i] = GL_TRUE;
}
context->getIntegerv(pname, intParams);
delete [] intParams;
}
else if (nativeType == GL_INT_64_ANGLEX)
for (unsigned int i = 0; i < numParams; ++i)
{
GLint64 *int64Params = NULL;
int64Params = new GLint64[numParams];
if (intParams[i] == 0)
params[i] = GL_FALSE;
else
params[i] = GL_TRUE;
}
context->getInteger64v(pname, int64Params);
delete [] intParams;
}
else if (nativeType == GL_INT_64_ANGLEX)
{
GLint64 *int64Params = NULL;
int64Params = new GLint64[numParams];
for (unsigned int i = 0; i < numParams; ++i)
{
if (int64Params[i] == 0)
params[i] = GL_FALSE;
else
params[i] = GL_TRUE;
}
context->getInteger64v(pname, int64Params);
delete [] int64Params;
for (unsigned int i = 0; i < numParams; ++i)
{
if (int64Params[i] == 0)
params[i] = GL_FALSE;
else
params[i] = GL_TRUE;
}
delete [] int64Params;
}
}
}
......@@ -2747,61 +2749,63 @@ void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
if (context)
{
if (!(context->getFloatv(pname, params)))
{
GLenum nativeType;
unsigned int numParams = 0;
if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
return gl::error(GL_INVALID_ENUM);
GLenum nativeType;
unsigned int numParams = 0;
if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
return gl::error(GL_INVALID_ENUM);
if (numParams == 0)
return; // it is known that the pname is valid, but that there are no parameters to return.
// pname is valid, but that there are no parameters to return.
if (numParams == 0)
return;
if (nativeType == GL_BOOL)
{
GLboolean *boolParams = NULL;
boolParams = new GLboolean[numParams];
if (nativeType == GL_FLOAT)
{
context->getFloatv(pname, params);
}
else if (nativeType == GL_BOOL)
{
GLboolean *boolParams = NULL;
boolParams = new GLboolean[numParams];
context->getBooleanv(pname, boolParams);
context->getBooleanv(pname, boolParams);
for (unsigned int i = 0; i < numParams; ++i)
{
if (boolParams[i] == GL_FALSE)
params[i] = 0.0f;
else
params[i] = 1.0f;
}
delete [] boolParams;
}
else if (nativeType == GL_INT)
for (unsigned int i = 0; i < numParams; ++i)
{
GLint *intParams = NULL;
intParams = new GLint[numParams];
if (boolParams[i] == GL_FALSE)
params[i] = 0.0f;
else
params[i] = 1.0f;
}
context->getIntegerv(pname, intParams);
delete [] boolParams;
}
else if (nativeType == GL_INT)
{
GLint *intParams = NULL;
intParams = new GLint[numParams];
for (unsigned int i = 0; i < numParams; ++i)
{
params[i] = static_cast<GLfloat>(intParams[i]);
}
context->getIntegerv(pname, intParams);
delete [] intParams;
}
else if (nativeType == GL_INT_64_ANGLEX)
for (unsigned int i = 0; i < numParams; ++i)
{
GLint64 *int64Params = NULL;
int64Params = new GLint64[numParams];
params[i] = static_cast<GLfloat>(intParams[i]);
}
context->getInteger64v(pname, int64Params);
delete [] intParams;
}
else if (nativeType == GL_INT_64_ANGLEX)
{
GLint64 *int64Params = NULL;
int64Params = new GLint64[numParams];
for (unsigned int i = 0; i < numParams; ++i)
{
params[i] = static_cast<GLfloat>(int64Params[i]);
}
context->getInteger64v(pname, int64Params);
delete [] int64Params;
for (unsigned int i = 0; i < numParams; ++i)
{
params[i] = static_cast<GLfloat>(int64Params[i]);
}
delete [] int64Params;
}
}
}
......@@ -3146,72 +3150,74 @@ void __stdcall glGetIntegerv(GLenum pname, GLint* params)
if (context)
{
if (!(context->getIntegerv(pname, params)))
GLenum nativeType;
unsigned int numParams = 0;
if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
return gl::error(GL_INVALID_ENUM);
// pname is valid, but there are no parameters to return
if (numParams == 0)
return;
if (nativeType == GL_INT)
{
GLenum nativeType;
unsigned int numParams = 0;
if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
return gl::error(GL_INVALID_ENUM);
context->getIntegerv(pname, params);
}
else if (nativeType == GL_BOOL)
{
GLboolean *boolParams = NULL;
boolParams = new GLboolean[numParams];
if (numParams == 0)
return; // it is known that pname is valid, but there are no parameters to return
context->getBooleanv(pname, boolParams);
if (nativeType == GL_BOOL)
for (unsigned int i = 0; i < numParams; ++i)
{
GLboolean *boolParams = NULL;
boolParams = new GLboolean[numParams];
if (boolParams[i] == GL_FALSE)
params[i] = 0;
else
params[i] = 1;
}
context->getBooleanv(pname, boolParams);
delete [] boolParams;
}
else if (nativeType == GL_FLOAT)
{
GLfloat *floatParams = NULL;
floatParams = new GLfloat[numParams];
for (unsigned int i = 0; i < numParams; ++i)
{
if (boolParams[i] == GL_FALSE)
params[i] = 0;
else
params[i] = 1;
}
context->getFloatv(pname, floatParams);
delete [] boolParams;
}
else if (nativeType == GL_FLOAT)
for (unsigned int i = 0; i < numParams; ++i)
{
GLfloat *floatParams = NULL;
floatParams = new GLfloat[numParams];
context->getFloatv(pname, floatParams);
for (unsigned int i = 0; i < numParams; ++i)
// RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
{
// RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
{
params[i] = static_cast<GLint>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
}
else
{
params[i] = gl::iround<GLint>(floatParams[i]);
}
params[i] = static_cast<GLint>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
}
else
{
params[i] = gl::iround<GLint>(floatParams[i]);
}
delete [] floatParams;
}
else if (nativeType == GL_INT_64_ANGLEX)
{
GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
GLint64 *int64Params = NULL;
int64Params = new GLint64[numParams];
context->getInteger64v(pname, int64Params);
delete [] floatParams;
}
else if (nativeType == GL_INT_64_ANGLEX)
{
GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
GLint64 *int64Params = NULL;
int64Params = new GLint64[numParams];
for (unsigned int i = 0; i < numParams; ++i)
{
GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
params[i] = static_cast<GLint>(clampedValue);
}
context->getInteger64v(pname, int64Params);
delete [] int64Params;
for (unsigned int i = 0; i < numParams; ++i)
{
GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
params[i] = static_cast<GLint>(clampedValue);
}
delete [] int64Params;
}
}
}
......@@ -9240,69 +9246,71 @@ void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
return gl::error(GL_INVALID_OPERATION);
}
if (!(context->getInteger64v(pname, params)))
GLenum nativeType;
unsigned int numParams = 0;
if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
return gl::error(GL_INVALID_ENUM);
// pname is valid, but that there are no parameters to return.
if (numParams == 0)
return;
if (nativeType == GL_INT_64_ANGLEX)
{
GLenum nativeType;
unsigned int numParams = 0;
if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
return gl::error(GL_INVALID_ENUM);
context->getInteger64v(pname, params);
}
else if (nativeType == GL_BOOL)
{
GLboolean *boolParams = NULL;
boolParams = new GLboolean[numParams];
if (numParams == 0)
return; // it is known that the pname is valid, but that there are no parameters to return.
context->getBooleanv(pname, boolParams);
if (nativeType == GL_BOOL)
for (unsigned int i = 0; i < numParams; ++i)
{
GLboolean *boolParams = NULL;
boolParams = new GLboolean[numParams];
if (boolParams[i] == GL_FALSE)
params[i] = 0;
else
params[i] = 1;
}
context->getBooleanv(pname, boolParams);
delete [] boolParams;
}
else if (nativeType == GL_INT)
{
GLint *intParams = NULL;
intParams = new GLint[numParams];
for (unsigned int i = 0; i < numParams; ++i)
{
if (boolParams[i] == GL_FALSE)
params[i] = 0;
else
params[i] = 1;
}
context->getIntegerv(pname, intParams);
delete [] boolParams;
}
else if (nativeType == GL_INT)
for (unsigned int i = 0; i < numParams; ++i)
{
GLint *intParams = NULL;
intParams = new GLint[numParams];
params[i] = static_cast<GLint64>(intParams[i]);
}
context->getIntegerv(pname, intParams);
delete [] intParams;
}
else if (nativeType == GL_FLOAT)
{
GLfloat *floatParams = NULL;
floatParams = new GLfloat[numParams];
for (unsigned int i = 0; i < numParams; ++i)
{
params[i] = static_cast<GLint64>(intParams[i]);
}
context->getFloatv(pname, floatParams);
delete [] intParams;
}
else if (nativeType == GL_FLOAT)
for (unsigned int i = 0; i < numParams; ++i)
{
GLfloat *floatParams = NULL;
floatParams = new GLfloat[numParams];
context->getFloatv(pname, floatParams);
for (unsigned int i = 0; i < numParams; ++i)
// RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
{
// RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
{
params[i] = static_cast<GLint64>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
}
else
{
params[i] = gl::iround<GLint64>(floatParams[i]);
}
params[i] = static_cast<GLint64>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
}
else
{
params[i] = gl::iround<GLint64>(floatParams[i]);
}
delete [] floatParams;
}
delete [] floatParams;
}
}
}
......
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