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( ...@@ -1134,7 +1134,8 @@ angle::Result FramebufferVk::startNewRenderPassImpl(
RenderTargetVk *colorRenderTarget = colorRenderTargets[colorIndex]; RenderTargetVk *colorRenderTarget = colorRenderTargets[colorIndex];
ASSERT(colorRenderTarget); ASSERT(colorRenderTarget);
colorRenderTarget->onColorDraw(&mFramebuffer, writeCommands, &renderPassDesc); ANGLE_TRY(colorRenderTarget->onColorDraw(contextVk, &mFramebuffer, writeCommands,
&renderPassDesc));
VkAttachmentLoadOp colorLoadOp = VkAttachmentLoadOp colorLoadOp =
clearColor ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD; clearColor ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD;
...@@ -1162,7 +1163,8 @@ angle::Result FramebufferVk::startNewRenderPassImpl( ...@@ -1162,7 +1163,8 @@ angle::Result FramebufferVk::startNewRenderPassImpl(
RenderTargetVk *depthStencilRenderTarget = mRenderTargetCache.getDepthStencil(); RenderTargetVk *depthStencilRenderTarget = mRenderTargetCache.getDepthStencil();
if (depthStencilRenderTarget) if (depthStencilRenderTarget)
{ {
depthStencilRenderTarget->onDepthStencilDraw(&mFramebuffer, writeCommands, &renderPassDesc); ANGLE_TRY(depthStencilRenderTarget->onDepthStencilDraw(contextVk, &mFramebuffer,
writeCommands, &renderPassDesc));
VkAttachmentLoadOp depthLoadOp = VkAttachmentLoadOp depthLoadOp =
clearDepth ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD; clearDepth ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD;
......
...@@ -52,9 +52,10 @@ void RenderTargetVk::reset() ...@@ -52,9 +52,10 @@ void RenderTargetVk::reset()
mOwner = nullptr; mOwner = nullptr;
} }
void RenderTargetVk::onColorDraw(vk::FramebufferHelper *framebufferVk, angle::Result RenderTargetVk::onColorDraw(ContextVk *contextVk,
vk::CommandBuffer *commandBuffer, vk::FramebufferHelper *framebufferVk,
vk::RenderPassDesc *renderPassDesc) vk::CommandBuffer *commandBuffer,
vk::RenderPassDesc *renderPassDesc)
{ {
ASSERT(commandBuffer->valid()); ASSERT(commandBuffer->valid());
ASSERT(!mImage->getFormat().textureFormat().hasDepthOrStencilBits()); ASSERT(!mImage->getFormat().textureFormat().hasDepthOrStencilBits());
...@@ -62,17 +63,22 @@ void RenderTargetVk::onColorDraw(vk::FramebufferHelper *framebufferVk, ...@@ -62,17 +63,22 @@ void RenderTargetVk::onColorDraw(vk::FramebufferHelper *framebufferVk,
// Store the attachment info in the renderPassDesc. // Store the attachment info in the renderPassDesc.
renderPassDesc->packAttachment(mImage->getFormat()); renderPassDesc->packAttachment(mImage->getFormat());
ANGLE_TRY(ensureImageInitialized(contextVk));
// TODO(jmadill): Use automatic layout transition. http://anglebug.com/2361 // TODO(jmadill): Use automatic layout transition. http://anglebug.com/2361
mImage->changeLayout(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::ColorAttachment, mImage->changeLayout(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::ColorAttachment,
commandBuffer); commandBuffer);
// Set up dependencies between the RT resource and the Framebuffer. // Set up dependencies between the RT resource and the Framebuffer.
mImage->addWriteDependency(framebufferVk); mImage->addWriteDependency(framebufferVk);
return angle::Result::Continue;
} }
void RenderTargetVk::onDepthStencilDraw(vk::FramebufferHelper *framebufferVk, angle::Result RenderTargetVk::onDepthStencilDraw(ContextVk *contextVk,
vk::CommandBuffer *commandBuffer, vk::FramebufferHelper *framebufferVk,
vk::RenderPassDesc *renderPassDesc) vk::CommandBuffer *commandBuffer,
vk::RenderPassDesc *renderPassDesc)
{ {
ASSERT(commandBuffer->valid()); ASSERT(commandBuffer->valid());
ASSERT(mImage->getFormat().textureFormat().hasDepthOrStencilBits()); ASSERT(mImage->getFormat().textureFormat().hasDepthOrStencilBits());
...@@ -84,10 +90,14 @@ void RenderTargetVk::onDepthStencilDraw(vk::FramebufferHelper *framebufferVk, ...@@ -84,10 +90,14 @@ void RenderTargetVk::onDepthStencilDraw(vk::FramebufferHelper *framebufferVk,
const angle::Format &format = mImage->getFormat().textureFormat(); const angle::Format &format = mImage->getFormat().textureFormat();
VkImageAspectFlags aspectFlags = vk::GetDepthStencilAspectFlags(format); VkImageAspectFlags aspectFlags = vk::GetDepthStencilAspectFlags(format);
ANGLE_TRY(ensureImageInitialized(contextVk));
mImage->changeLayout(aspectFlags, vk::ImageLayout::DepthStencilAttachment, commandBuffer); mImage->changeLayout(aspectFlags, vk::ImageLayout::DepthStencilAttachment, commandBuffer);
// Set up dependencies between the RT resource and the Framebuffer. // Set up dependencies between the RT resource and the Framebuffer.
mImage->addWriteDependency(framebufferVk); mImage->addWriteDependency(framebufferVk);
return angle::Result::Continue;
} }
vk::ImageHelper &RenderTargetVk::getImage() vk::ImageHelper &RenderTargetVk::getImage()
......
...@@ -51,12 +51,14 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget ...@@ -51,12 +51,14 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
void reset(); void reset();
// Note: RenderTargets should be called in order, with the depth/stencil onRender last. // Note: RenderTargets should be called in order, with the depth/stencil onRender last.
void onColorDraw(vk::FramebufferHelper *framebufferVk, angle::Result onColorDraw(ContextVk *contextVk,
vk::CommandBuffer *commandBuffer, vk::FramebufferHelper *framebufferVk,
vk::RenderPassDesc *renderPassDesc); vk::CommandBuffer *commandBuffer,
void onDepthStencilDraw(vk::FramebufferHelper *framebufferVk, vk::RenderPassDesc *renderPassDesc);
vk::CommandBuffer *commandBuffer, angle::Result onDepthStencilDraw(ContextVk *contextVk,
vk::RenderPassDesc *renderPassDesc); vk::FramebufferHelper *framebufferVk,
vk::CommandBuffer *commandBuffer,
vk::RenderPassDesc *renderPassDesc);
vk::ImageHelper &getImage(); vk::ImageHelper &getImage();
const vk::ImageHelper &getImage() const; const vk::ImageHelper &getImage() const;
......
...@@ -264,8 +264,6 @@ ...@@ -264,8 +264,6 @@
3309 GLES ANDROID : dEQP-GLES2.functional.uniform_api.random.54 = FAIL 3309 GLES ANDROID : dEQP-GLES2.functional.uniform_api.random.54 = FAIL
// General Vulkan failures // 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 3300 VULKAN : dEQP-GLES2.functional.shaders.texture_functions.vertex.texturecubelod = FAIL
// Depth/stencil clear // 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