Added validation to shader related functions
- Added uniform block binding validation
- Disallowed setting int uniforms from unsigned
int specific functions and vice versa.
- Moved early returns from uniform related
functions further down the functions to allow
gl errors to be returned
- Added active transform feedback checks
- Fixed some gl error return codes.
Fixes most failures in:
dEQP-GLES3.functional.negative_api.shader*
Change-Id: Id9f914a09dd89fea61728725f8bd828dc7b3f81b
Reviewed-on: https://swiftshader-review.googlesource.com/14128
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index 2f2c8ca..76381e1 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -1305,11 +1305,6 @@
return error(GL_INVALID_VALUE);
}
- if(location == -1)
- {
- return;
- }
-
es2::Context *context = es2::getContext();
if(context)
@@ -1321,6 +1316,11 @@
return error(GL_INVALID_OPERATION);
}
+ if(location == -1)
+ {
+ return;
+ }
+
if(!program->setUniformMatrix2x3fv(location, count, transpose, value))
{
return error(GL_INVALID_OPERATION);
@@ -1337,11 +1337,6 @@
return error(GL_INVALID_VALUE);
}
- if(location == -1)
- {
- return;
- }
-
es2::Context *context = es2::getContext();
if(context)
@@ -1353,6 +1348,11 @@
return error(GL_INVALID_OPERATION);
}
+ if(location == -1)
+ {
+ return;
+ }
+
if(!program->setUniformMatrix3x2fv(location, count, transpose, value))
{
return error(GL_INVALID_OPERATION);
@@ -1369,11 +1369,6 @@
return error(GL_INVALID_VALUE);
}
- if(location == -1)
- {
- return;
- }
-
es2::Context *context = es2::getContext();
if(context)
@@ -1385,6 +1380,11 @@
return error(GL_INVALID_OPERATION);
}
+ if(location == -1)
+ {
+ return;
+ }
+
if(!program->setUniformMatrix2x4fv(location, count, transpose, value))
{
return error(GL_INVALID_OPERATION);
@@ -1401,11 +1401,6 @@
return error(GL_INVALID_VALUE);
}
- if(location == -1)
- {
- return;
- }
-
es2::Context *context = es2::getContext();
if(context)
@@ -1417,6 +1412,11 @@
return error(GL_INVALID_OPERATION);
}
+ if(location == -1)
+ {
+ return;
+ }
+
if(!program->setUniformMatrix4x2fv(location, count, transpose, value))
{
return error(GL_INVALID_OPERATION);
@@ -1433,11 +1433,6 @@
return error(GL_INVALID_VALUE);
}
- if(location == -1)
- {
- return;
- }
-
es2::Context *context = es2::getContext();
if(context)
@@ -1449,6 +1444,11 @@
return error(GL_INVALID_OPERATION);
}
+ if(location == -1)
+ {
+ return;
+ }
+
if(!program->setUniformMatrix3x4fv(location, count, transpose, value))
{
return error(GL_INVALID_OPERATION);
@@ -1465,11 +1465,6 @@
return error(GL_INVALID_VALUE);
}
- if(location == -1)
- {
- return;
- }
-
es2::Context *context = es2::getContext();
if(context)
@@ -1481,6 +1476,11 @@
return error(GL_INVALID_OPERATION);
}
+ if(location == -1)
+ {
+ return;
+ }
+
if(!program->setUniformMatrix4x3fv(location, count, transpose, value))
{
return error(GL_INVALID_OPERATION);
@@ -2475,11 +2475,6 @@
return error(GL_INVALID_VALUE);
}
- if(location == -1)
- {
- return;
- }
-
es2::Context *context = es2::getContext();
if(context)
@@ -2491,6 +2486,11 @@
return error(GL_INVALID_OPERATION);
}
+ if(location == -1)
+ {
+ return;
+ }
+
if(!program->setUniform1uiv(location, count, value))
{
return error(GL_INVALID_OPERATION);
@@ -2508,11 +2508,6 @@
return error(GL_INVALID_VALUE);
}
- if(location == -1)
- {
- return;
- }
-
es2::Context *context = es2::getContext();
if(context)
@@ -2524,6 +2519,11 @@
return error(GL_INVALID_OPERATION);
}
+ if(location == -1)
+ {
+ return;
+ }
+
if(!program->setUniform2uiv(location, count, value))
{
return error(GL_INVALID_OPERATION);
@@ -2541,11 +2541,6 @@
return error(GL_INVALID_VALUE);
}
- if(location == -1)
- {
- return;
- }
-
es2::Context *context = es2::getContext();
if(context)
@@ -2557,6 +2552,11 @@
return error(GL_INVALID_OPERATION);
}
+ if(location == -1)
+ {
+ return;
+ }
+
if(!program->setUniform3uiv(location, count, value))
{
return error(GL_INVALID_OPERATION);
@@ -2574,11 +2574,6 @@
return error(GL_INVALID_VALUE);
}
- if(location == -1)
- {
- return;
- }
-
es2::Context *context = es2::getContext();
if(context)
@@ -2590,6 +2585,11 @@
return error(GL_INVALID_OPERATION);
}
+ if(location == -1)
+ {
+ return;
+ }
+
if(!program->setUniform4uiv(location, count, value))
{
return error(GL_INVALID_OPERATION);
@@ -3533,11 +3533,6 @@
return error(GL_INVALID_ENUM);
}
- if(!ValidateTexParamParameters(pname, static_cast<GLint>(roundf(*param))))
- {
- return;
- }
-
es2::Context *context = es2::getContext();
if(context)
@@ -3547,7 +3542,10 @@
return error(GL_INVALID_OPERATION);
}
- context->samplerParameterf(sampler, pname, *param);
+ if(ValidateTexParamParameters(pname, static_cast<GLint>(roundf(*param))))
+ {
+ context->samplerParameterf(sampler, pname, *param);
+ }
}
}
@@ -3567,7 +3565,7 @@
{
if(!context->isSampler(sampler))
{
- return error(GL_INVALID_VALUE);
+ return error(GL_INVALID_OPERATION);
}
*params = context->getSamplerParameteri(sampler, pname);
@@ -3590,7 +3588,7 @@
{
if(!context->isSampler(sampler))
{
- return error(GL_INVALID_VALUE);
+ return error(GL_INVALID_OPERATION);
}
*params = context->getSamplerParameterf(sampler, pname);
@@ -3769,6 +3767,18 @@
return error(GL_INVALID_VALUE);
}
+ es2::Context *context = es2::getContext();
+
+ if(context)
+ {
+ es2::Program *programObject = context->getProgram(program);
+
+ if(!programObject || !programObject->isLinked())
+ {
+ return error(GL_INVALID_OPERATION);
+ }
+ }
+
UNIMPLEMENTED();
}
@@ -3798,12 +3808,16 @@
if(!programObject)
{
- return error(GL_INVALID_OPERATION);
+ return error(GL_INVALID_VALUE);
}
switch(pname)
{
case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
+ if((value != GL_TRUE) && (value != GL_FALSE))
+ {
+ return error(GL_INVALID_VALUE);
+ }
programObject->setBinaryRetrievable(value != GL_FALSE);
break;
default: