Move vulkan external commandbuffer logic from RT to GrVkFramebufer.
Bug: skia:11809
Change-Id: I7fa364f7472be35e02b06fa2f3fbb6d61a427f65
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/396156
Reviewed-by: Jim Van Verth <jvanverth@google.com>
Commit-Queue: Greg Daniel <egdaniel@google.com>
diff --git a/src/gpu/vk/GrVkFramebuffer.cpp b/src/gpu/vk/GrVkFramebuffer.cpp
index e2170bc..ec14134 100644
--- a/src/gpu/vk/GrVkFramebuffer.cpp
+++ b/src/gpu/vk/GrVkFramebuffer.cpp
@@ -8,6 +8,7 @@
#include "src/gpu/vk/GrVkFramebuffer.h"
#include "src/gpu/vk/GrVkAttachment.h"
+#include "src/gpu/vk/GrVkCommandBuffer.h"
#include "src/gpu/vk/GrVkGpu.h"
#include "src/gpu/vk/GrVkImageView.h"
#include "src/gpu/vk/GrVkRenderPass.h"
@@ -16,9 +17,9 @@
GrVkGpu* gpu,
int width, int height,
const GrVkRenderPass* renderPass,
- const GrVkAttachment* colorAttachment,
- const GrVkAttachment* resolveAttachment,
- const GrVkAttachment* stencilAttachment,
+ GrVkAttachment* colorAttachment,
+ GrVkAttachment* resolveAttachment,
+ GrVkAttachment* stencilAttachment,
GrVkResourceProvider::CompatibleRPHandle compatibleRenderPassHandle) {
// At the very least we need a renderPass and a colorAttachment
SkASSERT(renderPass);
@@ -59,9 +60,57 @@
compatibleRenderPassHandle);
}
+GrVkFramebuffer::GrVkFramebuffer(const GrVkGpu* gpu,
+ VkFramebuffer framebuffer,
+ sk_sp<GrVkAttachment> colorAttachment,
+ sk_sp<GrVkAttachment> resolveAttachment,
+ sk_sp<GrVkAttachment> stencilAttachment,
+ GrVkResourceProvider::CompatibleRPHandle compatibleRPHandle)
+ : GrVkManagedResource(gpu)
+ , fFramebuffer(framebuffer)
+ , fColorAttachment(std::move(colorAttachment))
+ , fResolveAttachment(std::move(resolveAttachment))
+ , fStencilAttachment(std::move(stencilAttachment))
+ , fCompatibleRenderPassHandle(compatibleRPHandle) {}
+
+GrVkFramebuffer::GrVkFramebuffer(const GrVkGpu* gpu,
+ sk_sp<GrVkAttachment> colorAttachment,
+ sk_sp<const GrVkRenderPass> renderPass,
+ std::unique_ptr<GrVkSecondaryCommandBuffer> externalCommandBuffer)
+ : GrVkManagedResource(gpu)
+ , fColorAttachment(std::move(colorAttachment))
+ , fExternalRenderPass(std::move(renderPass))
+ , fExternalCommandBuffer(std::move(externalCommandBuffer)) {}
+
GrVkFramebuffer::~GrVkFramebuffer() {}
void GrVkFramebuffer::freeGPUData() const {
- SkASSERT(fFramebuffer);
- GR_VK_CALL(fGpu->vkInterface(), DestroyFramebuffer(fGpu->device(), fFramebuffer, nullptr));
+ SkASSERT(this->isExternal() || fFramebuffer != VK_NULL_HANDLE);
+ if (!this->isExternal()) {
+ GR_VK_CALL(fGpu->vkInterface(), DestroyFramebuffer(fGpu->device(), fFramebuffer, nullptr));
+ }
+
+ // TODO: having freeGPUData virtual on GrManagedResource be const seems like a bad restriction
+ // since we are changing the internal objects of these classes when it is called. We should go
+ // back a revisit how much of a headache it would be to make this function non-const
+ GrVkFramebuffer* nonConstThis = const_cast<GrVkFramebuffer*>(this);
+ nonConstThis->releaseResources();
+}
+
+void GrVkFramebuffer::releaseResources() {
+ if (fExternalCommandBuffer) {
+ fExternalCommandBuffer->releaseResources();
+ fExternalCommandBuffer.reset();
+ }
+}
+
+void GrVkFramebuffer::returnExternalGrSecondaryCommandBuffer(
+ std::unique_ptr<GrVkSecondaryCommandBuffer> cmdBuffer) {
+ SkASSERT(!fExternalCommandBuffer);
+ fExternalCommandBuffer = std::move(cmdBuffer);
+}
+
+std::unique_ptr<GrVkSecondaryCommandBuffer> GrVkFramebuffer::externalCommandBuffer() {
+ SkASSERT(fExternalCommandBuffer);
+ return std::move(fExternalCommandBuffer);
}