Add initial support for creating a vulkan secondary command buffer drawing context.
This sets up the context and adds support for creating RTContexts, RTProxies, RTs,
and GrVkRenderPass's that wrap the external secondary command buffer.
Bug: skia:
Change-Id: I80ebbb690a5fe464f775c5fcad651dfe2a150418
Reviewed-on: https://skia-review.googlesource.com/c/178926
Commit-Queue: Greg Daniel <egdaniel@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/vk/GrVkResourceProvider.cpp b/src/gpu/vk/GrVkResourceProvider.cpp
index 99b4d12..060bc87 100644
--- a/src/gpu/vk/GrVkResourceProvider.cpp
+++ b/src/gpu/vk/GrVkResourceProvider.cpp
@@ -31,6 +31,7 @@
GrVkResourceProvider::~GrVkResourceProvider() {
SkASSERT(0 == fRenderPassArray.count());
+ SkASSERT(0 == fExternalRenderPasses.count());
SkASSERT(VK_NULL_HANDLE == fPipelineCache);
delete fPipelineStateCache;
}
@@ -134,6 +135,26 @@
return renderPass;
}
+const GrVkRenderPass* GrVkResourceProvider::findCompatibleExternalRenderPass(
+ VkRenderPass renderPass, uint32_t colorAttachmentIndex) {
+ for (int i = 0; i < fExternalRenderPasses.count(); ++i) {
+ if (fExternalRenderPasses[i]->isCompatibleExternalRP(renderPass)) {
+ fExternalRenderPasses[i]->ref();
+#ifdef SK_DEBUG
+ uint32_t cachedColorIndex;
+ SkASSERT(fExternalRenderPasses[i]->colorAttachmentIndex(&cachedColorIndex));
+ SkASSERT(cachedColorIndex == colorAttachmentIndex);
+#endif
+ return fExternalRenderPasses[i];
+ }
+ }
+
+ const GrVkRenderPass* newRenderPass = new GrVkRenderPass(renderPass, colorAttachmentIndex);
+ fExternalRenderPasses.push_back(newRenderPass);
+ newRenderPass->ref();
+ return newRenderPass;
+}
+
const GrVkRenderPass* GrVkResourceProvider::findRenderPass(
const GrVkRenderTarget& target,
const GrVkRenderPass::LoadStoreOps& colorOps,
@@ -346,6 +367,11 @@
}
fRenderPassArray.reset();
+ for (int i = 0; i < fExternalRenderPasses.count(); ++i) {
+ fExternalRenderPasses[i]->unref(fGpu);
+ }
+ fExternalRenderPasses.reset();
+
// Iterate through all store GrVkSamplers and unref them before resetting the hash.
SkTDynamicHash<GrVkSampler, GrVkSampler::Key>::Iter iter(&fSamplers);
for (; !iter.done(); ++iter) {
@@ -414,6 +440,11 @@
}
fRenderPassArray.reset();
+ for (int i = 0; i < fExternalRenderPasses.count(); ++i) {
+ fExternalRenderPasses[i]->unrefAndAbandon();
+ }
+ fExternalRenderPasses.reset();
+
// Iterate through all store GrVkSamplers and unrefAndAbandon them before resetting the hash.
SkTDynamicHash<GrVkSampler, GrVkSampler::Key>::Iter iter(&fSamplers);
for (; !iter.done(); ++iter) {