Vulkan: Don't store device handles in wrapped objects.
BUG=angleproject:1684
Change-Id: I0ec11ec79f2e9893600a8ffd8cdbfc6040fb6f70
Reviewed-on: https://chromium-review.googlesource.com/426402
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
index b6a69f6..51df91c 100644
--- a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
@@ -17,6 +17,7 @@
#include "libANGLE/formatutils.h"
#include "libANGLE/renderer/renderer_utils.h"
#include "libANGLE/renderer/vulkan/ContextVk.h"
+#include "libANGLE/renderer/vulkan/DisplayVk.h"
#include "libANGLE/renderer/vulkan/RenderTargetVk.h"
#include "libANGLE/renderer/vulkan/RendererVk.h"
#include "libANGLE/renderer/vulkan/SurfaceVk.h"
@@ -79,16 +80,20 @@
FramebufferVk::FramebufferVk(const gl::FramebufferState &state)
: FramebufferImpl(state),
mBackbuffer(nullptr),
- mRenderPass(VK_NULL_HANDLE),
- mFramebuffer(VK_NULL_HANDLE)
+ mRenderPass(),
+ mFramebuffer(),
+ mDirtyRenderPass(true),
+ mDirtyFramebuffer(true)
{
}
FramebufferVk::FramebufferVk(const gl::FramebufferState &state, WindowSurfaceVk *backbuffer)
: FramebufferImpl(state),
mBackbuffer(backbuffer),
- mRenderPass(VK_NULL_HANDLE),
- mFramebuffer(VK_NULL_HANDLE)
+ mRenderPass(),
+ mFramebuffer(),
+ mDirtyRenderPass(true),
+ mDirtyFramebuffer(true)
{
}
@@ -96,6 +101,22 @@
{
}
+void FramebufferVk::destroy(ContextImpl *contextImpl)
+{
+ VkDevice device = GetAs<ContextVk>(contextImpl)->getDevice();
+
+ mRenderPass.destroy(device);
+ mFramebuffer.destroy(device);
+}
+
+void FramebufferVk::destroyDefault(DisplayImpl *displayImpl)
+{
+ VkDevice device = GetAs<DisplayVk>(displayImpl)->getRenderer()->getDevice();
+
+ mRenderPass.destroy(device);
+ mFramebuffer.destroy(device);
+}
+
gl::Error FramebufferVk::discard(size_t count, const GLenum *attachments)
{
UNIMPLEMENTED();
@@ -152,7 +173,7 @@
const gl::Rectangle renderArea(0, 0, size.width, size.height);
vk::CommandBuffer *commandBuffer = contextVk->getCommandBuffer();
- ANGLE_TRY(commandBuffer->begin());
+ ANGLE_TRY(commandBuffer->begin(contextVk->getDevice()));
for (const auto &colorAttachment : mState.getColorAttachments())
{
@@ -253,15 +274,15 @@
ContextVk *contextVk = GetAs<ContextVk>(context);
RendererVk *renderer = contextVk->getRenderer();
+ VkDevice device = renderer->getDevice();
vk::Image *readImage = renderTarget->image;
vk::StagingImage stagingImage;
- ANGLE_TRY_RESULT(renderer->createStagingImage(TextureDimension::TEX_2D, *renderTarget->format,
- renderTarget->extents),
- stagingImage);
+ ANGLE_TRY(renderer->createStagingImage(TextureDimension::TEX_2D, *renderTarget->format,
+ renderTarget->extents, &stagingImage));
vk::CommandBuffer *commandBuffer = contextVk->getCommandBuffer();
- commandBuffer->begin();
+ commandBuffer->begin(device);
stagingImage.getImage().changeLayoutTop(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL,
commandBuffer);
@@ -283,7 +304,8 @@
// TODO(jmadill): parameters
uint8_t *mapPointer = nullptr;
- ANGLE_TRY(stagingImage.getDeviceMemory().map(0, stagingImage.getSize(), 0, &mapPointer));
+ ANGLE_TRY(
+ stagingImage.getDeviceMemory().map(device, 0, stagingImage.getSize(), 0, &mapPointer));
const auto &angleFormat = renderTarget->format->format();
@@ -301,7 +323,9 @@
PackPixels(params, angleFormat, inputPitch, mapPointer, reinterpret_cast<uint8_t *>(pixels));
stagingImage.getImage().destroy(renderer->getDevice());
- stagingImage.getDeviceMemory().unmap();
+ stagingImage.getDeviceMemory().unmap(device);
+
+ stagingImage.destroy(device);
return vk::NoError();
}
@@ -325,13 +349,13 @@
void FramebufferVk::syncState(const gl::Framebuffer::DirtyBits &dirtyBits)
{
// TODO(jmadill): Smarter update.
- mRenderPass = vk::RenderPass();
- mFramebuffer = vk::Framebuffer();
+ mDirtyRenderPass = true;
+ mDirtyFramebuffer = true;
}
gl::ErrorOrResult<vk::RenderPass *> FramebufferVk::getRenderPass(VkDevice device)
{
- if (mRenderPass.valid())
+ if (mRenderPass.valid() && !mDirtyRenderPass)
{
return &mRenderPass;
}
@@ -430,10 +454,12 @@
renderPassInfo.dependencyCount = 0;
renderPassInfo.pDependencies = nullptr;
- vk::RenderPass renderPass(device);
- ANGLE_TRY(renderPass.init(renderPassInfo));
+ vk::RenderPass renderPass;
+ ANGLE_TRY(renderPass.init(device, renderPassInfo));
- mRenderPass = std::move(renderPass);
+ mRenderPass.retain(device, std::move(renderPass));
+
+ mDirtyRenderPass = false;
return &mRenderPass;
}
@@ -441,7 +467,7 @@
gl::ErrorOrResult<vk::Framebuffer *> FramebufferVk::getFramebuffer(VkDevice device)
{
// If we've already created our cached Framebuffer, return it.
- if (mFramebuffer.valid())
+ if (mFramebuffer.valid() && !mDirtyFramebuffer)
{
return &mFramebuffer;
}
@@ -499,10 +525,12 @@
framebufferInfo.height = static_cast<uint32_t>(attachmentsSize.height);
framebufferInfo.layers = 1;
- vk::Framebuffer framebuffer(device);
- ANGLE_TRY(static_cast<gl::Error>(framebuffer.init(framebufferInfo)));
+ vk::Framebuffer framebuffer;
+ ANGLE_TRY(static_cast<gl::Error>(framebuffer.init(device, framebufferInfo)));
- mFramebuffer = std::move(framebuffer);
+ mFramebuffer.retain(device, std::move(framebuffer));
+
+ mDirtyFramebuffer = false;
return &mFramebuffer;
}
@@ -544,7 +572,7 @@
ANGLE_TRY(mState.getFirstColorAttachment()->getRenderTarget(&renderTarget));
renderTarget->image->updateLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
- ANGLE_TRY(commandBuffer->begin());
+ ANGLE_TRY(commandBuffer->begin(device));
commandBuffer->beginRenderPass(*renderPass, *framebuffer, glState.getViewport(),
attachmentClearValues);
return gl::NoError();