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