Defer stencil attachment until opsTask execution
Change-Id: I34cc35d16966d35e26561c40a0300112b2da2fa1
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/253546
Reviewed-by: Robert Phillips <robertphillips@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Chris Dalton <csmartdalton@google.com>
diff --git a/src/gpu/GrOpsTask.cpp b/src/gpu/GrOpsTask.cpp
index 62a94cd..06d3733 100644
--- a/src/gpu/GrOpsTask.cpp
+++ b/src/gpu/GrOpsTask.cpp
@@ -484,9 +484,9 @@
return false;
}
- GrSurfaceProxy* proxy = fTargetView.proxy();
+ SkASSERT(fTargetView.proxy());
+ GrRenderTargetProxy* proxy = fTargetView.proxy()->asRenderTargetProxy();
SkASSERT(proxy);
- SkASSERT(proxy->peekRenderTarget());
TRACE_EVENT0("skia.gpu", TRACE_FUNC);
// Make sure load ops are not kClear if the GPU needs to use draws for clears
@@ -496,7 +496,18 @@
const GrCaps& caps = *flushState->gpu()->caps();
GrRenderTarget* renderTarget = proxy->peekRenderTarget();
SkASSERT(renderTarget);
- GrStencilAttachment* stencil = renderTarget->renderTargetPriv().getStencilAttachment();
+
+ GrStencilAttachment* stencil = nullptr;
+ if (int numStencilSamples = proxy->numStencilSamples()) {
+ if (!flushState->resourceProvider()->attachStencilAttachment(
+ renderTarget, numStencilSamples)) {
+ SkDebugf("WARNING: failed to attach a stencil buffer. Rendering will be skipped.\n");
+ return false;
+ }
+ stencil = renderTarget->renderTargetPriv().getStencilAttachment();
+ }
+
+ SkASSERT(!stencil || stencil->numSamples() >= proxy->numStencilSamples());
GrLoadOp stencilLoadOp;
switch (fInitialStencilContent) {