aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/vk/GrVkGpu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu/vk/GrVkGpu.cpp')
-rw-r--r--src/gpu/vk/GrVkGpu.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 23c7094bb3..9dd3688470 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -1695,6 +1695,11 @@ bool GrVkGpu::onCopySurface(GrSurface* dst,
srcImage = static_cast<GrVkTexture*>(src->asTexture());
}
+ // For borrowed textures, we *only* want to copy using draws (to avoid layout changes)
+ if (srcImage->isBorrowed()) {
+ return false;
+ }
+
if (can_copy_image(dst, src, this)) {
this->copySurfaceAsCopyImage(dst, src, dstImage, srcImage, srcRect, dstPoint);
return true;
@@ -1990,3 +1995,17 @@ void GrVkGpu::waitSemaphore(sk_sp<GrSemaphore> semaphore) {
resource->ref();
fSemaphoresToWaitOn.push_back(resource);
}
+
+sk_sp<GrSemaphore> GrVkGpu::prepareTextureForCrossContextUsage(GrTexture* texture) {
+ SkASSERT(texture);
+ GrVkTexture* vkTexture = static_cast<GrVkTexture*>(texture);
+ vkTexture->setImageLayout(this,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
+ VK_ACCESS_SHADER_READ_BIT,
+ VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+ false);
+ this->submitCommandBuffer(kSkip_SyncQueue);
+
+ // The image layout change serves as a barrier, so no semaphore is needed
+ return nullptr;
+}