aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamie Madill <jmadill@chromium.org>2022-04-19 17:01:20 -0400
committerAngle LUCI CQ <angle-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-04-20 18:40:03 +0000
commit4efc4ee6830a8a53a0daf9daa3c7aa835db4220f (patch)
treebd6d10075743be18cb90f322e0bf08e9d5786f7b
parent3f800e5c8d6889730e46b1211d0959629d1fe384 (diff)
downloadangle-4efc4ee6830a8a53a0daf9daa3c7aa835db4220f.tar.gz
Fix validate state cache after XFB buffer deleted.
Bug: chromium:1317650 Change-Id: Iec9f1167c3b2957091dd0f4ef3efcfcd7c4bf3c0 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3594250 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Auto-Submit: Jamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
-rw-r--r--src/libANGLE/State.cpp5
-rw-r--r--src/tests/angle_end2end_tests_expectations.txt4
-rw-r--r--src/tests/gl_tests/TransformFeedbackTest.cpp35
3 files changed, 40 insertions, 4 deletions
diff --git a/src/libANGLE/State.cpp b/src/libANGLE/State.cpp
index 383bf7ce44..360896ce12 100644
--- a/src/libANGLE/State.cpp
+++ b/src/libANGLE/State.cpp
@@ -2176,10 +2176,7 @@ angle::Result State::detachBuffer(Context *context, const Buffer *buffer)
if (curTransformFeedback)
{
ANGLE_TRY(curTransformFeedback->detachBuffer(context, bufferID));
- if (isTransformFeedbackActiveUnpaused())
- {
- context->getStateCache().onActiveTransformFeedbackChange(context);
- }
+ context->getStateCache().onActiveTransformFeedbackChange(context);
}
if (getVertexArray()->detachBuffer(context, bufferID))
diff --git a/src/tests/angle_end2end_tests_expectations.txt b/src/tests/angle_end2end_tests_expectations.txt
index 4d71bf69d5..ca4363adc3 100644
--- a/src/tests/angle_end2end_tests_expectations.txt
+++ b/src/tests/angle_end2end_tests_expectations.txt
@@ -593,3 +593,7 @@
// Flaking due to threading usage of the queue
7204 : VulkanImageTest.PreInitializedOnGLImport/ES3_Vulkan_SwiftShader_AsyncCommandQueue = SKIP
+
+// Causes incompatible error in GL back-end.
+7218 OPENGL : TransformFeedbackTest.DrawAfterDeletingPausedBuffer/* = SKIP
+7218 GLES : TransformFeedbackTest.DrawAfterDeletingPausedBuffer/* = SKIP
diff --git a/src/tests/gl_tests/TransformFeedbackTest.cpp b/src/tests/gl_tests/TransformFeedbackTest.cpp
index a4e4f86157..97b44f1fed 100644
--- a/src/tests/gl_tests/TransformFeedbackTest.cpp
+++ b/src/tests/gl_tests/TransformFeedbackTest.cpp
@@ -4105,6 +4105,41 @@ TEST_P(TransformFeedbackTest, ResumingTransformFeedbackAfterDeletebuffer)
ASSERT_GL_ERROR(GL_INVALID_OPERATION);
}
+// Validates that drawing after deleting a buffer in a paused XFB.
+TEST_P(TransformFeedbackTest, DrawAfterDeletingPausedBuffer)
+{
+ ANGLE_GL_PROGRAM_TRANSFORM_FEEDBACK(testProgram, essl1_shaders::vs::Simple(),
+ essl1_shaders::fs::Green(), {"gl_Position"},
+ GL_INTERLEAVED_ATTRIBS);
+ glUseProgram(testProgram);
+
+ std::vector<uint8_t> data(100, 0);
+
+ std::array<Vector3, 6> quadVerts = GetQuadVertices();
+
+ GLint loc = glGetAttribLocation(testProgram, essl1_shaders::PositionAttrib());
+ ASSERT_NE(-1, loc);
+
+ GLBuffer posBuf;
+ glBindBuffer(GL_ARRAY_BUFFER, posBuf);
+ glBufferData(GL_ARRAY_BUFFER, quadVerts.size() * sizeof(quadVerts[0]), quadVerts.data(),
+ GL_STATIC_DRAW);
+ glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
+ glEnableVertexAttribArray(loc);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+ GLBuffer buf;
+ glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
+ glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, data.size() * sizeof(data[0]), data.data(),
+ GL_STATIC_DRAW);
+ glBeginTransformFeedback(GL_POINTS);
+ glPauseTransformFeedback();
+ glDrawArrays(GL_POINTS, 0, 1);
+ buf.reset();
+ glDrawArrays(GL_POINTS, 0, 1);
+ EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+}
+
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TransformFeedbackTest);
ANGLE_INSTANTIATE_TEST_ES3(TransformFeedbackTest);