Optimized applying DX11 uniforms with memcpy.
TRAC #22428
Signed-off-by: Geoff Lang
Signed-off-by: Jamie Madill
Author: Nicolas Capens
git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1898 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index 4e4c018..d70d645 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -1254,91 +1254,24 @@
ID3D11Buffer *vertexConstantBuffer = vertexExecutable->getConstantBuffer(mDevice, totalRegisterCountVS);
ID3D11Buffer *pixelConstantBuffer = pixelExecutable->getConstantBuffer(mDevice, totalRegisterCountPS);
- void *mapVS = (totalRegisterCountVS > 0 && vertexUniformsDirty) ? new float[4 * totalRegisterCountVS] : NULL;
- void *mapPS = (totalRegisterCountPS > 0 && pixelUniformsDirty) ? new float[4 * totalRegisterCountPS] : NULL;
+ float (*mapVS)[4] = (totalRegisterCountVS > 0 && vertexUniformsDirty) ? new float[totalRegisterCountVS][4] : NULL;
+ float (*mapPS)[4] = (totalRegisterCountPS > 0 && pixelUniformsDirty) ? new float[totalRegisterCountPS][4] : NULL;
for (gl::UniformArray::iterator uniform_iterator = uniformArray->begin(); uniform_iterator != uniformArray->end(); uniform_iterator++)
{
gl::Uniform *uniform = *uniform_iterator;
- switch (uniform->type)
+ if (uniform->type != GL_SAMPLER_2D && uniform->type != GL_SAMPLER_CUBE)
{
- case GL_SAMPLER_2D:
- case GL_SAMPLER_CUBE:
- break;
- case GL_FLOAT:
- case GL_FLOAT_VEC2:
- case GL_FLOAT_VEC3:
- case GL_FLOAT_VEC4:
- case GL_FLOAT_MAT2:
- case GL_FLOAT_MAT3:
- case GL_FLOAT_MAT4:
if (uniform->vsRegisterIndex >= 0 && mapVS)
{
- GLfloat (*c)[4] = (GLfloat(*)[4])mapVS;
- float (*f)[4] = (float(*)[4])uniform->data;
-
- for (unsigned int i = 0; i < uniform->registerCount; i++)
- {
- c[uniform->vsRegisterIndex + i][0] = f[i][0];
- c[uniform->vsRegisterIndex + i][1] = f[i][1];
- c[uniform->vsRegisterIndex + i][2] = f[i][2];
- c[uniform->vsRegisterIndex + i][3] = f[i][3];
- }
+ memcpy(mapVS + uniform->vsRegisterIndex, uniform->data, uniform->registerCount * sizeof(float[4]));
}
+
if (uniform->psRegisterIndex >= 0 && mapPS)
{
- GLfloat (*c)[4] = (GLfloat(*)[4])mapPS;
- float (*f)[4] = (float(*)[4])uniform->data;
-
- for (unsigned int i = 0; i < uniform->registerCount; i++)
- {
- c[uniform->psRegisterIndex + i][0] = f[i][0];
- c[uniform->psRegisterIndex + i][1] = f[i][1];
- c[uniform->psRegisterIndex + i][2] = f[i][2];
- c[uniform->psRegisterIndex + i][3] = f[i][3];
- }
+ memcpy(mapPS + uniform->psRegisterIndex, uniform->data, uniform->registerCount * sizeof(float[4]));
}
- break;
- case GL_INT:
- case GL_INT_VEC2:
- case GL_INT_VEC3:
- case GL_INT_VEC4:
- case GL_BOOL:
- case GL_BOOL_VEC2:
- case GL_BOOL_VEC3:
- case GL_BOOL_VEC4:
- if (uniform->vsRegisterIndex >= 0 && mapVS)
- {
- int (*c)[4] = (int(*)[4])mapVS;
- GLint *x = (GLint*)uniform->data;
- int count = gl::VariableColumnCount(uniform->type);
-
- for (unsigned int i = 0; i < uniform->registerCount; i++)
- {
- if (count >= 1) c[uniform->vsRegisterIndex + i][0] = x[i * count + 0];
- if (count >= 2) c[uniform->vsRegisterIndex + i][1] = x[i * count + 1];
- if (count >= 3) c[uniform->vsRegisterIndex + i][2] = x[i * count + 2];
- if (count >= 4) c[uniform->vsRegisterIndex + i][3] = x[i * count + 3];
- }
- }
- if (uniform->psRegisterIndex >= 0 && mapPS)
- {
- int (*c)[4] = (int(*)[4])mapPS;
- GLint *x = (GLint*)uniform->data;
- int count = gl::VariableColumnCount(uniform->type);
-
- for (unsigned int i = 0; i < uniform->registerCount; i++)
- {
- if (count >= 1) c[uniform->psRegisterIndex + i][0] = x[i * count + 0];
- if (count >= 2) c[uniform->psRegisterIndex + i][1] = x[i * count + 1];
- if (count >= 3) c[uniform->psRegisterIndex + i][2] = x[i * count + 2];
- if (count >= 4) c[uniform->psRegisterIndex + i][3] = x[i * count + 3];
- }
- }
- break;
- default:
- UNREACHABLE();
}
uniform->dirty = false;