Commit 54ed8f0a by Jamie Madill Committed by Commit Bot

Vulkan: Fix UtilsVk invalidating Context descriptors.

Fixes a validation error and rendering artifact in the WebGL test: textures/misc/tex-image-and-sub-image-2d-with-array-buffer-view Only applies to masked clears when combined with draw calls using uniforms or textures. Also make it easier to inspect layer messages in the debugger. Bug: angleproject:2912 Change-Id: I4561895439221581b9dbc341d6de5d5a6c2096aa Reviewed-on: https://chromium-review.googlesource.com/c/1462056 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent 3571ad49
...@@ -226,11 +226,11 @@ angle::Result ContextVk::setupDraw(const gl::Context *context, ...@@ -226,11 +226,11 @@ angle::Result ContextVk::setupDraw(const gl::Context *context,
// TODO(jmadill): Use dirty bit. http://anglebug.com/3014 // TODO(jmadill): Use dirty bit. http://anglebug.com/3014
if (!mCommandBuffer) if (!mCommandBuffer)
{ {
mDirtyBits |= mNewCommandBufferDirtyBits;
if (!mDrawFramebuffer->appendToStartedRenderPass(mRenderer->getCurrentQueueSerial(), if (!mDrawFramebuffer->appendToStartedRenderPass(mRenderer->getCurrentQueueSerial(),
&mCommandBuffer)) &mCommandBuffer))
{ {
ANGLE_TRY(mDrawFramebuffer->startNewRenderPass(this, &mCommandBuffer)); ANGLE_TRY(mDrawFramebuffer->startNewRenderPass(this, &mCommandBuffer));
mDirtyBits |= mNewCommandBufferDirtyBits;
} }
} }
......
...@@ -288,15 +288,16 @@ DebugUtilsMessenger(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, ...@@ -288,15 +288,16 @@ DebugUtilsMessenger(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
} }
} }
bool isError = (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) != 0; bool isError = (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) != 0;
std::string msg = log.str();
if (isError) if (isError)
{ {
ERR() << log.str(); ERR() << msg;
} }
else else
{ {
WARN() << log.str(); WARN() << msg;
} }
return VK_FALSE; return VK_FALSE;
......
...@@ -152,8 +152,6 @@ class VulkanClearTest : public ClearTest ...@@ -152,8 +152,6 @@ class VulkanClearTest : public ClearTest
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
} }
void TearDown() override { ANGLETest::TearDown(); }
void bindColorStencilFBO() void bindColorStencilFBO()
{ {
glBindFramebuffer(GL_FRAMEBUFFER, mColorStencilFBO); glBindFramebuffer(GL_FRAMEBUFFER, mColorStencilFBO);
...@@ -424,6 +422,57 @@ TEST_P(ClearTest, Stencil8Scissored) ...@@ -424,6 +422,57 @@ TEST_P(ClearTest, Stencil8Scissored)
} }
} }
// Covers a bug in the Vulkan back-end where starting a new command buffer in
// the masked clear would not trigger descriptor sets to be re-bound.
TEST_P(ClearTest, MaskedClearThenDrawWithUniform)
{
// Initialize a program with a uniform.
ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
glUseProgram(program);
GLint uniLoc = glGetUniformLocation(program, essl1_shaders::ColorUniform());
ASSERT_NE(-1, uniLoc);
glUniform4f(uniLoc, 0.0f, 1.0f, 0.0f, 1.0f);
// Initialize position attribute.
GLint posLoc = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
ASSERT_NE(-1, posLoc);
setupQuadVertexBuffer(0.5f, 1.0f);
glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
glEnableVertexAttribArray(posLoc);
// Initialize a simple FBO.
constexpr GLsizei kSize = 2;
GLTexture clearTexture;
glBindTexture(GL_TEXTURE_2D, clearTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
GLFramebuffer fbo;
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, clearTexture, 0);
glViewport(0, 0, kSize, kSize);
// Clear and draw to flush out dirty bits.
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 6);
// Flush to trigger a new serial.
glFlush();
// Enable color mask and draw again to trigger the bug.
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);
glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 6);
ASSERT_GL_NO_ERROR();
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
}
// Requires ES3 // Requires ES3
// This tests a bug where in a masked clear when calling "ClearBuffer", we would // This tests a bug where in a masked clear when calling "ClearBuffer", we would
// mistakenly clear every channel (including the masked-out ones) // mistakenly clear every channel (including the masked-out ones)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment