D3D: Keep a single dirty bit for uniforms.

This simplifies uniform management in D3D11. It will also facilitate
further optimizations.

Improves performance in a uniforms stress test by ~13% on a test
machine. (UniformsBenchmark.Run/d3d11_null_400_vec4)

BUG=angleproject:1390

Change-Id: Iba2c15d420396aa8fb4e8c451cba2b4dde7b4b77
Reviewed-on: https://chromium-review.googlesource.com/623930
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index 0d571d3..519e14c 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -283,7 +283,6 @@
       vsData(nullptr),
       psData(nullptr),
       csData(nullptr),
-      dirty(true),
       vsRegisterIndex(GL_INVALID_INDEX),
       psRegisterIndex(GL_INVALID_INDEX),
       csRegisterIndex(GL_INVALID_INDEX),
@@ -578,7 +577,8 @@
       mUsedPixelSamplerRange(0),
       mUsedComputeSamplerRange(0),
       mDirtySamplerMapping(true),
-      mSerial(issueSerial())
+      mSerial(issueSerial()),
+      mUniformsDirty(true)
 {
     mDynamicHLSL = new DynamicHLSL(renderer);
 }
@@ -712,9 +712,6 @@
     // Retrieve sampler uniform values
     for (const D3DUniform *d3dUniform : mD3DUniforms)
     {
-        if (!d3dUniform->dirty)
-            continue;
-
         if (!d3dUniform->isSampler())
             continue;
 
@@ -1786,17 +1783,11 @@
     }
 }
 
-gl::Error ProgramD3D::applyUniforms(GLenum drawMode)
+gl::Error ProgramD3D::applyUniforms()
 {
     ASSERT(!mDirtySamplerMapping);
-
-    ANGLE_TRY(mRenderer->applyUniforms(*this, drawMode, mD3DUniforms));
-
-    for (D3DUniform *d3dUniform : mD3DUniforms)
-    {
-        d3dUniform->dirty = false;
-    }
-
+    ANGLE_TRY(mRenderer->applyUniforms(*this, mD3DUniforms));
+    mUniformsDirty = false;
     return gl::NoError();
 }
 
@@ -1804,12 +1795,7 @@
 {
     ASSERT(!mDirtySamplerMapping);
     ANGLE_TRY(mRenderer->applyComputeUniforms(*this, mD3DUniforms));
-
-    for (D3DUniform *d3dUniform : mD3DUniforms)
-    {
-        d3dUniform->dirty = false;
-    }
-
+    mUniformsDirty = false;
     return gl::NoError();
 }
 
@@ -1874,10 +1860,7 @@
 
 void ProgramD3D::dirtyAllUniforms()
 {
-    for (D3DUniform *d3dUniform : mD3DUniforms)
-    {
-        d3dUniform->dirty = true;
-    }
+    mUniformsDirty = true;
 }
 
 void ProgramD3D::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
@@ -2173,18 +2156,15 @@
         if (shaderType == GL_FRAGMENT_SHADER)
         {
             d3dUniform->psRegisterIndex = reg;
-            d3dUniform->dirty           = true;
         }
         else if (shaderType == GL_VERTEX_SHADER)
         {
             d3dUniform->vsRegisterIndex = reg;
-            d3dUniform->dirty           = true;
         }
         else
         {
             ASSERT(shaderType == GL_COMPUTE_SHADER);
             d3dUniform->csRegisterIndex = reg;
-            d3dUniform->dirty           = true;
         }
 
         // Arrays are treated as aggregate types
@@ -2220,7 +2200,6 @@
             T *dest         = target + (i * 4);
             const T *source = v + (i * components);
             memcpy(dest, source, components * sizeof(T));
-            targetUniform->dirty = true;
         }
     }
     else if (targetUniform->type == targetBoolType)
@@ -2236,7 +2215,6 @@
             {
                 dest[c] = (source[c] == static_cast<T>(0)) ? GL_FALSE : GL_TRUE;
             }
-            targetUniform->dirty = true;
         }
     }
     else
@@ -2252,12 +2230,13 @@
     const gl::VariableLocation &locationInfo = mState.getUniformLocations()[location];
     D3DUniform *targetUniform                = mD3DUniforms[locationInfo.index];
 
+    mUniformsDirty = true;
+
     if (!targetUniform->mSamplerData.empty())
     {
         ASSERT(targetUniformType == GL_INT);
         memcpy(&targetUniform->mSamplerData[locationInfo.element], v, count * sizeof(T));
         mDirtySamplerMapping = true;
-        targetUniform->dirty = true;
         return;
     }
 
@@ -2300,17 +2279,17 @@
         // Internally store matrices as transposed versions to accomodate HLSL matrix indexing
         if (transpose == GL_FALSE)
         {
-            targetUniform->dirty =
-                TransposeExpandMatrix<GLfloat, cols, rows>(target, value) || targetUniform->dirty;
+            TransposeExpandMatrix<GLfloat, cols, rows>(target, value);
         }
         else
         {
-            targetUniform->dirty =
-                ExpandMatrix<GLfloat, cols, rows>(target, value) || targetUniform->dirty;
+            ExpandMatrix<GLfloat, cols, rows>(target, value);
         }
         target += targetMatrixStride;
         value += cols * rows;
     }
+
+    mUniformsDirty = true;
 }
 
 template <int cols, int rows>
@@ -2479,6 +2458,8 @@
     mStreamOutVaryings.clear();
 
     mGeometryShaderPreamble.clear();
+
+    mUniformsDirty = true;
 }
 
 unsigned int ProgramD3D::getSerial() const