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) ...@@ -2565,67 +2565,69 @@ void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
if (context) if (context)
{ {
if (!(context->getBooleanv(pname, params))) GLenum nativeType;
{ unsigned int numParams = 0;
GLenum nativeType; if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
unsigned int numParams = 0; return gl::error(GL_INVALID_ENUM);
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
if (nativeType == GL_FLOAT) // pname is valid, but there are no parameters to return
{ if (numParams == 0)
GLfloat *floatParams = NULL; return;
floatParams = new GLfloat[numParams];
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) context->getFloatv(pname, floatParams);
{
if (floatParams[i] == 0.0f)
params[i] = GL_FALSE;
else
params[i] = GL_TRUE;
}
delete [] floatParams; for (unsigned int i = 0; i < numParams; ++i)
}
else if (nativeType == GL_INT)
{ {
GLint *intParams = NULL; if (floatParams[i] == 0.0f)
intParams = new GLint[numParams]; 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) context->getIntegerv(pname, intParams);
{
if (intParams[i] == 0)
params[i] = GL_FALSE;
else
params[i] = GL_TRUE;
}
delete [] intParams; for (unsigned int i = 0; i < numParams; ++i)
}
else if (nativeType == GL_INT_64_ANGLEX)
{ {
GLint64 *int64Params = NULL; if (intParams[i] == 0)
int64Params = new GLint64[numParams]; 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) context->getInteger64v(pname, int64Params);
{
if (int64Params[i] == 0)
params[i] = GL_FALSE;
else
params[i] = GL_TRUE;
}
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) ...@@ -2747,61 +2749,63 @@ void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
if (context) if (context)
{ {
if (!(context->getFloatv(pname, params))) GLenum nativeType;
{ unsigned int numParams = 0;
GLenum nativeType; if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
unsigned int numParams = 0; return gl::error(GL_INVALID_ENUM);
if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
return gl::error(GL_INVALID_ENUM);
if (numParams == 0) // pname is valid, but that there are no parameters to return.
return; // it is known that the pname is valid, but that there are no parameters to return. if (numParams == 0)
return;
if (nativeType == GL_BOOL) if (nativeType == GL_FLOAT)
{ {
GLboolean *boolParams = NULL; context->getFloatv(pname, params);
boolParams = new GLboolean[numParams]; }
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) 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)
{ {
GLint *intParams = NULL; if (boolParams[i] == GL_FALSE)
intParams = new GLint[numParams]; 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) context->getIntegerv(pname, intParams);
{
params[i] = static_cast<GLfloat>(intParams[i]);
}
delete [] intParams; for (unsigned int i = 0; i < numParams; ++i)
}
else if (nativeType == GL_INT_64_ANGLEX)
{ {
GLint64 *int64Params = NULL; params[i] = static_cast<GLfloat>(intParams[i]);
int64Params = new GLint64[numParams]; }
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) context->getInteger64v(pname, int64Params);
{
params[i] = static_cast<GLfloat>(int64Params[i]);
}
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) ...@@ -3146,72 +3150,74 @@ void __stdcall glGetIntegerv(GLenum pname, GLint* params)
if (context) 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; context->getIntegerv(pname, params);
unsigned int numParams = 0; }
if (!context->getQueryParameterInfo(pname, &nativeType, &numParams)) else if (nativeType == GL_BOOL)
return gl::error(GL_INVALID_ENUM); {
GLboolean *boolParams = NULL;
boolParams = new GLboolean[numParams];
if (numParams == 0) context->getBooleanv(pname, boolParams);
return; // it is known that pname is valid, but there are no parameters to return
if (nativeType == GL_BOOL) for (unsigned int i = 0; i < numParams; ++i)
{ {
GLboolean *boolParams = NULL; if (boolParams[i] == GL_FALSE)
boolParams = new GLboolean[numParams]; 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) context->getFloatv(pname, floatParams);
{
if (boolParams[i] == GL_FALSE)
params[i] = 0;
else
params[i] = 1;
}
delete [] boolParams; for (unsigned int i = 0; i < numParams; ++i)
}
else if (nativeType == GL_FLOAT)
{ {
GLfloat *floatParams = NULL; // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
floatParams = new GLfloat[numParams]; if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
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 params[i] = static_cast<GLint>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR) }
{ else
params[i] = static_cast<GLint>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f); {
} params[i] = gl::iround<GLint>(floatParams[i]);
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) context->getInteger64v(pname, int64Params);
{
GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
params[i] = static_cast<GLint>(clampedValue);
}
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) ...@@ -9240,69 +9246,71 @@ void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
return gl::error(GL_INVALID_OPERATION); 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; context->getInteger64v(pname, params);
unsigned int numParams = 0; }
if (!context->getQueryParameterInfo(pname, &nativeType, &numParams)) else if (nativeType == GL_BOOL)
return gl::error(GL_INVALID_ENUM); {
GLboolean *boolParams = NULL;
boolParams = new GLboolean[numParams];
if (numParams == 0) context->getBooleanv(pname, boolParams);
return; // it is known that the pname is valid, but that there are no parameters to return.
if (nativeType == GL_BOOL) for (unsigned int i = 0; i < numParams; ++i)
{ {
GLboolean *boolParams = NULL; if (boolParams[i] == GL_FALSE)
boolParams = new GLboolean[numParams]; 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) context->getIntegerv(pname, intParams);
{
if (boolParams[i] == GL_FALSE)
params[i] = 0;
else
params[i] = 1;
}
delete [] boolParams; for (unsigned int i = 0; i < numParams; ++i)
}
else if (nativeType == GL_INT)
{ {
GLint *intParams = NULL; params[i] = static_cast<GLint64>(intParams[i]);
intParams = new GLint[numParams]; }
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) context->getFloatv(pname, floatParams);
{
params[i] = static_cast<GLint64>(intParams[i]);
}
delete [] intParams; for (unsigned int i = 0; i < numParams; ++i)
}
else if (nativeType == GL_FLOAT)
{ {
GLfloat *floatParams = NULL; // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
floatParams = new GLfloat[numParams]; if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
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 params[i] = static_cast<GLint64>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR) }
{ else
params[i] = static_cast<GLint64>((static_cast<GLfloat>(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f); {
} params[i] = gl::iround<GLint64>(floatParams[i]);
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