Index: src/gpu/vk/GrVkResourceProvider.cpp |
diff --git a/src/gpu/vk/GrVkResourceProvider.cpp b/src/gpu/vk/GrVkResourceProvider.cpp |
index 8ae5162c5f4bdfdbf02f5e401429393d4aac25c0..a7f07b0230ec46cd822e9bd4a5ca34b472173068 100644 |
--- a/src/gpu/vk/GrVkResourceProvider.cpp |
+++ b/src/gpu/vk/GrVkResourceProvider.cpp |
@@ -9,6 +9,7 @@ |
#include "GrTextureParams.h" |
#include "GrVkCommandBuffer.h" |
+#include "GrVkCopyPipeline.h" |
#include "GrVkGLSLSampler.h" |
#include "GrVkPipeline.h" |
#include "GrVkRenderTarget.h" |
@@ -67,6 +68,29 @@ GrVkPipeline* GrVkResourceProvider::createPipeline(const GrPipeline& pipeline, |
primitiveType, renderPass, layout, fPipelineCache); |
} |
+GrVkCopyPipeline* GrVkResourceProvider::findOrCreateCopyPipeline( |
+ const GrVkRenderTarget* dst, |
+ VkPipelineShaderStageCreateInfo* shaderStageInfo, |
+ VkPipelineLayout pipelineLayout) { |
+ // Find or Create a compatible pipeline |
+ GrVkCopyPipeline* pipeline = nullptr; |
+ for (int i = 0; i < fCopyPipelines.count() && !pipeline; ++i) { |
+ if (fCopyPipelines[i]->isCompatible(*dst->simpleRenderPass())) { |
+ pipeline = fCopyPipelines[i]; |
+ } |
+ } |
+ if (!pipeline) { |
+ pipeline = GrVkCopyPipeline::Create(fGpu, shaderStageInfo, |
+ pipelineLayout, |
+ dst->numColorSamples(), |
+ *dst->simpleRenderPass(), |
+ fPipelineCache); |
+ fCopyPipelines.push_back(pipeline); |
+ } |
+ SkASSERT(pipeline); |
+ pipeline->ref(); |
+ return pipeline; |
+} |
// To create framebuffers, we first need to create a simple RenderPass that is |
// only used for framebuffer creation. When we actually render we will create |
@@ -307,6 +331,11 @@ void GrVkResourceProvider::destroyResources() { |
} |
fAvailableSecondaryCommandBuffers.reset(); |
+ // Release all copy pipelines |
+ for (int i = 0; i < fCopyPipelines.count(); ++i) { |
+ fCopyPipelines[i]->unref(fGpu); |
+ } |
+ |
// loop over all render pass sets to make sure we destroy all the internal VkRenderPasses |
for (int i = 0; i < fRenderPassArray.count(); ++i) { |
fRenderPassArray[i].releaseResources(fGpu); |
@@ -363,6 +392,11 @@ void GrVkResourceProvider::abandonResources() { |
} |
fAvailableSecondaryCommandBuffers.reset(); |
+ // Abandon all copy pipelines |
+ for (int i = 0; i < fCopyPipelines.count(); ++i) { |
+ fCopyPipelines[i]->unrefAndAbandon(); |
+ } |
+ |
// loop over all render pass sets to make sure we destroy all the internal VkRenderPasses |
for (int i = 0; i < fRenderPassArray.count(); ++i) { |
fRenderPassArray[i].abandonResources(); |