Disable vertex attributes if not active in program
Even if explicitly enabled.
Bug: angleproject:2138
Change-Id: I598d21296bb6843e05cdeab146c1ff3da3a1174b
Reviewed-on: https://chromium-review.googlesource.com/1185743
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
diff --git a/src/libANGLE/VertexArray.cpp b/src/libANGLE/VertexArray.cpp
index 88eff70..25f529b 100644
--- a/src/libANGLE/VertexArray.cpp
+++ b/src/libANGLE/VertexArray.cpp
@@ -310,8 +310,12 @@
VertexAttribute &attrib = mState.mVertexAttributes[attribIndex];
+ if (mState.mEnabledAttributesMask.test(attribIndex) == enabledState)
+ {
+ return;
+ }
+
attrib.enabled = enabledState;
- mState.mVertexAttributesTypeMask.setIndex(GetVertexAttributeBaseType(attrib), attribIndex);
setDirtyAttribBit(attribIndex, DIRTY_ATTRIB_ENABLED);
diff --git a/src/libANGLE/renderer/gl/StateManagerGL.cpp b/src/libANGLE/renderer/gl/StateManagerGL.cpp
index 9fafdc8..1d3ffce 100644
--- a/src/libANGLE/renderer/gl/StateManagerGL.cpp
+++ b/src/libANGLE/renderer/gl/StateManagerGL.cpp
@@ -1945,8 +1945,8 @@
const VertexArrayGL *vaoGL = GetImplAs<VertexArrayGL>(state.getVertexArray());
bindVertexArray(vaoGL->getVertexArrayID(), vaoGL->getAppliedElementArrayBufferID());
- propagateNumViewsToVAO(state.getProgram(),
- GetImplAs<VertexArrayGL>(state.getVertexArray()));
+ propagateProgramToVAO(state.getProgram(),
+ GetImplAs<VertexArrayGL>(state.getVertexArray()));
break;
}
case gl::State::DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING:
@@ -1978,8 +1978,8 @@
case gl::State::DIRTY_BIT_PROGRAM_EXECUTABLE:
mProgramTexturesAndSamplersDirty = true;
mProgramStorageBuffersDirty = true;
- propagateNumViewsToVAO(state.getProgram(),
- GetImplAs<VertexArrayGL>(state.getVertexArray()));
+ propagateProgramToVAO(state.getProgram(),
+ GetImplAs<VertexArrayGL>(state.getVertexArray()));
updateMultiviewBaseViewLayerIndexUniform(
state.getProgram(),
state.getDrawFramebuffer()->getImplementation()->getState());
@@ -2238,9 +2238,15 @@
setViewportArrayv(0u, viewportArray);
}
-void StateManagerGL::propagateNumViewsToVAO(const gl::Program *program, VertexArrayGL *vao)
+void StateManagerGL::propagateProgramToVAO(const gl::Program *program, VertexArrayGL *vao)
{
- if (mIsMultiviewEnabled && vao != nullptr)
+ if (vao == nullptr)
+ {
+ return;
+ }
+
+ // Number of views:
+ if (mIsMultiviewEnabled)
{
int programNumViews = 1;
if (program && program->usesMultiview())
@@ -2249,6 +2255,12 @@
}
vao->applyNumViewsToDivisor(programNumViews);
}
+
+ // Attribute enabled mask:
+ if (program)
+ {
+ vao->applyActiveAttribLocationsMask(program->getActiveAttribLocationsMask());
+ }
}
void StateManagerGL::updateMultiviewBaseViewLayerIndexUniform(
diff --git a/src/libANGLE/renderer/gl/StateManagerGL.h b/src/libANGLE/renderer/gl/StateManagerGL.h
index 8197e70..2058a77 100644
--- a/src/libANGLE/renderer/gl/StateManagerGL.h
+++ b/src/libANGLE/renderer/gl/StateManagerGL.h
@@ -193,7 +193,7 @@
const gl::Framebuffer &drawFramebuffer);
void applyViewportOffsetsAndSetViewports(const gl::Rectangle &viewport,
const gl::Framebuffer &drawFramebuffer);
- void propagateNumViewsToVAO(const gl::Program *program, VertexArrayGL *vao);
+ void propagateProgramToVAO(const gl::Program *program, VertexArrayGL *vao);
void updateProgramTextureAndSamplerBindings(const gl::Context *context);
void updateProgramStorageBufferBindings(const gl::Context *context);
diff --git a/src/libANGLE/renderer/gl/VertexArrayGL.cpp b/src/libANGLE/renderer/gl/VertexArrayGL.cpp
index 6decc0a..321e1c5 100644
--- a/src/libANGLE/renderer/gl/VertexArrayGL.cpp
+++ b/src/libANGLE/renderer/gl/VertexArrayGL.cpp
@@ -417,7 +417,8 @@
void VertexArrayGL::updateAttribEnabled(size_t attribIndex)
{
- const bool enabled = mState.getVertexAttribute(attribIndex).enabled;
+ const bool enabled = mState.getVertexAttribute(attribIndex).enabled &
+ mProgramActiveAttribLocationsMask.test(attribIndex);
if (mAppliedAttributes[attribIndex].enabled == enabled)
{
return;
@@ -731,4 +732,15 @@
}
}
+void VertexArrayGL::applyActiveAttribLocationsMask(const gl::AttributesMask &activeMask)
+{
+ gl::AttributesMask updateMask = mProgramActiveAttribLocationsMask ^ activeMask;
+ mProgramActiveAttribLocationsMask = activeMask;
+
+ for (size_t attribIndex : updateMask)
+ {
+ updateAttribEnabled(attribIndex);
+ }
+}
+
} // namespace rx
diff --git a/src/libANGLE/renderer/gl/VertexArrayGL.h b/src/libANGLE/renderer/gl/VertexArrayGL.h
index 2e209ce..ffa24cc 100644
--- a/src/libANGLE/renderer/gl/VertexArrayGL.h
+++ b/src/libANGLE/renderer/gl/VertexArrayGL.h
@@ -50,6 +50,7 @@
const gl::VertexArray::DirtyBindingBitsArray &bindingBits) override;
void applyNumViewsToDivisor(int numViews);
+ void applyActiveAttribLocationsMask(const gl::AttributesMask &activeMask);
private:
gl::Error syncDrawState(const gl::Context *context,
@@ -115,6 +116,10 @@
GLuint mVertexArrayID;
int mAppliedNumViews;
+ // Remember the program's active attrib location mask so that attributes can be enabled/disabled
+ // based on whether they are active in the program
+ gl::AttributesMask mProgramActiveAttribLocationsMask;
+
mutable gl::BindingPointer<gl::Buffer> mAppliedElementArrayBuffer;
mutable std::vector<gl::VertexAttribute> mAppliedAttributes;