Restrict ops that can be executed when we have a wrapped vulkan secondary command buffer.
Bug: skia:
Change-Id: Ib58ba23053d019988a23cfb489808bad3122d867
Reviewed-on: https://skia-review.googlesource.com/c/178936
Commit-Queue: Greg Daniel <egdaniel@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 7d71d22..59764ad 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -1773,6 +1773,15 @@
GrSurface* src, GrSurfaceOrigin srcOrigin,
const SkIRect& srcRect, const SkIPoint& dstPoint,
bool canDiscardOutsideDstRect) {
+#ifdef SK_DEBUG
+ if (GrVkRenderTarget* srcRT = static_cast<GrVkRenderTarget*>(src->asRenderTarget())) {
+ SkASSERT(!srcRT->wrapsSecondaryCommandBuffer());
+ }
+ if (GrVkRenderTarget* dstRT = static_cast<GrVkRenderTarget*>(dst->asRenderTarget())) {
+ SkASSERT(!dstRT->wrapsSecondaryCommandBuffer());
+ }
+#endif
+
GrPixelConfig dstConfig = dst->config();
GrPixelConfig srcConfig = src->config();
@@ -1799,6 +1808,9 @@
GrRenderTarget* dstRT = dst->asRenderTarget();
if (dstRT) {
GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(dstRT);
+ if (vkRT->wrapsSecondaryCommandBuffer()) {
+ return false;
+ }
dstImage = vkRT->numColorSamples() > 1 ? vkRT->msaaImage() : vkRT;
} else {
SkASSERT(dst->asTexture());
@@ -1839,6 +1851,12 @@
GrVkImage* image = nullptr;
GrVkRenderTarget* rt = static_cast<GrVkRenderTarget*>(surface->asRenderTarget());
if (rt) {
+ // Reading from render targets that wrap a secondary command buffer is not allowed since
+ // it would require us to know the VkImage, which we don't have, as well as need us to
+ // stop and start the VkRenderPass which we don't have access to.
+ if (rt->wrapsSecondaryCommandBuffer()) {
+ return false;
+ }
// resolve the render target if necessary
switch (rt->getResolveType()) {
case GrVkRenderTarget::kCantResolve_ResolveType:
@@ -2039,6 +2057,7 @@
const VkClearValue* colorClear,
GrVkRenderTarget* target, GrSurfaceOrigin origin,
const SkIRect& bounds) {
+ SkASSERT (!target->wrapsSecondaryCommandBuffer());
const SkIRect* pBounds = &bounds;
SkIRect flippedBounds;
if (kBottomLeft_GrSurfaceOrigin == origin) {