Use ShaderBitSet for active use bits on uniforms
BUG=angleproject:2169
Change-Id: I192c2e3c453540c8a6d7b0d066218ea3c9fbaab2
Reviewed-on: https://chromium-review.googlesource.com/989411
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index 74fecd0..afa61de 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -622,10 +622,7 @@
mDirtySamplerMapping(true),
mUsedComputeImageRange(0),
mUsedComputeReadonlyImageRange(0),
- mSerial(issueSerial()),
- mVertexUniformsDirty(true),
- mFragmentUniformsDirty(true),
- mComputeUniformsDirty(true)
+ mSerial(issueSerial())
{
mDynamicHLSL = new DynamicHLSL(renderer);
}
@@ -1148,6 +1145,8 @@
initializeUniformStorage();
+ dirtyAllUniforms();
+
return true;
}
@@ -1697,6 +1696,7 @@
mImagesCS.resize(data.getCaps().maxImageUnits);
mReadonlyImagesCS.resize(data.getCaps().maxImageUnits);
+ mShaderUniformsDirty.set(gl::ShaderType::Compute);
defineUniformsAndAssignRegisters(context);
gl::LinkResult result = compileComputeExecutable(context, infoLog);
@@ -1760,6 +1760,10 @@
initAttribLocationsToD3DSemantic(context);
+ // TODO(jiawei.shao@intel.com): set geometry uniforms dirty if user-defined geometry shader
+ // exists. Tracking bug: http://anglebug.com/1941
+ mShaderUniformsDirty.set(gl::ShaderType::Vertex);
+ mShaderUniformsDirty.set(gl::ShaderType::Fragment);
defineUniformsAndAssignRegisters(context);
gatherTransformFeedbackVaryings(resources.varyingPacking, builtins[gl::ShaderType::Vertex]);
@@ -1811,14 +1815,14 @@
D3DUniformBlock d3dUniformBlock;
- if (uniformBlock.vertexActive)
+ if (uniformBlock.isActive(gl::ShaderType::Vertex))
{
ASSERT(vertexShaderD3D != nullptr);
unsigned int baseRegister = vertexShaderD3D->getUniformBlockRegister(uniformBlock.name);
d3dUniformBlock.vsRegisterIndex = baseRegister + uniformBlockElement;
}
- if (uniformBlock.fragmentActive)
+ if (uniformBlock.isActive(gl::ShaderType::Fragment))
{
ASSERT(fragmentShaderD3D != nullptr);
unsigned int baseRegister =
@@ -1826,7 +1830,7 @@
d3dUniformBlock.psRegisterIndex = baseRegister + uniformBlockElement;
}
- if (uniformBlock.computeActive)
+ if (uniformBlock.isActive(gl::ShaderType::Compute))
{
ASSERT(computeShaderD3D != nullptr);
unsigned int baseRegister =
@@ -1968,16 +1972,12 @@
void ProgramD3D::dirtyAllUniforms()
{
- mVertexUniformsDirty = true;
- mFragmentUniformsDirty = true;
- mComputeUniformsDirty = true;
+ mShaderUniformsDirty = mState.getLinkedShaderStages();
}
void ProgramD3D::markUniformsClean()
{
- mVertexUniformsDirty = false;
- mFragmentUniformsDirty = false;
- mComputeUniformsDirty = false;
+ mShaderUniformsDirty.reset();
}
void ProgramD3D::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
@@ -2442,19 +2442,19 @@
if (targetUniform->vsData)
{
setUniformImpl(locationInfo, count, v, targetUniform->vsData, uniformType);
- mVertexUniformsDirty = true;
+ mShaderUniformsDirty.set(gl::ShaderType::Vertex);
}
if (targetUniform->psData)
{
setUniformImpl(locationInfo, count, v, targetUniform->psData, uniformType);
- mFragmentUniformsDirty = true;
+ mShaderUniformsDirty.set(gl::ShaderType::Fragment);
}
if (targetUniform->csData)
{
setUniformImpl(locationInfo, count, v, targetUniform->csData, uniformType);
- mComputeUniformsDirty = true;
+ mShaderUniformsDirty.set(gl::ShaderType::Compute);
}
}
@@ -2511,7 +2511,7 @@
if (setUniformMatrixfvImpl<cols, rows>(location, countIn, transpose, value,
targetUniform->vsData, targetUniformType))
{
- mVertexUniformsDirty = true;
+ mShaderUniformsDirty.set(gl::ShaderType::Vertex);
}
}
@@ -2520,7 +2520,7 @@
if (setUniformMatrixfvImpl<cols, rows>(location, countIn, transpose, value,
targetUniform->psData, targetUniformType))
{
- mFragmentUniformsDirty = true;
+ mShaderUniformsDirty.set(gl::ShaderType::Fragment);
}
}
@@ -2529,7 +2529,7 @@
if (setUniformMatrixfvImpl<cols, rows>(location, countIn, transpose, value,
targetUniform->csData, targetUniformType))
{
- mComputeUniformsDirty = true;
+ mShaderUniformsDirty.set(gl::ShaderType::Compute);
}
}
}
@@ -2757,7 +2757,7 @@
mGeometryShaderPreamble.clear();
- dirtyAllUniforms();
+ markUniformsClean();
mCachedPixelExecutableIndex.reset();
mCachedVertexExecutableIndex.reset();
@@ -2951,6 +2951,11 @@
return mCachedPixelExecutableIndex.valid();
}
+bool ProgramD3D::anyShaderUniformsDirty() const
+{
+ return mShaderUniformsDirty.any();
+}
+
template <typename DestT>
void ProgramD3D::getUniformInternal(GLint location, DestT *dataOut) const
{