Vulkan backend render targets don't allow client to specify stencil bits
We already always create the stencil buffer even for wrapped RTs.
Make VulkanWindowContext use SkSurface::MakeFromBackendRenderTarget.
Change-Id: I5df429d347331801954ec17cb9d75e323a7af345
Reviewed-on: https://skia-review.googlesource.com/113206
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/include/gpu/GrBackendSurface.h b/include/gpu/GrBackendSurface.h
index c2fc619..a2df90c 100644
--- a/include/gpu/GrBackendSurface.h
+++ b/include/gpu/GrBackendSurface.h
@@ -194,11 +194,13 @@
const GrGLFramebufferInfo& glInfo);
#ifdef SK_VULKAN
+ /** Deprecated, use version that does not take stencil bits. */
GrBackendRenderTarget(int width,
int height,
int sampleCnt,
int stencilBits,
const GrVkImageInfo& vkInfo);
+ GrBackendRenderTarget(int width, int height, int sampleCnt, const GrVkImageInfo& vkInfo);
#endif
int width() const { return fWidth; }
diff --git a/src/gpu/GrBackendSurface.cpp b/src/gpu/GrBackendSurface.cpp
index 73135dc..6db618f 100644
--- a/src/gpu/GrBackendSurface.cpp
+++ b/src/gpu/GrBackendSurface.cpp
@@ -153,10 +153,19 @@
int sampleCnt,
int stencilBits,
const GrVkImageInfo& vkInfo)
+ : GrBackendRenderTarget(width, height, sampleCnt, vkInfo) {
+ // This is a deprecated constructor that takes a bogus stencil bits.
+ SkASSERT(0 == stencilBits);
+}
+
+GrBackendRenderTarget::GrBackendRenderTarget(int width,
+ int height,
+ int sampleCnt,
+ const GrVkImageInfo& vkInfo)
: fWidth(width)
, fHeight(height)
, fSampleCnt(SkTMax(1, sampleCnt))
- , fStencilBits(stencilBits)
+ , fStencilBits(0) // We always create stencil buffers internally for vulkan
, fConfig(GrVkFormatToPixelConfig(vkInfo.fFormat))
, fBackend(kVulkan_GrBackend)
, fVkInfo(vkInfo) {}
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index b674185..1acbf02 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -942,11 +942,13 @@
desc.fSampleCnt = 1;
sk_sp<GrVkRenderTarget> tgt = GrVkRenderTarget::MakeWrappedRenderTarget(this, desc, info);
- if (tgt && backendRT.stencilBits()) {
- if (!createStencilAttachmentForRenderTarget(tgt.get(), desc.fWidth, desc.fHeight)) {
- return nullptr;
- }
+
+ // We don't allow the client to supply a premade stencil buffer. We always create one if needed.
+ SkASSERT(!backendRT.stencilBits());
+ if (tgt) {
+ SkASSERT(tgt->canAttemptStencilAttachment());
}
+
return tgt;
}
diff --git a/tools/sk_app/VulkanWindowContext.cpp b/tools/sk_app/VulkanWindowContext.cpp
index d7839bc..b39c564 100644
--- a/tools/sk_app/VulkanWindowContext.cpp
+++ b/tools/sk_app/VulkanWindowContext.cpp
@@ -293,14 +293,14 @@
info.fFormat = format;
info.fLevelCount = 1;
- GrBackendTexture backendTex(fWidth, fHeight, info);
+ GrBackendRenderTarget backendRT(fWidth, fHeight, fSampleCount, info);
- fSurfaces[i] = SkSurface::MakeFromBackendTextureAsRenderTarget(fContext.get(), backendTex,
- kTopLeft_GrSurfaceOrigin,
- fSampleCount,
- colorType,
- fDisplayParams.fColorSpace,
- &fSurfaceProps);
+ fSurfaces[i] = SkSurface::MakeFromBackendRenderTarget(fContext.get(),
+ backendRT,
+ kTopLeft_GrSurfaceOrigin,
+ colorType,
+ fDisplayParams.fColorSpace,
+ &fSurfaceProps);
}
// create the command pool for the command buffers