Call setNeedsStencil() when clearing stencil
Bug: chromium:1008312
Change-Id: I6e1d160515c6689ac6d62c40e712df287d47f955
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/248723
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Chris Dalton <csmartdalton@google.com>
diff --git a/src/gpu/GrRenderTargetContext.cpp b/src/gpu/GrRenderTargetContext.cpp
index 9f20a15..8d1d059 100644
--- a/src/gpu/GrRenderTargetContext.cpp
+++ b/src/gpu/GrRenderTargetContext.cpp
@@ -748,15 +748,13 @@
return GrOpsTask::CanDiscardPreviousOps(!fNumStencilSamples);
}
-void GrRenderTargetContext::setNeedsStencil(bool multisampled) {
+void GrRenderTargetContext::setNeedsStencil(bool useMixedSamplesIfNotMSAA) {
// Don't clear stencil until after we've changed fNumStencilSamples. This ensures we don't loop
// forever in the event that there are driver bugs and we need to clear as a draw.
bool hasInitializedStencil = fNumStencilSamples > 0;
int numRequiredSamples = this->numSamples();
- if (multisampled && 1 == numRequiredSamples) {
- // The caller has requested a multisampled stencil buffer on a non-MSAA render target. Use
- // mixed samples.
+ if (useMixedSamplesIfNotMSAA && 1 == numRequiredSamples) {
SkASSERT(fRenderTargetProxy->canUseMixedSamples(*this->caps()));
numRequiredSamples = this->caps()->internalMultisampleCount(
this->asSurfaceProxy()->backendFormat());
@@ -793,6 +791,8 @@
}
void GrRenderTargetContext::internalStencilClear(const GrFixedClip& clip, bool insideStencilMask) {
+ this->setNeedsStencil(/* useMixedSamplesIfNotMSAA = */ false);
+
if (this->caps()->performStencilClearsAsDraws()) {
const GrUserStencilSettings* ss = GrStencilSettings::SetClipBitSettings(insideStencilMask);
SkRect rtRect = SkRect::MakeWH(this->width(), this->height());
diff --git a/src/gpu/GrRenderTargetContext.h b/src/gpu/GrRenderTargetContext.h
index 0bb6525..74dee28 100644
--- a/src/gpu/GrRenderTargetContext.h
+++ b/src/gpu/GrRenderTargetContext.h
@@ -548,7 +548,7 @@
sk_sp<GrTextureProxy>);
GrOpsTask::CanDiscardPreviousOps canDiscardPreviousOpsOnFullClear() const;
- void setNeedsStencil(bool multisampled);
+ void setNeedsStencil(bool useMixedSamplesIfNotMSAA);
void internalClear(const GrFixedClip&, const SkPMColor4f&, CanClearFullscreen);
void internalStencilClear(const GrFixedClip&, bool insideStencilMask);