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,17 +2565,20 @@ void __stdcall glGetBooleanv(GLenum pname, GLboolean* params) ...@@ -2565,17 +2565,20 @@ void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
if (context) if (context)
{ {
if (!(context->getBooleanv(pname, params)))
{
GLenum nativeType; GLenum nativeType;
unsigned int numParams = 0; unsigned int numParams = 0;
if (!context->getQueryParameterInfo(pname, &nativeType, &numParams)) if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
// pname is valid, but there are no parameters to return
if (numParams == 0) if (numParams == 0)
return; // it is known that the pname is valid, but there are no parameters to return return;
if (nativeType == GL_FLOAT) if (nativeType == GL_BOOL)
{
context->getBooleanv(pname, params);
}
else if (nativeType == GL_FLOAT)
{ {
GLfloat *floatParams = NULL; GLfloat *floatParams = NULL;
floatParams = new GLfloat[numParams]; floatParams = new GLfloat[numParams];
...@@ -2628,7 +2631,6 @@ void __stdcall glGetBooleanv(GLenum pname, GLboolean* params) ...@@ -2628,7 +2631,6 @@ void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
} }
} }
} }
}
catch(std::bad_alloc&) catch(std::bad_alloc&)
{ {
return gl::error(GL_OUT_OF_MEMORY); return gl::error(GL_OUT_OF_MEMORY);
...@@ -2747,17 +2749,20 @@ void __stdcall glGetFloatv(GLenum pname, GLfloat* params) ...@@ -2747,17 +2749,20 @@ void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
if (context) if (context)
{ {
if (!(context->getFloatv(pname, params)))
{
GLenum nativeType; GLenum nativeType;
unsigned int numParams = 0; unsigned int numParams = 0;
if (!context->getQueryParameterInfo(pname, &nativeType, &numParams)) if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
// pname is valid, but that there are no parameters to return.
if (numParams == 0) if (numParams == 0)
return; // it is known that the pname is valid, but that there are no parameters to return. return;
if (nativeType == GL_BOOL) if (nativeType == GL_FLOAT)
{
context->getFloatv(pname, params);
}
else if (nativeType == GL_BOOL)
{ {
GLboolean *boolParams = NULL; GLboolean *boolParams = NULL;
boolParams = new GLboolean[numParams]; boolParams = new GLboolean[numParams];
...@@ -2804,7 +2809,6 @@ void __stdcall glGetFloatv(GLenum pname, GLfloat* params) ...@@ -2804,7 +2809,6 @@ void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
} }
} }
} }
}
catch(std::bad_alloc&) catch(std::bad_alloc&)
{ {
return gl::error(GL_OUT_OF_MEMORY); return gl::error(GL_OUT_OF_MEMORY);
...@@ -3146,17 +3150,20 @@ void __stdcall glGetIntegerv(GLenum pname, GLint* params) ...@@ -3146,17 +3150,20 @@ void __stdcall glGetIntegerv(GLenum pname, GLint* params)
if (context) if (context)
{ {
if (!(context->getIntegerv(pname, params)))
{
GLenum nativeType; GLenum nativeType;
unsigned int numParams = 0; unsigned int numParams = 0;
if (!context->getQueryParameterInfo(pname, &nativeType, &numParams)) if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
// pname is valid, but there are no parameters to return
if (numParams == 0) if (numParams == 0)
return; // it is known that pname is valid, but there are no parameters to return return;
if (nativeType == GL_BOOL) if (nativeType == GL_INT)
{
context->getIntegerv(pname, params);
}
else if (nativeType == GL_BOOL)
{ {
GLboolean *boolParams = NULL; GLboolean *boolParams = NULL;
boolParams = new GLboolean[numParams]; boolParams = new GLboolean[numParams];
...@@ -3214,7 +3221,6 @@ void __stdcall glGetIntegerv(GLenum pname, GLint* params) ...@@ -3214,7 +3221,6 @@ void __stdcall glGetIntegerv(GLenum pname, GLint* params)
} }
} }
} }
}
catch(std::bad_alloc&) catch(std::bad_alloc&)
{ {
return gl::error(GL_OUT_OF_MEMORY); return gl::error(GL_OUT_OF_MEMORY);
...@@ -9240,17 +9246,20 @@ void __stdcall glGetInteger64v(GLenum pname, GLint64* params) ...@@ -9240,17 +9246,20 @@ 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; GLenum nativeType;
unsigned int numParams = 0; unsigned int numParams = 0;
if (!context->getQueryParameterInfo(pname, &nativeType, &numParams)) if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
// pname is valid, but that there are no parameters to return.
if (numParams == 0) if (numParams == 0)
return; // it is known that the pname is valid, but that there are no parameters to return. return;
if (nativeType == GL_BOOL) if (nativeType == GL_INT_64_ANGLEX)
{
context->getInteger64v(pname, params);
}
else if (nativeType == GL_BOOL)
{ {
GLboolean *boolParams = NULL; GLboolean *boolParams = NULL;
boolParams = new GLboolean[numParams]; boolParams = new GLboolean[numParams];
...@@ -9305,7 +9314,6 @@ void __stdcall glGetInteger64v(GLenum pname, GLint64* params) ...@@ -9305,7 +9314,6 @@ void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
} }
} }
} }
}
catch(std::bad_alloc&) catch(std::bad_alloc&)
{ {
return gl::error(GL_OUT_OF_MEMORY); return gl::error(GL_OUT_OF_MEMORY);
......
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