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);
 }