Commit 5a604a5f by Courtney Goeltzenleuchter Committed by Commit Bot

Ensure framebuffer is up-to-date before drawing

The dEQP-GLES2.functional.fbo.render.texsubimage.between_render_tex2d* test was failing because a TexSubImage call modifying the framebuffer wasn't being applied before a subsequent DrawElements call and thus getting an incorrect result. Bug: angleproject:3249 Test: angle_deqp_gles2_tests --gtest_filter=dEQP.GLES2/functional_fbo_render_texsubimage_between_render_tex2d_rgb --use-angle=vulkan Change-Id: I90f791957e6536c5c62fb731d52cd486ab5c05c1 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1542361 Commit-Queue: Courtney Goeltzenleuchter <courtneygo@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 6b58365e
......@@ -1134,7 +1134,8 @@ angle::Result FramebufferVk::startNewRenderPassImpl(
RenderTargetVk *colorRenderTarget = colorRenderTargets[colorIndex];
ASSERT(colorRenderTarget);
colorRenderTarget->onColorDraw(&mFramebuffer, writeCommands, &renderPassDesc);
ANGLE_TRY(colorRenderTarget->onColorDraw(contextVk, &mFramebuffer, writeCommands,
&renderPassDesc));
VkAttachmentLoadOp colorLoadOp =
clearColor ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD;
......@@ -1162,7 +1163,8 @@ angle::Result FramebufferVk::startNewRenderPassImpl(
RenderTargetVk *depthStencilRenderTarget = mRenderTargetCache.getDepthStencil();
if (depthStencilRenderTarget)
{
depthStencilRenderTarget->onDepthStencilDraw(&mFramebuffer, writeCommands, &renderPassDesc);
ANGLE_TRY(depthStencilRenderTarget->onDepthStencilDraw(contextVk, &mFramebuffer,
writeCommands, &renderPassDesc));
VkAttachmentLoadOp depthLoadOp =
clearDepth ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD;
......
......@@ -52,9 +52,10 @@ void RenderTargetVk::reset()
mOwner = nullptr;
}
void RenderTargetVk::onColorDraw(vk::FramebufferHelper *framebufferVk,
vk::CommandBuffer *commandBuffer,
vk::RenderPassDesc *renderPassDesc)
angle::Result RenderTargetVk::onColorDraw(ContextVk *contextVk,
vk::FramebufferHelper *framebufferVk,
vk::CommandBuffer *commandBuffer,
vk::RenderPassDesc *renderPassDesc)
{
ASSERT(commandBuffer->valid());
ASSERT(!mImage->getFormat().textureFormat().hasDepthOrStencilBits());
......@@ -62,17 +63,22 @@ void RenderTargetVk::onColorDraw(vk::FramebufferHelper *framebufferVk,
// Store the attachment info in the renderPassDesc.
renderPassDesc->packAttachment(mImage->getFormat());
ANGLE_TRY(ensureImageInitialized(contextVk));
// TODO(jmadill): Use automatic layout transition. http://anglebug.com/2361
mImage->changeLayout(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::ColorAttachment,
commandBuffer);
// Set up dependencies between the RT resource and the Framebuffer.
mImage->addWriteDependency(framebufferVk);
return angle::Result::Continue;
}
void RenderTargetVk::onDepthStencilDraw(vk::FramebufferHelper *framebufferVk,
vk::CommandBuffer *commandBuffer,
vk::RenderPassDesc *renderPassDesc)
angle::Result RenderTargetVk::onDepthStencilDraw(ContextVk *contextVk,
vk::FramebufferHelper *framebufferVk,
vk::CommandBuffer *commandBuffer,
vk::RenderPassDesc *renderPassDesc)
{
ASSERT(commandBuffer->valid());
ASSERT(mImage->getFormat().textureFormat().hasDepthOrStencilBits());
......@@ -84,10 +90,14 @@ void RenderTargetVk::onDepthStencilDraw(vk::FramebufferHelper *framebufferVk,
const angle::Format &format = mImage->getFormat().textureFormat();
VkImageAspectFlags aspectFlags = vk::GetDepthStencilAspectFlags(format);
ANGLE_TRY(ensureImageInitialized(contextVk));
mImage->changeLayout(aspectFlags, vk::ImageLayout::DepthStencilAttachment, commandBuffer);
// Set up dependencies between the RT resource and the Framebuffer.
mImage->addWriteDependency(framebufferVk);
return angle::Result::Continue;
}
vk::ImageHelper &RenderTargetVk::getImage()
......
......@@ -51,12 +51,14 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
void reset();
// Note: RenderTargets should be called in order, with the depth/stencil onRender last.
void onColorDraw(vk::FramebufferHelper *framebufferVk,
vk::CommandBuffer *commandBuffer,
vk::RenderPassDesc *renderPassDesc);
void onDepthStencilDraw(vk::FramebufferHelper *framebufferVk,
vk::CommandBuffer *commandBuffer,
vk::RenderPassDesc *renderPassDesc);
angle::Result onColorDraw(ContextVk *contextVk,
vk::FramebufferHelper *framebufferVk,
vk::CommandBuffer *commandBuffer,
vk::RenderPassDesc *renderPassDesc);
angle::Result onDepthStencilDraw(ContextVk *contextVk,
vk::FramebufferHelper *framebufferVk,
vk::CommandBuffer *commandBuffer,
vk::RenderPassDesc *renderPassDesc);
vk::ImageHelper &getImage();
const vk::ImageHelper &getImage() const;
......
......@@ -264,8 +264,6 @@
3309 GLES ANDROID : dEQP-GLES2.functional.uniform_api.random.54 = FAIL
// General Vulkan failures
3249 VULKAN : dEQP-GLES2.functional.fbo.render.texsubimage.between_render_tex2d_rgb = FAIL
3249 VULKAN : dEQP-GLES2.functional.fbo.render.texsubimage.between_render_tex2d_rgba = FAIL
3300 VULKAN : dEQP-GLES2.functional.shaders.texture_functions.vertex.texturecubelod = FAIL
// Depth/stencil clear
......
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