Implement dynamic MSAA on OpenGL
This is an initial attempt. We use a few coverage ops that haven't
been updated to handle MSAA yet, and other times we trigger MSAA when
we shouldn't, but it sets the basic functionality in place.
Bug: skia:11396
Change-Id: I8acfe4283bccf5543d4b774692e39427142b3228
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/395996
Commit-Queue: Chris Dalton <csmartdalton@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
diff --git a/src/gpu/GrOpsTask.cpp b/src/gpu/GrOpsTask.cpp
index 7faa401..b6161e4 100644
--- a/src/gpu/GrOpsTask.cpp
+++ b/src/gpu/GrOpsTask.cpp
@@ -391,8 +391,9 @@
}
void GrOpsTask::addDrawOp(GrDrawingManager* drawingMgr, GrOp::Owner op,
- const GrProcessorSet::Analysis& processorAnalysis,
- GrAppliedClip&& clip, const DstProxyView& dstProxyView,
+ GrDrawOp::FixedFunctionFlags fixedFunctionFlags,
+ const GrProcessorSet::Analysis& processorAnalysis, GrAppliedClip&& clip,
+ const DstProxyView& dstProxyView,
GrTextureResolveManager textureResolveManager, const GrCaps& caps) {
auto addDependency = [&](GrSurfaceProxy* p, GrMipmapped mipmapped) {
this->addSampledTexture(p);
@@ -420,6 +421,16 @@
fRenderPassXferBarriers |= GrXferBarrierFlags::kBlend;
}
+#ifdef SK_DEBUG
+ // Ensure we can support dynamic msaa if the caller is trying to trigger it.
+ GrRenderTargetProxy* rtProxy = this->target(0)->asRenderTargetProxy();
+ if (rtProxy->numSamples() == 1 &&
+ (fixedFunctionFlags & GrDrawOp::FixedFunctionFlags::kUsesHWAA)) {
+ SkASSERT(caps.supportsDynamicMSAA(rtProxy));
+ }
+#endif
+ fUsesMSAASurface |= (fixedFunctionFlags & GrDrawOp::FixedFunctionFlags::kUsesHWAA);
+
this->recordOp(std::move(op), processorAnalysis, clip.doesClip() ? &clip : nullptr,
&dstProxyView, caps);
}
@@ -715,6 +726,7 @@
fClippedContentBounds.join(opsTask->fClippedContentBounds);
fTotalBounds.join(opsTask->fTotalBounds);
fRenderPassXferBarriers |= opsTask->fRenderPassXferBarriers;
+ fUsesMSAASurface |= opsTask->fUsesMSAASurface;
SkDEBUGCODE(fNumClips += opsTask->fNumClips);
}