Commit 3456d8fd by Alexis Hetu Committed by Alexis Hétu

Adding NxM matrices uniform support

Added NxM matrices related functions and entries to Program and utilities. Change-Id: I5839c21cb3a9dc469fca4c553a0b5f97e0ad48bf Reviewed-on: https://swiftshader-review.googlesource.com/3105Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent b8cf3ffd
...@@ -885,7 +885,13 @@ namespace es2 ...@@ -885,7 +885,13 @@ namespace es2
case GL_FLOAT_VEC3: applyUniform3fv(location, size, f); break; case GL_FLOAT_VEC3: applyUniform3fv(location, size, f); break;
case GL_FLOAT_VEC4: applyUniform4fv(location, size, f); break; case GL_FLOAT_VEC4: applyUniform4fv(location, size, f); break;
case GL_FLOAT_MAT2: applyUniformMatrix2fv(location, size, f); break; case GL_FLOAT_MAT2: applyUniformMatrix2fv(location, size, f); break;
case GL_FLOAT_MAT2x3: applyUniformMatrix2x3fv(location, size, f); break;
case GL_FLOAT_MAT2x4: applyUniformMatrix2x4fv(location, size, f); break;
case GL_FLOAT_MAT3x2: applyUniformMatrix3x2fv(location, size, f); break;
case GL_FLOAT_MAT3: applyUniformMatrix3fv(location, size, f); break; case GL_FLOAT_MAT3: applyUniformMatrix3fv(location, size, f); break;
case GL_FLOAT_MAT3x4: applyUniformMatrix3x4fv(location, size, f); break;
case GL_FLOAT_MAT4x2: applyUniformMatrix4x2fv(location, size, f); break;
case GL_FLOAT_MAT4x3: applyUniformMatrix4x3fv(location, size, f); break;
case GL_FLOAT_MAT4: applyUniformMatrix4fv(location, size, f); break; case GL_FLOAT_MAT4: applyUniformMatrix4fv(location, size, f); break;
case GL_SAMPLER_2D: case GL_SAMPLER_2D:
case GL_SAMPLER_CUBE: case GL_SAMPLER_CUBE:
...@@ -1511,6 +1517,60 @@ namespace es2 ...@@ -1511,6 +1517,60 @@ namespace es2
return true; return true;
} }
bool Program::applyUniformMatrix2x3fv(GLint location, GLsizei count, const GLfloat *value)
{
float matrix[(MAX_UNIFORM_VECTORS + 1) / 2][2][4];
for(int i = 0; i < count; i++)
{
matrix[i][0][0] = value[0]; matrix[i][0][1] = value[1]; matrix[i][0][2] = value[2]; matrix[i][0][3] = 0;
matrix[i][1][0] = value[3]; matrix[i][1][1] = value[4]; matrix[i][1][2] = value[5]; matrix[i][1][3] = 0;
value += 6;
}
Uniform *targetUniform = uniforms[uniformIndex[location].index];
if(targetUniform->psRegisterIndex != -1)
{
device->setPixelShaderConstantF(targetUniform->psRegisterIndex, (float*)matrix, targetUniform->registerCount());
}
if(targetUniform->vsRegisterIndex != -1)
{
device->setVertexShaderConstantF(targetUniform->vsRegisterIndex, (float*)matrix, targetUniform->registerCount());
}
return true;
}
bool Program::applyUniformMatrix2x4fv(GLint location, GLsizei count, const GLfloat *value)
{
float matrix[(MAX_UNIFORM_VECTORS + 1) / 2][2][4];
for(int i = 0; i < count; i++)
{
matrix[i][0][0] = value[0]; matrix[i][0][1] = value[1]; matrix[i][0][2] = value[2]; matrix[i][0][3] = value[3];
matrix[i][1][0] = value[4]; matrix[i][1][1] = value[5]; matrix[i][1][2] = value[6]; matrix[i][1][3] = value[7];
value += 8;
}
Uniform *targetUniform = uniforms[uniformIndex[location].index];
if(targetUniform->psRegisterIndex != -1)
{
device->setPixelShaderConstantF(targetUniform->psRegisterIndex, (float*)matrix, targetUniform->registerCount());
}
if(targetUniform->vsRegisterIndex != -1)
{
device->setVertexShaderConstantF(targetUniform->vsRegisterIndex, (float*)matrix, targetUniform->registerCount());
}
return true;
}
bool Program::applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value) bool Program::applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value)
{ {
float matrix[(MAX_UNIFORM_VECTORS + 2) / 3][3][4]; float matrix[(MAX_UNIFORM_VECTORS + 2) / 3][3][4];
...@@ -1539,6 +1599,62 @@ namespace es2 ...@@ -1539,6 +1599,62 @@ namespace es2
return true; return true;
} }
bool Program::applyUniformMatrix3x2fv(GLint location, GLsizei count, const GLfloat *value)
{
float matrix[(MAX_UNIFORM_VECTORS + 2) / 3][3][4];
for(int i = 0; i < count; i++)
{
matrix[i][0][0] = value[0]; matrix[i][0][1] = value[1]; matrix[i][0][2] = 0; matrix[i][0][3] = 0;
matrix[i][1][0] = value[2]; matrix[i][1][1] = value[3]; matrix[i][1][2] = 0; matrix[i][1][3] = 0;
matrix[i][2][0] = value[4]; matrix[i][2][1] = value[5]; matrix[i][2][2] = 0; matrix[i][2][3] = 0;
value += 6;
}
Uniform *targetUniform = uniforms[uniformIndex[location].index];
if(targetUniform->psRegisterIndex != -1)
{
device->setPixelShaderConstantF(targetUniform->psRegisterIndex, (float*)matrix, targetUniform->registerCount());
}
if(targetUniform->vsRegisterIndex != -1)
{
device->setVertexShaderConstantF(targetUniform->vsRegisterIndex, (float*)matrix, targetUniform->registerCount());
}
return true;
}
bool Program::applyUniformMatrix3x4fv(GLint location, GLsizei count, const GLfloat *value)
{
float matrix[(MAX_UNIFORM_VECTORS + 2) / 3][3][4];
for(int i = 0; i < count; i++)
{
matrix[i][0][0] = value[0]; matrix[i][0][1] = value[1]; matrix[i][0][2] = value[2]; matrix[i][0][3] = value[3];
matrix[i][1][0] = value[4]; matrix[i][1][1] = value[5]; matrix[i][1][2] = value[6]; matrix[i][1][3] = value[7];
matrix[i][2][0] = value[8]; matrix[i][2][1] = value[9]; matrix[i][2][2] = value[10]; matrix[i][2][3] = value[11];
value += 12;
}
Uniform *targetUniform = uniforms[uniformIndex[location].index];
if(targetUniform->psRegisterIndex != -1)
{
device->setPixelShaderConstantF(targetUniform->psRegisterIndex, (float*)matrix, targetUniform->registerCount());
}
if(targetUniform->vsRegisterIndex != -1)
{
device->setVertexShaderConstantF(targetUniform->vsRegisterIndex, (float*)matrix, targetUniform->registerCount());
}
return true;
}
bool Program::applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value) bool Program::applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value)
{ {
Uniform *targetUniform = uniforms[uniformIndex[location].index]; Uniform *targetUniform = uniforms[uniformIndex[location].index];
...@@ -1556,6 +1672,64 @@ namespace es2 ...@@ -1556,6 +1672,64 @@ namespace es2
return true; return true;
} }
bool Program::applyUniformMatrix4x2fv(GLint location, GLsizei count, const GLfloat *value)
{
float matrix[(MAX_UNIFORM_VECTORS + 2) / 3][3][4];
for(int i = 0; i < count; i++)
{
matrix[i][0][0] = value[0]; matrix[i][0][1] = value[1]; matrix[i][0][2] = 0; matrix[i][0][3] = 0;
matrix[i][1][0] = value[2]; matrix[i][1][1] = value[3]; matrix[i][1][2] = 0; matrix[i][1][3] = 0;
matrix[i][2][0] = value[4]; matrix[i][2][1] = value[5]; matrix[i][2][2] = 0; matrix[i][2][3] = 0;
matrix[i][3][0] = value[6]; matrix[i][3][1] = value[7]; matrix[i][3][2] = 0; matrix[i][3][3] = 0;
value += 8;
}
Uniform *targetUniform = uniforms[uniformIndex[location].index];
if(targetUniform->psRegisterIndex != -1)
{
device->setPixelShaderConstantF(targetUniform->psRegisterIndex, (float*)matrix, targetUniform->registerCount());
}
if(targetUniform->vsRegisterIndex != -1)
{
device->setVertexShaderConstantF(targetUniform->vsRegisterIndex, (float*)matrix, targetUniform->registerCount());
}
return true;
}
bool Program::applyUniformMatrix4x3fv(GLint location, GLsizei count, const GLfloat *value)
{
float matrix[(MAX_UNIFORM_VECTORS + 2) / 3][3][4];
for(int i = 0; i < count; i++)
{
matrix[i][0][0] = value[0]; matrix[i][0][1] = value[1]; matrix[i][0][2] = value[2]; matrix[i][0][3] = 0;
matrix[i][1][0] = value[3]; matrix[i][1][1] = value[4]; matrix[i][1][2] = value[5]; matrix[i][1][3] = 0;
matrix[i][2][0] = value[6]; matrix[i][2][1] = value[7]; matrix[i][2][2] = value[8]; matrix[i][2][3] = 0;
matrix[i][3][0] = value[9]; matrix[i][3][1] = value[10]; matrix[i][3][2] = value[11]; matrix[i][3][3] = 0;
value += 12;
}
Uniform *targetUniform = uniforms[uniformIndex[location].index];
if(targetUniform->psRegisterIndex != -1)
{
device->setPixelShaderConstantF(targetUniform->psRegisterIndex, (float*)matrix, targetUniform->registerCount());
}
if(targetUniform->vsRegisterIndex != -1)
{
device->setVertexShaderConstantF(targetUniform->vsRegisterIndex, (float*)matrix, targetUniform->registerCount());
}
return true;
}
bool Program::applyUniform1iv(GLint location, GLsizei count, const GLint *v) bool Program::applyUniform1iv(GLint location, GLsizei count, const GLint *v)
{ {
float vector[MAX_UNIFORM_VECTORS][4]; float vector[MAX_UNIFORM_VECTORS][4];
......
...@@ -160,8 +160,14 @@ namespace es2 ...@@ -160,8 +160,14 @@ namespace es2
bool applyUniform3fv(GLint location, GLsizei count, const GLfloat *v); bool applyUniform3fv(GLint location, GLsizei count, const GLfloat *v);
bool applyUniform4fv(GLint location, GLsizei count, const GLfloat *v); bool applyUniform4fv(GLint location, GLsizei count, const GLfloat *v);
bool applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value); bool applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
bool applyUniformMatrix2x3fv(GLint location, GLsizei count, const GLfloat *value);
bool applyUniformMatrix2x4fv(GLint location, GLsizei count, const GLfloat *value);
bool applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value); bool applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
bool applyUniformMatrix3x2fv(GLint location, GLsizei count, const GLfloat *value);
bool applyUniformMatrix3x4fv(GLint location, GLsizei count, const GLfloat *value);
bool applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value); bool applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
bool applyUniformMatrix4x2fv(GLint location, GLsizei count, const GLfloat *value);
bool applyUniformMatrix4x3fv(GLint location, GLsizei count, const GLfloat *value);
bool applyUniform1iv(GLint location, GLsizei count, const GLint *v); bool applyUniform1iv(GLint location, GLsizei count, const GLint *v);
bool applyUniform2iv(GLint location, GLsizei count, const GLint *v); bool applyUniform2iv(GLint location, GLsizei count, const GLint *v);
bool applyUniform3iv(GLint location, GLsizei count, const GLint *v); bool applyUniform3iv(GLint location, GLsizei count, const GLint *v);
......
...@@ -47,8 +47,17 @@ namespace es2 ...@@ -47,8 +47,17 @@ namespace es2
case GL_INT_VEC4: case GL_INT_VEC4:
case GL_FLOAT_MAT2: case GL_FLOAT_MAT2:
return 4; return 4;
case GL_FLOAT_MAT2x3:
case GL_FLOAT_MAT3x2:
return 6;
case GL_FLOAT_MAT2x4:
case GL_FLOAT_MAT4x2:
return 8;
case GL_FLOAT_MAT3: case GL_FLOAT_MAT3:
return 9; return 9;
case GL_FLOAT_MAT3x4:
case GL_FLOAT_MAT4x3:
return 12;
case GL_FLOAT_MAT4: case GL_FLOAT_MAT4:
return 16; return 16;
default: default:
...@@ -72,8 +81,14 @@ namespace es2 ...@@ -72,8 +81,14 @@ namespace es2
case GL_FLOAT_VEC3: case GL_FLOAT_VEC3:
case GL_FLOAT_VEC4: case GL_FLOAT_VEC4:
case GL_FLOAT_MAT2: case GL_FLOAT_MAT2:
case GL_FLOAT_MAT2x3:
case GL_FLOAT_MAT2x4:
case GL_FLOAT_MAT3: case GL_FLOAT_MAT3:
case GL_FLOAT_MAT3x2:
case GL_FLOAT_MAT3x4:
case GL_FLOAT_MAT4: case GL_FLOAT_MAT4:
case GL_FLOAT_MAT4x2:
case GL_FLOAT_MAT4x3:
return GL_FLOAT; return GL_FLOAT;
case GL_INT: case GL_INT:
case GL_SAMPLER_2D: case GL_SAMPLER_2D:
...@@ -127,10 +142,16 @@ namespace es2 ...@@ -127,10 +142,16 @@ namespace es2
case GL_SAMPLER_3D_OES: case GL_SAMPLER_3D_OES:
return 1; return 1;
case GL_FLOAT_MAT2: case GL_FLOAT_MAT2:
case GL_FLOAT_MAT3x2:
case GL_FLOAT_MAT4x2:
return 2; return 2;
case GL_FLOAT_MAT3: case GL_FLOAT_MAT3:
case GL_FLOAT_MAT2x3:
case GL_FLOAT_MAT4x3:
return 3; return 3;
case GL_FLOAT_MAT4: case GL_FLOAT_MAT4:
case GL_FLOAT_MAT2x4:
case GL_FLOAT_MAT3x4:
return 4; return 4;
default: default:
UNREACHABLE(); UNREACHABLE();
...@@ -153,16 +174,22 @@ namespace es2 ...@@ -153,16 +174,22 @@ namespace es2
case GL_FLOAT_VEC2: case GL_FLOAT_VEC2:
case GL_INT_VEC2: case GL_INT_VEC2:
case GL_FLOAT_MAT2: case GL_FLOAT_MAT2:
case GL_FLOAT_MAT2x3:
case GL_FLOAT_MAT2x4:
return 2; return 2;
case GL_INT_VEC3: case GL_INT_VEC3:
case GL_FLOAT_VEC3: case GL_FLOAT_VEC3:
case GL_BOOL_VEC3: case GL_BOOL_VEC3:
case GL_FLOAT_MAT3: case GL_FLOAT_MAT3:
case GL_FLOAT_MAT3x2:
case GL_FLOAT_MAT3x4:
return 3; return 3;
case GL_BOOL_VEC4: case GL_BOOL_VEC4:
case GL_FLOAT_VEC4: case GL_FLOAT_VEC4:
case GL_INT_VEC4: case GL_INT_VEC4:
case GL_FLOAT_MAT4: case GL_FLOAT_MAT4:
case GL_FLOAT_MAT4x2:
case GL_FLOAT_MAT4x3:
return 4; return 4;
default: default:
UNREACHABLE(); UNREACHABLE();
......
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