Commit 3eb573f0 by Alexis Hetu Committed by Alexis Hétu

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/14128Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent a752b894
...@@ -489,6 +489,11 @@ namespace es2 ...@@ -489,6 +489,11 @@ namespace es2
void Program::bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding) void Program::bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
{ {
if(uniformBlockIndex >= getActiveUniformBlockCount())
{
return error(GL_INVALID_VALUE);
}
uniformBlockBindings[uniformBlockIndex] = uniformBlockBinding; uniformBlockBindings[uniformBlockIndex] = uniformBlockBinding;
} }
...@@ -716,7 +721,7 @@ namespace es2 ...@@ -716,7 +721,7 @@ namespace es2
count = std::min(size - (int)uniformIndex[location].element, count); count = std::min(size - (int)uniformIndex[location].element, count);
if(targetUniform->type == GL_INT || targetUniform->type == GL_UNSIGNED_INT || IsSamplerUniform(targetUniform->type)) if(targetUniform->type == GL_INT || IsSamplerUniform(targetUniform->type))
{ {
memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLint), memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLint),
v, sizeof(GLint) * count); v, sizeof(GLint) * count);
...@@ -753,7 +758,6 @@ namespace es2 ...@@ -753,7 +758,6 @@ namespace es2
bool Program::setUniformiv(GLint location, GLsizei count, const GLint *v, int numElements) bool Program::setUniformiv(GLint location, GLsizei count, const GLint *v, int numElements)
{ {
static GLenum intType[] = { GL_INT, GL_INT_VEC2, GL_INT_VEC3, GL_INT_VEC4 }; static GLenum intType[] = { GL_INT, GL_INT_VEC2, GL_INT_VEC3, GL_INT_VEC4 };
static GLenum uintType[] = { GL_UNSIGNED_INT, GL_UNSIGNED_INT_VEC2, GL_UNSIGNED_INT_VEC3, GL_UNSIGNED_INT_VEC4 };
static GLenum boolType[] = { GL_BOOL, GL_BOOL_VEC2, GL_BOOL_VEC3, GL_BOOL_VEC4 }; static GLenum boolType[] = { GL_BOOL, GL_BOOL_VEC2, GL_BOOL_VEC3, GL_BOOL_VEC4 };
if(location < 0 || location >= (int)uniformIndex.size() || (uniformIndex[location].index == GL_INVALID_INDEX)) if(location < 0 || location >= (int)uniformIndex.size() || (uniformIndex[location].index == GL_INVALID_INDEX))
...@@ -774,7 +778,7 @@ namespace es2 ...@@ -774,7 +778,7 @@ namespace es2
count = std::min(size - (int)uniformIndex[location].element, count); count = std::min(size - (int)uniformIndex[location].element, count);
int index = numElements - 1; int index = numElements - 1;
if(targetUniform->type == intType[index] || targetUniform->type == uintType[index]) if(targetUniform->type == intType[index])
{ {
memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLint)* numElements, memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLint)* numElements,
v, numElements * sizeof(GLint)* count); v, numElements * sizeof(GLint)* count);
...@@ -835,7 +839,7 @@ namespace es2 ...@@ -835,7 +839,7 @@ namespace es2
count = std::min(size - (int)uniformIndex[location].element, count); count = std::min(size - (int)uniformIndex[location].element, count);
if(targetUniform->type == GL_INT || targetUniform->type == GL_UNSIGNED_INT || IsSamplerUniform(targetUniform->type)) if(targetUniform->type == GL_UNSIGNED_INT)
{ {
memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLuint), memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLuint),
v, sizeof(GLuint)* count); v, sizeof(GLuint)* count);
...@@ -871,7 +875,6 @@ namespace es2 ...@@ -871,7 +875,6 @@ namespace es2
bool Program::setUniformuiv(GLint location, GLsizei count, const GLuint *v, int numElements) bool Program::setUniformuiv(GLint location, GLsizei count, const GLuint *v, int numElements)
{ {
static GLenum intType[] = { GL_INT, GL_INT_VEC2, GL_INT_VEC3, GL_INT_VEC4 };
static GLenum uintType[] = { GL_UNSIGNED_INT, GL_UNSIGNED_INT_VEC2, GL_UNSIGNED_INT_VEC3, GL_UNSIGNED_INT_VEC4 }; static GLenum uintType[] = { GL_UNSIGNED_INT, GL_UNSIGNED_INT_VEC2, GL_UNSIGNED_INT_VEC3, GL_UNSIGNED_INT_VEC4 };
static GLenum boolType[] = { GL_BOOL, GL_BOOL_VEC2, GL_BOOL_VEC3, GL_BOOL_VEC4 }; static GLenum boolType[] = { GL_BOOL, GL_BOOL_VEC2, GL_BOOL_VEC3, GL_BOOL_VEC4 };
...@@ -893,7 +896,7 @@ namespace es2 ...@@ -893,7 +896,7 @@ namespace es2
count = std::min(size - (int)uniformIndex[location].element, count); count = std::min(size - (int)uniformIndex[location].element, count);
int index = numElements - 1; int index = numElements - 1;
if(targetUniform->type == uintType[index] || targetUniform->type == intType[index]) if(targetUniform->type == uintType[index])
{ {
memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLuint)* numElements, memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLuint)* numElements,
v, numElements * sizeof(GLuint)* count); v, numElements * sizeof(GLuint)* count);
......
...@@ -4532,6 +4532,15 @@ void LinkProgram(GLuint program) ...@@ -4532,6 +4532,15 @@ void LinkProgram(GLuint program)
} }
} }
if(programObject == context->getCurrentProgram())
{
es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
if(transformFeedback && transformFeedback->isActive())
{
return error(GL_INVALID_OPERATION);
}
}
programObject->link(); programObject->link();
} }
} }
...@@ -5563,11 +5572,6 @@ void Uniform1fv(GLint location, GLsizei count, const GLfloat* v) ...@@ -5563,11 +5572,6 @@ void Uniform1fv(GLint location, GLsizei count, const GLfloat* v)
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -5579,6 +5583,11 @@ void Uniform1fv(GLint location, GLsizei count, const GLfloat* v) ...@@ -5579,6 +5583,11 @@ void Uniform1fv(GLint location, GLsizei count, const GLfloat* v)
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniform1fv(location, count, v)) if(!program->setUniform1fv(location, count, v))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -5600,11 +5609,6 @@ void Uniform1iv(GLint location, GLsizei count, const GLint* v) ...@@ -5600,11 +5609,6 @@ void Uniform1iv(GLint location, GLsizei count, const GLint* v)
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -5616,6 +5620,11 @@ void Uniform1iv(GLint location, GLsizei count, const GLint* v) ...@@ -5616,6 +5620,11 @@ void Uniform1iv(GLint location, GLsizei count, const GLint* v)
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniform1iv(location, count, v)) if(!program->setUniform1iv(location, count, v))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -5639,11 +5648,6 @@ void Uniform2fv(GLint location, GLsizei count, const GLfloat* v) ...@@ -5639,11 +5648,6 @@ void Uniform2fv(GLint location, GLsizei count, const GLfloat* v)
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -5655,6 +5659,11 @@ void Uniform2fv(GLint location, GLsizei count, const GLfloat* v) ...@@ -5655,6 +5659,11 @@ void Uniform2fv(GLint location, GLsizei count, const GLfloat* v)
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniform2fv(location, count, v)) if(!program->setUniform2fv(location, count, v))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -5678,11 +5687,6 @@ void Uniform2iv(GLint location, GLsizei count, const GLint* v) ...@@ -5678,11 +5687,6 @@ void Uniform2iv(GLint location, GLsizei count, const GLint* v)
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -5694,6 +5698,11 @@ void Uniform2iv(GLint location, GLsizei count, const GLint* v) ...@@ -5694,6 +5698,11 @@ void Uniform2iv(GLint location, GLsizei count, const GLint* v)
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniform2iv(location, count, v)) if(!program->setUniform2iv(location, count, v))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -5717,11 +5726,6 @@ void Uniform3fv(GLint location, GLsizei count, const GLfloat* v) ...@@ -5717,11 +5726,6 @@ void Uniform3fv(GLint location, GLsizei count, const GLfloat* v)
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -5733,6 +5737,11 @@ void Uniform3fv(GLint location, GLsizei count, const GLfloat* v) ...@@ -5733,6 +5737,11 @@ void Uniform3fv(GLint location, GLsizei count, const GLfloat* v)
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniform3fv(location, count, v)) if(!program->setUniform3fv(location, count, v))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -5756,11 +5765,6 @@ void Uniform3iv(GLint location, GLsizei count, const GLint* v) ...@@ -5756,11 +5765,6 @@ void Uniform3iv(GLint location, GLsizei count, const GLint* v)
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -5772,6 +5776,11 @@ void Uniform3iv(GLint location, GLsizei count, const GLint* v) ...@@ -5772,6 +5776,11 @@ void Uniform3iv(GLint location, GLsizei count, const GLint* v)
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniform3iv(location, count, v)) if(!program->setUniform3iv(location, count, v))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -5795,11 +5804,6 @@ void Uniform4fv(GLint location, GLsizei count, const GLfloat* v) ...@@ -5795,11 +5804,6 @@ void Uniform4fv(GLint location, GLsizei count, const GLfloat* v)
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -5811,6 +5815,11 @@ void Uniform4fv(GLint location, GLsizei count, const GLfloat* v) ...@@ -5811,6 +5815,11 @@ void Uniform4fv(GLint location, GLsizei count, const GLfloat* v)
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniform4fv(location, count, v)) if(!program->setUniform4fv(location, count, v))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -5834,11 +5843,6 @@ void Uniform4iv(GLint location, GLsizei count, const GLint* v) ...@@ -5834,11 +5843,6 @@ void Uniform4iv(GLint location, GLsizei count, const GLint* v)
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -5850,6 +5854,11 @@ void Uniform4iv(GLint location, GLsizei count, const GLint* v) ...@@ -5850,6 +5854,11 @@ void Uniform4iv(GLint location, GLsizei count, const GLint* v)
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniform4iv(location, count, v)) if(!program->setUniform4iv(location, count, v))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -5867,11 +5876,6 @@ void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const ...@@ -5867,11 +5876,6 @@ void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -5888,6 +5892,11 @@ void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const ...@@ -5888,6 +5892,11 @@ void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniformMatrix2fv(location, count, transpose, value)) if(!program->setUniformMatrix2fv(location, count, transpose, value))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -5905,11 +5914,6 @@ void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const ...@@ -5905,11 +5914,6 @@ void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -5926,6 +5930,11 @@ void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const ...@@ -5926,6 +5930,11 @@ void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniformMatrix3fv(location, count, transpose, value)) if(!program->setUniformMatrix3fv(location, count, transpose, value))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -5943,11 +5952,6 @@ void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const ...@@ -5943,11 +5952,6 @@ void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -5964,6 +5968,11 @@ void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const ...@@ -5964,6 +5968,11 @@ void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniformMatrix4fv(location, count, transpose, value)) if(!program->setUniformMatrix4fv(location, count, transpose, value))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -5979,6 +5988,12 @@ void UseProgram(GLuint program) ...@@ -5979,6 +5988,12 @@ void UseProgram(GLuint program)
if(context) if(context)
{ {
es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
if(transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
{
return error(GL_INVALID_OPERATION);
}
es2::Program *programObject = context->getProgram(program); es2::Program *programObject = context->getProgram(program);
if(!programObject && program != 0) if(!programObject && program != 0)
......
...@@ -1305,11 +1305,6 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv(GLint location, GLsizei count, ...@@ -1305,11 +1305,6 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv(GLint location, GLsizei count,
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -1321,6 +1316,11 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv(GLint location, GLsizei count, ...@@ -1321,6 +1316,11 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv(GLint location, GLsizei count,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniformMatrix2x3fv(location, count, transpose, value)) if(!program->setUniformMatrix2x3fv(location, count, transpose, value))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -1337,11 +1337,6 @@ GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv(GLint location, GLsizei count, ...@@ -1337,11 +1337,6 @@ GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv(GLint location, GLsizei count,
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -1353,6 +1348,11 @@ GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv(GLint location, GLsizei count, ...@@ -1353,6 +1348,11 @@ GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv(GLint location, GLsizei count,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniformMatrix3x2fv(location, count, transpose, value)) if(!program->setUniformMatrix3x2fv(location, count, transpose, value))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -1369,11 +1369,6 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv(GLint location, GLsizei count, ...@@ -1369,11 +1369,6 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv(GLint location, GLsizei count,
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -1385,6 +1380,11 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv(GLint location, GLsizei count, ...@@ -1385,6 +1380,11 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv(GLint location, GLsizei count,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniformMatrix2x4fv(location, count, transpose, value)) if(!program->setUniformMatrix2x4fv(location, count, transpose, value))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -1401,11 +1401,6 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv(GLint location, GLsizei count, ...@@ -1401,11 +1401,6 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv(GLint location, GLsizei count,
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -1417,6 +1412,11 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv(GLint location, GLsizei count, ...@@ -1417,6 +1412,11 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv(GLint location, GLsizei count,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniformMatrix4x2fv(location, count, transpose, value)) if(!program->setUniformMatrix4x2fv(location, count, transpose, value))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -1433,11 +1433,6 @@ GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv(GLint location, GLsizei count, ...@@ -1433,11 +1433,6 @@ GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv(GLint location, GLsizei count,
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -1449,6 +1444,11 @@ GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv(GLint location, GLsizei count, ...@@ -1449,6 +1444,11 @@ GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv(GLint location, GLsizei count,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniformMatrix3x4fv(location, count, transpose, value)) if(!program->setUniformMatrix3x4fv(location, count, transpose, value))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -1465,11 +1465,6 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv(GLint location, GLsizei count, ...@@ -1465,11 +1465,6 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv(GLint location, GLsizei count,
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -1481,6 +1476,11 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv(GLint location, GLsizei count, ...@@ -1481,6 +1476,11 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv(GLint location, GLsizei count,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniformMatrix4x3fv(location, count, transpose, value)) if(!program->setUniformMatrix4x3fv(location, count, transpose, value))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -2475,11 +2475,6 @@ GL_APICALL void GL_APIENTRY glUniform1uiv(GLint location, GLsizei count, const G ...@@ -2475,11 +2475,6 @@ GL_APICALL void GL_APIENTRY glUniform1uiv(GLint location, GLsizei count, const G
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -2491,6 +2486,11 @@ GL_APICALL void GL_APIENTRY glUniform1uiv(GLint location, GLsizei count, const G ...@@ -2491,6 +2486,11 @@ GL_APICALL void GL_APIENTRY glUniform1uiv(GLint location, GLsizei count, const G
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniform1uiv(location, count, value)) if(!program->setUniform1uiv(location, count, value))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -2508,11 +2508,6 @@ GL_APICALL void GL_APIENTRY glUniform2uiv(GLint location, GLsizei count, const G ...@@ -2508,11 +2508,6 @@ GL_APICALL void GL_APIENTRY glUniform2uiv(GLint location, GLsizei count, const G
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -2524,6 +2519,11 @@ GL_APICALL void GL_APIENTRY glUniform2uiv(GLint location, GLsizei count, const G ...@@ -2524,6 +2519,11 @@ GL_APICALL void GL_APIENTRY glUniform2uiv(GLint location, GLsizei count, const G
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniform2uiv(location, count, value)) if(!program->setUniform2uiv(location, count, value))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -2541,11 +2541,6 @@ GL_APICALL void GL_APIENTRY glUniform3uiv(GLint location, GLsizei count, const G ...@@ -2541,11 +2541,6 @@ GL_APICALL void GL_APIENTRY glUniform3uiv(GLint location, GLsizei count, const G
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -2557,6 +2552,11 @@ GL_APICALL void GL_APIENTRY glUniform3uiv(GLint location, GLsizei count, const G ...@@ -2557,6 +2552,11 @@ GL_APICALL void GL_APIENTRY glUniform3uiv(GLint location, GLsizei count, const G
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniform3uiv(location, count, value)) if(!program->setUniform3uiv(location, count, value))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -2574,11 +2574,6 @@ GL_APICALL void GL_APIENTRY glUniform4uiv(GLint location, GLsizei count, const G ...@@ -2574,11 +2574,6 @@ GL_APICALL void GL_APIENTRY glUniform4uiv(GLint location, GLsizei count, const G
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(location == -1)
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -2590,6 +2585,11 @@ GL_APICALL void GL_APIENTRY glUniform4uiv(GLint location, GLsizei count, const G ...@@ -2590,6 +2585,11 @@ GL_APICALL void GL_APIENTRY glUniform4uiv(GLint location, GLsizei count, const G
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(location == -1)
{
return;
}
if(!program->setUniform4uiv(location, count, value)) if(!program->setUniform4uiv(location, count, value))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
...@@ -3533,11 +3533,6 @@ GL_APICALL void GL_APIENTRY glSamplerParameterfv(GLuint sampler, GLenum pname, c ...@@ -3533,11 +3533,6 @@ GL_APICALL void GL_APIENTRY glSamplerParameterfv(GLuint sampler, GLenum pname, c
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
if(!ValidateTexParamParameters(pname, static_cast<GLint>(roundf(*param))))
{
return;
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -3547,7 +3542,10 @@ GL_APICALL void GL_APIENTRY glSamplerParameterfv(GLuint sampler, GLenum pname, c ...@@ -3547,7 +3542,10 @@ GL_APICALL void GL_APIENTRY glSamplerParameterfv(GLuint sampler, GLenum pname, c
return error(GL_INVALID_OPERATION); 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 @@ GL_APICALL void GL_APIENTRY glGetSamplerParameteriv(GLuint sampler, GLenum pname ...@@ -3567,7 +3565,7 @@ GL_APICALL void GL_APIENTRY glGetSamplerParameteriv(GLuint sampler, GLenum pname
{ {
if(!context->isSampler(sampler)) if(!context->isSampler(sampler))
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_OPERATION);
} }
*params = context->getSamplerParameteri(sampler, pname); *params = context->getSamplerParameteri(sampler, pname);
...@@ -3590,7 +3588,7 @@ GL_APICALL void GL_APIENTRY glGetSamplerParameterfv(GLuint sampler, GLenum pname ...@@ -3590,7 +3588,7 @@ GL_APICALL void GL_APIENTRY glGetSamplerParameterfv(GLuint sampler, GLenum pname
{ {
if(!context->isSampler(sampler)) if(!context->isSampler(sampler))
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_OPERATION);
} }
*params = context->getSamplerParameterf(sampler, pname); *params = context->getSamplerParameterf(sampler, pname);
...@@ -3769,6 +3767,18 @@ GL_APICALL void GL_APIENTRY glGetProgramBinary(GLuint program, GLsizei bufSize, ...@@ -3769,6 +3767,18 @@ GL_APICALL void GL_APIENTRY glGetProgramBinary(GLuint program, GLsizei bufSize,
return error(GL_INVALID_VALUE); 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(); UNIMPLEMENTED();
} }
...@@ -3798,12 +3808,16 @@ GL_APICALL void GL_APIENTRY glProgramParameteri(GLuint program, GLenum pname, GL ...@@ -3798,12 +3808,16 @@ GL_APICALL void GL_APIENTRY glProgramParameteri(GLuint program, GLenum pname, GL
if(!programObject) if(!programObject)
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_VALUE);
} }
switch(pname) switch(pname)
{ {
case GL_PROGRAM_BINARY_RETRIEVABLE_HINT: case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
if((value != GL_TRUE) && (value != GL_FALSE))
{
return error(GL_INVALID_VALUE);
}
programObject->setBinaryRetrievable(value != GL_FALSE); programObject->setBinaryRetrievable(value != GL_FALSE);
break; break;
default: default:
......
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