D3D: Add memcmp filtering for matrix uniforms.
This was already implemented, it simply hooks it up to the
rest of the code. Could improve performance on some badly
behaved benchmarks.
BUG=angleproject:1390
Change-Id: I539df611d51ca085712fa8022bf8a7c1990afc65
Reviewed-on: https://chromium-review.googlesource.com/663896
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index 8cd7485..1f4843a 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -2208,8 +2208,13 @@
if (targetUniform->typeInfo.isSampler)
{
ASSERT(uniformType == GL_INT);
- memcpy(&targetUniform->mSamplerData[locationInfo.element], v, count * sizeof(T));
- mDirtySamplerMapping = true;
+ size_t size = count * sizeof(T);
+ auto dest = &targetUniform->mSamplerData[locationInfo.element];
+ if (memcmp(dest, v, size) != 0)
+ {
+ memcpy(dest, v, size);
+ mDirtySamplerMapping = true;
+ }
return;
}
@@ -2233,7 +2238,7 @@
}
template <int cols, int rows>
-void ProgramD3D::setUniformMatrixfvImpl(GLint location,
+bool ProgramD3D::setUniformMatrixfvImpl(GLint location,
GLsizei countIn,
GLboolean transpose,
const GLfloat *value,
@@ -2250,20 +2255,24 @@
GLfloat *target = reinterpret_cast<GLfloat *>(targetData + arrayElement * sizeof(GLfloat) *
targetMatrixStride);
+ bool dirty = false;
+
for (unsigned int i = 0; i < count; i++)
{
// Internally store matrices as transposed versions to accomodate HLSL matrix indexing
if (transpose == GL_FALSE)
{
- TransposeExpandMatrix<GLfloat, cols, rows>(target, value);
+ dirty = TransposeExpandMatrix<GLfloat, cols, rows>(target, value) || dirty;
}
else
{
- ExpandMatrix<GLfloat, cols, rows>(target, value);
+ dirty = ExpandMatrix<GLfloat, cols, rows>(target, value) || dirty;
}
target += targetMatrixStride;
value += cols * rows;
}
+
+ return dirty;
}
template <int cols, int rows>
@@ -2277,23 +2286,29 @@
if (targetUniform->vsData)
{
- setUniformMatrixfvImpl<cols, rows>(location, countIn, transpose, value,
- targetUniform->vsData, targetUniformType);
- mVertexUniformsDirty = true;
+ if (setUniformMatrixfvImpl<cols, rows>(location, countIn, transpose, value,
+ targetUniform->vsData, targetUniformType))
+ {
+ mVertexUniformsDirty = true;
+ }
}
if (targetUniform->psData)
{
- setUniformMatrixfvImpl<cols, rows>(location, countIn, transpose, value,
- targetUniform->psData, targetUniformType);
- mFragmentUniformsDirty = true;
+ if (setUniformMatrixfvImpl<cols, rows>(location, countIn, transpose, value,
+ targetUniform->psData, targetUniformType))
+ {
+ mFragmentUniformsDirty = true;
+ }
}
if (targetUniform->csData)
{
- setUniformMatrixfvImpl<cols, rows>(location, countIn, transpose, value,
- targetUniform->csData, targetUniformType);
- mComputeUniformsDirty = true;
+ if (setUniformMatrixfvImpl<cols, rows>(location, countIn, transpose, value,
+ targetUniform->csData, targetUniformType))
+ {
+ mComputeUniformsDirty = true;
+ }
}
}