Commit 4de7e2e8 by Alexis Hetu Committed by Alexis Hétu

Implemented matrix transpose

Implemented matrix transpose for uniform matrices. Also found and fixed a minor issue in OutputASM which was causing a bad GL error. Change-Id: I2d6c603770548c60e56d417b240ca276ec33ba45 Reviewed-on: https://swiftshader-review.googlesource.com/3191Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 61161500
......@@ -2402,7 +2402,7 @@ namespace glsl
{
case 2: return GL_FLOAT_MAT3x2;
case 3: return GL_FLOAT_MAT3;
case 4: return GL_FLOAT_MAT4x2;
case 4: return GL_FLOAT_MAT3x4;
default: UNREACHABLE();
}
case 4:
......
......@@ -354,7 +354,7 @@ namespace es2
return setUniformfv(location, count, v, 4);
}
bool Program::setUniformMatrixfv(GLint location, GLsizei count, const GLfloat *value, GLenum type)
bool Program::setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum type)
{
int numElements;
switch(type)
......@@ -406,55 +406,77 @@ namespace es2
count = std::min(size - (int)uniformIndex[location].element, count);
memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLfloat)* numElements,
value, numElements * sizeof(GLfloat)* count);
GLfloat* dst = reinterpret_cast<GLfloat*>(targetUniform->data + uniformIndex[location].element * sizeof(GLfloat) * numElements);
if(transpose == GL_FALSE)
{
memcpy(dst, value, numElements * sizeof(GLfloat) * count);
}
else
{
const int rowSize = VariableRowCount(type);
const int colSize = VariableColumnCount(type);
for(int n = 0; n < count; ++n)
{
for(int i = 0; i < colSize; ++i)
{
for(int j = 0; j < rowSize; ++j)
{
dst[i * rowSize + j] = value[j * colSize + i];
}
}
dst += numElements;
value += numElements;
}
}
return true;
}
bool Program::setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value)
bool Program::setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT2);
return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT2);
}
bool Program::setUniformMatrix2x3fv(GLint location, GLsizei count, const GLfloat *value)
bool Program::setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT2x3);
return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT2x3);
}
bool Program::setUniformMatrix2x4fv(GLint location, GLsizei count, const GLfloat *value)
bool Program::setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT2x4);
return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT2x4);
}
bool Program::setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value)
bool Program::setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT3);
return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT3);
}
bool Program::setUniformMatrix3x2fv(GLint location, GLsizei count, const GLfloat *value)
bool Program::setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT3x2);
return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT3x2);
}
bool Program::setUniformMatrix3x4fv(GLint location, GLsizei count, const GLfloat *value)
bool Program::setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT3x4);
return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT3x4);
}
bool Program::setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value)
bool Program::setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT4);
return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT4);
}
bool Program::setUniformMatrix4x2fv(GLint location, GLsizei count, const GLfloat *value)
bool Program::setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT4x2);
return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT4x2);
}
bool Program::setUniformMatrix4x3fv(GLint location, GLsizei count, const GLfloat *value)
bool Program::setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
{
return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT4x3);
return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT4x3);
}
bool Program::setUniform1iv(GLint location, GLsizei count, const GLint *v)
......
......@@ -90,15 +90,15 @@ namespace es2
bool setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
bool setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
bool setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
bool setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
bool setUniformMatrix2x3fv(GLint location, GLsizei count, const GLfloat *value);
bool setUniformMatrix2x4fv(GLint location, GLsizei count, const GLfloat *value);
bool setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
bool setUniformMatrix3x2fv(GLint location, GLsizei count, const GLfloat *value);
bool setUniformMatrix3x4fv(GLint location, GLsizei count, const GLfloat *value);
bool setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
bool setUniformMatrix4x2fv(GLint location, GLsizei count, const GLfloat *value);
bool setUniformMatrix4x3fv(GLint location, GLsizei count, const GLfloat *value);
bool setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
bool setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
bool setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
bool setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
bool setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
bool setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
bool setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
bool setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
bool setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
bool setUniform1iv(GLint location, GLsizei count, const GLint *v);
bool setUniform2iv(GLint location, GLsizei count, const GLint *v);
bool setUniform3iv(GLint location, GLsizei count, const GLint *v);
......@@ -178,7 +178,7 @@ namespace es2
bool applyUniform4uiv(GLint location, GLsizei count, const GLuint *v);
bool setUniformfv(GLint location, GLsizei count, const GLfloat *v, int numElements);
bool setUniformMatrixfv(GLint location, GLsizei count, const GLfloat *value, GLenum type);
bool setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum type);
bool setUniformiv(GLint location, GLsizei count, const GLint *v, int numElements);
bool setUniformuiv(GLint location, GLsizei count, const GLuint *v, int numElements);
......
......@@ -6348,7 +6348,7 @@ void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = %p)",
location, count, transpose, value);
if(count < 0 || transpose != GL_FALSE)
if(count < 0)
{
return error(GL_INVALID_VALUE);
}
......@@ -6362,6 +6362,11 @@ void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const
if(context)
{
if(context->getClientVersion() < 3 && transpose != GL_FALSE)
{
return error(GL_INVALID_VALUE);
}
es2::Program *program = context->getCurrentProgram();
if(!program)
......@@ -6369,7 +6374,7 @@ void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const
return error(GL_INVALID_OPERATION);
}
if(!program->setUniformMatrix2fv(location, count, value))
if(!program->setUniformMatrix2fv(location, count, transpose, value))
{
return error(GL_INVALID_OPERATION);
}
......@@ -6381,7 +6386,7 @@ void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = %p)",
location, count, transpose, value);
if(count < 0 || transpose != GL_FALSE)
if(count < 0)
{
return error(GL_INVALID_VALUE);
}
......@@ -6395,6 +6400,11 @@ void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const
if(context)
{
if(context->getClientVersion() < 3 && transpose != GL_FALSE)
{
return error(GL_INVALID_VALUE);
}
es2::Program *program = context->getCurrentProgram();
if(!program)
......@@ -6402,7 +6412,7 @@ void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const
return error(GL_INVALID_OPERATION);
}
if(!program->setUniformMatrix3fv(location, count, value))
if(!program->setUniformMatrix3fv(location, count, transpose, value))
{
return error(GL_INVALID_OPERATION);
}
......@@ -6414,7 +6424,7 @@ void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = %p)",
location, count, transpose, value);
if(count < 0 || transpose != GL_FALSE)
if(count < 0)
{
return error(GL_INVALID_VALUE);
}
......@@ -6428,6 +6438,11 @@ void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const
if(context)
{
if(context->getClientVersion() < 3 && transpose != GL_FALSE)
{
return error(GL_INVALID_VALUE);
}
es2::Program *program = context->getCurrentProgram();
if(!program)
......@@ -6435,7 +6450,7 @@ void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const
return error(GL_INVALID_OPERATION);
}
if(!program->setUniformMatrix4fv(location, count, value))
if(!program->setUniformMatrix4fv(location, count, transpose, value))
{
return error(GL_INVALID_OPERATION);
}
......
......@@ -1160,7 +1160,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv(GLint location, GLsizei count,
{
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);
if(count < 0 || transpose != GL_FALSE)
if(count < 0)
{
return error(GL_INVALID_VALUE);
}
......@@ -1181,7 +1181,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv(GLint location, GLsizei count,
return error(GL_INVALID_OPERATION);
}
if(!program->setUniformMatrix2x3fv(location, count, value))
if(!program->setUniformMatrix2x3fv(location, count, transpose, value))
{
return error(GL_INVALID_OPERATION);
}
......@@ -1192,7 +1192,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv(GLint location, GLsizei count,
{
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);
if(count < 0 || transpose != GL_FALSE)
if(count < 0)
{
return error(GL_INVALID_VALUE);
}
......@@ -1213,7 +1213,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv(GLint location, GLsizei count,
return error(GL_INVALID_OPERATION);
}
if(!program->setUniformMatrix3x2fv(location, count, value))
if(!program->setUniformMatrix3x2fv(location, count, transpose, value))
{
return error(GL_INVALID_OPERATION);
}
......@@ -1224,7 +1224,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv(GLint location, GLsizei count,
{
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);
if(count < 0 || transpose != GL_FALSE)
if(count < 0)
{
return error(GL_INVALID_VALUE);
}
......@@ -1245,7 +1245,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv(GLint location, GLsizei count,
return error(GL_INVALID_OPERATION);
}
if(!program->setUniformMatrix2x4fv(location, count, value))
if(!program->setUniformMatrix2x4fv(location, count, transpose, value))
{
return error(GL_INVALID_OPERATION);
}
......@@ -1256,7 +1256,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv(GLint location, GLsizei count,
{
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);
if(count < 0 || transpose != GL_FALSE)
if(count < 0)
{
return error(GL_INVALID_VALUE);
}
......@@ -1277,7 +1277,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv(GLint location, GLsizei count,
return error(GL_INVALID_OPERATION);
}
if(!program->setUniformMatrix4x2fv(location, count, value))
if(!program->setUniformMatrix4x2fv(location, count, transpose, value))
{
return error(GL_INVALID_OPERATION);
}
......@@ -1288,7 +1288,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv(GLint location, GLsizei count,
{
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);
if(count < 0 || transpose != GL_FALSE)
if(count < 0)
{
return error(GL_INVALID_VALUE);
}
......@@ -1309,7 +1309,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv(GLint location, GLsizei count,
return error(GL_INVALID_OPERATION);
}
if(!program->setUniformMatrix3x4fv(location, count, value))
if(!program->setUniformMatrix3x4fv(location, count, transpose, value))
{
return error(GL_INVALID_OPERATION);
}
......@@ -1320,7 +1320,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv(GLint location, GLsizei count,
{
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);
if(count < 0 || transpose != GL_FALSE)
if(count < 0)
{
return error(GL_INVALID_VALUE);
}
......@@ -1341,7 +1341,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv(GLint location, GLsizei count,
return error(GL_INVALID_OPERATION);
}
if(!program->setUniformMatrix4x3fv(location, count, value))
if(!program->setUniformMatrix4x3fv(location, count, transpose, value))
{
return error(GL_INVALID_OPERATION);
}
......
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