Vulkan: Support Texture redefinition.
Because initializing the texture can queue a copy from a staging
vk::Image, we must ensure we're not in a render pass. To make this
easier we move the current render pass tracking into the RendererVk
from the FramebufferVk class. (Note: in the future we will have
deferred command submission and this will become unnecessary.)
BUG=angleproject:2200
Change-Id: Ide8d4d70b50efbd79bbfa7006ad75cbc57cdf4c7
Reviewed-on: https://chromium-review.googlesource.com/741549
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
index c868ce9..cd9013b 100644
--- a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
@@ -81,20 +81,12 @@
}
FramebufferVk::FramebufferVk(const gl::FramebufferState &state)
- : FramebufferImpl(state),
- mBackbuffer(nullptr),
- mRenderPass(),
- mFramebuffer(),
- mInRenderPass(false)
+ : FramebufferImpl(state), mBackbuffer(nullptr), mRenderPass(), mFramebuffer()
{
}
FramebufferVk::FramebufferVk(const gl::FramebufferState &state, WindowSurfaceVk *backbuffer)
- : FramebufferImpl(state),
- mBackbuffer(backbuffer),
- mRenderPass(),
- mFramebuffer(),
- mInRenderPass(false)
+ : FramebufferImpl(state), mBackbuffer(backbuffer), mRenderPass(), mFramebuffer()
{
}
@@ -104,10 +96,9 @@
void FramebufferVk::destroy(const gl::Context *context)
{
- ASSERT(!mInRenderPass);
-
VkDevice device = GetImplAs<ContextVk>(context)->getDevice();
+ // TODO(jmadill): Deferred deletion.
mRenderPass.destroy(device);
mFramebuffer.destroy(device);
}
@@ -290,7 +281,7 @@
ANGLE_TRY(contextVk->getStartedCommandBuffer(&commandBuffer));
// End render pass if we're in one.
- endRenderPass(commandBuffer);
+ renderer->endRenderPass();
stagingImage.getImage().changeLayoutTop(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL,
commandBuffer);
@@ -557,19 +548,11 @@
return gl::InternalError() << "getSamplePosition is unimplemented.";
}
-gl::Error FramebufferVk::ensureInRenderPass(const gl::Context *context,
- VkDevice device,
- vk::CommandBuffer *commandBuffer,
- Serial queueSerial,
- const gl::State &glState)
+gl::Error FramebufferVk::beginRenderPass(const gl::Context *context,
+ VkDevice device,
+ vk::CommandBuffer *commandBuffer,
+ Serial queueSerial)
{
- if (mInRenderPass)
- {
- return gl::NoError();
- }
-
- mInRenderPass = true;
-
// TODO(jmadill): Cache render targets.
for (const auto &colorAttachment : mState.getColorAttachments())
{
@@ -598,6 +581,7 @@
ASSERT(renderPass && renderPass->valid());
// TODO(jmadill): Proper clear value implementation.
+ const gl::State &glState = context->getGLState();
VkClearColorValue colorClear;
memset(&colorClear, 0, sizeof(VkClearColorValue));
colorClear.float32[0] = glState.getColorClearValue().red;
@@ -627,13 +611,4 @@
return gl::NoError();
}
-void FramebufferVk::endRenderPass(vk::CommandBuffer *commandBuffer)
-{
- if (mInRenderPass)
- {
- commandBuffer->endRenderPass();
- mInRenderPass = false;
- }
-}
-
} // namespace rx