diff options
author | Jamie Madill <jmadill@chromium.org> | 2022-04-19 17:01:20 -0400 |
---|---|---|
committer | Angle LUCI CQ <angle-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-04-20 18:40:03 +0000 |
commit | 4efc4ee6830a8a53a0daf9daa3c7aa835db4220f (patch) | |
tree | bd6d10075743be18cb90f322e0bf08e9d5786f7b | |
parent | 3f800e5c8d6889730e46b1211d0959629d1fe384 (diff) | |
download | angle-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.cpp | 5 | ||||
-rw-r--r-- | src/tests/angle_end2end_tests_expectations.txt | 4 | ||||
-rw-r--r-- | src/tests/gl_tests/TransformFeedbackTest.cpp | 35 |
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); |