{\r
case 2: return GL_FLOAT_MAT3x2;\r
case 3: return GL_FLOAT_MAT3;\r
- case 4: return GL_FLOAT_MAT4x2;\r
+ case 4: return GL_FLOAT_MAT3x4;\r
default: UNREACHABLE();\r
}\r
case 4:\r
return setUniformfv(location, count, v, 4);\r
}\r
\r
- bool Program::setUniformMatrixfv(GLint location, GLsizei count, const GLfloat *value, GLenum type)\r
+ bool Program::setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum type)\r
{\r
int numElements;\r
switch(type)\r
\r
count = std::min(size - (int)uniformIndex[location].element, count);\r
\r
- memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLfloat)* numElements,\r
- value, numElements * sizeof(GLfloat)* count);\r
+ GLfloat* dst = reinterpret_cast<GLfloat*>(targetUniform->data + uniformIndex[location].element * sizeof(GLfloat) * numElements);\r
+\r
+ if(transpose == GL_FALSE)\r
+ {\r
+ memcpy(dst, value, numElements * sizeof(GLfloat) * count);\r
+ }\r
+ else\r
+ {\r
+ const int rowSize = VariableRowCount(type);\r
+ const int colSize = VariableColumnCount(type);\r
+ for(int n = 0; n < count; ++n)\r
+ {\r
+ for(int i = 0; i < colSize; ++i)\r
+ {\r
+ for(int j = 0; j < rowSize; ++j)\r
+ {\r
+ dst[i * rowSize + j] = value[j * colSize + i];\r
+ }\r
+ }\r
+ dst += numElements;\r
+ value += numElements;\r
+ }\r
+ }\r
+\r
\r
return true;\r
}\r
\r
- bool Program::setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value)\r
+ bool Program::setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
{\r
- return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT2);\r
+ return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT2);\r
}\r
\r
- bool Program::setUniformMatrix2x3fv(GLint location, GLsizei count, const GLfloat *value)\r
+ bool Program::setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
{\r
- return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT2x3);\r
+ return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT2x3);\r
}\r
\r
- bool Program::setUniformMatrix2x4fv(GLint location, GLsizei count, const GLfloat *value)\r
+ bool Program::setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
{\r
- return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT2x4);\r
+ return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT2x4);\r
}\r
\r
- bool Program::setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value)\r
+ bool Program::setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
{\r
- return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT3);\r
+ return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT3);\r
}\r
\r
- bool Program::setUniformMatrix3x2fv(GLint location, GLsizei count, const GLfloat *value)\r
+ bool Program::setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
{\r
- return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT3x2);\r
+ return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT3x2);\r
}\r
\r
- bool Program::setUniformMatrix3x4fv(GLint location, GLsizei count, const GLfloat *value)\r
+ bool Program::setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
{\r
- return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT3x4);\r
+ return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT3x4);\r
}\r
\r
- bool Program::setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value)\r
+ bool Program::setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
{\r
- return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT4);\r
+ return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT4);\r
}\r
\r
- bool Program::setUniformMatrix4x2fv(GLint location, GLsizei count, const GLfloat *value)\r
+ bool Program::setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
{\r
- return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT4x2);\r
+ return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT4x2);\r
}\r
\r
- bool Program::setUniformMatrix4x3fv(GLint location, GLsizei count, const GLfloat *value)\r
+ bool Program::setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\r
{\r
- return setUniformMatrixfv(location, count, value, GL_FLOAT_MAT4x3);\r
+ return setUniformMatrixfv(location, count, transpose, value, GL_FLOAT_MAT4x3);\r
}\r
\r
bool Program::setUniform1iv(GLint location, GLsizei count, const GLint *v)\r
bool setUniform2fv(GLint location, GLsizei count, const GLfloat *v);\r
bool setUniform3fv(GLint location, GLsizei count, const GLfloat *v);\r
bool setUniform4fv(GLint location, GLsizei count, const GLfloat *v);\r
- bool setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);\r
- bool setUniformMatrix2x3fv(GLint location, GLsizei count, const GLfloat *value);\r
- bool setUniformMatrix2x4fv(GLint location, GLsizei count, const GLfloat *value);\r
- bool setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);\r
- bool setUniformMatrix3x2fv(GLint location, GLsizei count, const GLfloat *value);\r
- bool setUniformMatrix3x4fv(GLint location, GLsizei count, const GLfloat *value);\r
- bool setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);\r
- bool setUniformMatrix4x2fv(GLint location, GLsizei count, const GLfloat *value);\r
- bool setUniformMatrix4x3fv(GLint location, GLsizei count, const GLfloat *value);\r
+ bool setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
+ bool setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
+ bool setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
+ bool setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
+ bool setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
+ bool setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
+ bool setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
+ bool setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
+ bool setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\r
bool setUniform1iv(GLint location, GLsizei count, const GLint *v);\r
bool setUniform2iv(GLint location, GLsizei count, const GLint *v);\r
bool setUniform3iv(GLint location, GLsizei count, const GLint *v);\r
bool applyUniform4uiv(GLint location, GLsizei count, const GLuint *v);\r
\r
bool setUniformfv(GLint location, GLsizei count, const GLfloat *v, int numElements);\r
- bool setUniformMatrixfv(GLint location, GLsizei count, const GLfloat *value, GLenum type);\r
+ bool setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum type);\r
bool setUniformiv(GLint location, GLsizei count, const GLint *v, int numElements);\r
bool setUniformuiv(GLint location, GLsizei count, const GLuint *v, int numElements);\r
\r
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = %p)",\r
location, count, transpose, value);\r
\r
- if(count < 0 || transpose != GL_FALSE)\r
+ if(count < 0)\r
{\r
return error(GL_INVALID_VALUE);\r
}\r
\r
if(context)\r
{\r
+ if(context->getClientVersion() < 3 && transpose != GL_FALSE)\r
+ {\r
+ return error(GL_INVALID_VALUE);\r
+ }\r
+\r
es2::Program *program = context->getCurrentProgram();\r
\r
if(!program)\r
return error(GL_INVALID_OPERATION);\r
}\r
\r
- if(!program->setUniformMatrix2fv(location, count, value))\r
+ if(!program->setUniformMatrix2fv(location, count, transpose, value))\r
{\r
return error(GL_INVALID_OPERATION);\r
}\r
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = %p)",\r
location, count, transpose, value);\r
\r
- if(count < 0 || transpose != GL_FALSE)\r
+ if(count < 0)\r
{\r
return error(GL_INVALID_VALUE);\r
}\r
\r
if(context)\r
{\r
+ if(context->getClientVersion() < 3 && transpose != GL_FALSE)\r
+ {\r
+ return error(GL_INVALID_VALUE);\r
+ }\r
+\r
es2::Program *program = context->getCurrentProgram();\r
\r
if(!program)\r
return error(GL_INVALID_OPERATION);\r
}\r
\r
- if(!program->setUniformMatrix3fv(location, count, value))\r
+ if(!program->setUniformMatrix3fv(location, count, transpose, value))\r
{\r
return error(GL_INVALID_OPERATION);\r
}\r
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = %p)",\r
location, count, transpose, value);\r
\r
- if(count < 0 || transpose != GL_FALSE)\r
+ if(count < 0)\r
{\r
return error(GL_INVALID_VALUE);\r
}\r
\r
if(context)\r
{\r
+ if(context->getClientVersion() < 3 && transpose != GL_FALSE)\r
+ {\r
+ return error(GL_INVALID_VALUE);\r
+ }\r
+\r
es2::Program *program = context->getCurrentProgram();\r
\r
if(!program)\r
return error(GL_INVALID_OPERATION);\r
}\r
\r
- if(!program->setUniformMatrix4fv(location, count, value))\r
+ if(!program->setUniformMatrix4fv(location, count, transpose, value))\r
{\r
return error(GL_INVALID_OPERATION);\r
}\r
{\r
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);\r
\r
- if(count < 0 || transpose != GL_FALSE)\r
+ if(count < 0)\r
{\r
return error(GL_INVALID_VALUE);\r
}\r
return error(GL_INVALID_OPERATION);\r
}\r
\r
- if(!program->setUniformMatrix2x3fv(location, count, value))\r
+ if(!program->setUniformMatrix2x3fv(location, count, transpose, value))\r
{\r
return error(GL_INVALID_OPERATION);\r
}\r
{\r
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);\r
\r
- if(count < 0 || transpose != GL_FALSE)\r
+ if(count < 0)\r
{\r
return error(GL_INVALID_VALUE);\r
}\r
return error(GL_INVALID_OPERATION);\r
}\r
\r
- if(!program->setUniformMatrix3x2fv(location, count, value))\r
+ if(!program->setUniformMatrix3x2fv(location, count, transpose, value))\r
{\r
return error(GL_INVALID_OPERATION);\r
}\r
{\r
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);\r
\r
- if(count < 0 || transpose != GL_FALSE)\r
+ if(count < 0)\r
{\r
return error(GL_INVALID_VALUE);\r
}\r
return error(GL_INVALID_OPERATION);\r
}\r
\r
- if(!program->setUniformMatrix2x4fv(location, count, value))\r
+ if(!program->setUniformMatrix2x4fv(location, count, transpose, value))\r
{\r
return error(GL_INVALID_OPERATION);\r
}\r
{\r
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);\r
\r
- if(count < 0 || transpose != GL_FALSE)\r
+ if(count < 0)\r
{\r
return error(GL_INVALID_VALUE);\r
}\r
return error(GL_INVALID_OPERATION);\r
}\r
\r
- if(!program->setUniformMatrix4x2fv(location, count, value))\r
+ if(!program->setUniformMatrix4x2fv(location, count, transpose, value))\r
{\r
return error(GL_INVALID_OPERATION);\r
}\r
{\r
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);\r
\r
- if(count < 0 || transpose != GL_FALSE)\r
+ if(count < 0)\r
{\r
return error(GL_INVALID_VALUE);\r
}\r
return error(GL_INVALID_OPERATION);\r
}\r
\r
- if(!program->setUniformMatrix3x4fv(location, count, value))\r
+ if(!program->setUniformMatrix3x4fv(location, count, transpose, value))\r
{\r
return error(GL_INVALID_OPERATION);\r
}\r
{\r
TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat *value = %p)", location, count, transpose, value);\r
\r
- if(count < 0 || transpose != GL_FALSE)\r
+ if(count < 0)\r
{\r
return error(GL_INVALID_VALUE);\r
}\r
return error(GL_INVALID_OPERATION);\r
}\r
\r
- if(!program->setUniformMatrix4x3fv(location, count, value))\r
+ if(!program->setUniformMatrix4x3fv(location, count, transpose, value))\r
{\r
return error(GL_INVALID_OPERATION);\r
}\r