Vulkan: Fix Framebuffer cache depth/stencil issue.
The DrawBuffers resetting logic didn't update the depth/stencil serial.
Fix this and add a regression test that would crash in this situation.
Note that the Manhattan benchmark could trigger this under some cases.
Bug: angleproject:4322
Bug: angleproject:4490
Change-Id: Ie4b24efeb5991ecaa85bf8f964f77476bd6f167d
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2111333
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
diff --git a/src/tests/gl_tests/FramebufferTest.cpp b/src/tests/gl_tests/FramebufferTest.cpp
index 6f21169..5f65b0e 100644
--- a/src/tests/gl_tests/FramebufferTest.cpp
+++ b/src/tests/gl_tests/FramebufferTest.cpp
@@ -1208,6 +1208,50 @@
ASSERT_GL_NO_ERROR();
}
+// Covers a bug in ANGLE's Vulkan back-end framebuffer cache which ignored depth/stencil after
+// calls to DrawBuffers.
+TEST_P(FramebufferTest_ES3, AttachmentStateChange)
+{
+ constexpr GLuint kSize = 2;
+
+ ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
+
+ GLTexture colorTexture;
+ glBindTexture(GL_TEXTURE_2D, colorTexture);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+
+ GLFramebuffer fbo;
+ glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
+
+ ASSERT_GL_NO_ERROR();
+ ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
+
+ // First draw without a depth buffer.
+ drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
+
+ GLRenderbuffer depthBuffer;
+ glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);
+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, kSize, kSize);
+
+ // Bind just a renderbuffer and draw.
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);
+
+ ASSERT_GL_NO_ERROR();
+ ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
+
+ glDrawBuffers(0, nullptr);
+ drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
+
+ // Re-enable color buffer and draw one final time. This previously triggered a crash.
+ GLenum drawBuffs = {GL_COLOR_ATTACHMENT0};
+ glDrawBuffers(1, &drawBuffs);
+
+ drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
+ ASSERT_GL_NO_ERROR();
+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+}
+
ANGLE_INSTANTIATE_TEST_ES2(AddDummyTextureNoRenderTargetTest);
ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(FramebufferFormatsTest);
ANGLE_INSTANTIATE_TEST_ES3(FramebufferTest_ES3);