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;
+        }
     }
 }