diff options
Diffstat (limited to 'src/gpu/vk/GrVkGpu.cpp')
-rw-r--r-- | src/gpu/vk/GrVkGpu.cpp | 19 |
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; +} |