diff options
-rw-r--r-- | samplecode/SampleCCPRGeometry.cpp | 68 | ||||
-rw-r--r-- | src/gpu/ccpr/GrCCCoverageProcessor.cpp | 6 | ||||
-rw-r--r-- | src/gpu/ccpr/GrCCCoverageProcessor.h | 9 | ||||
-rw-r--r-- | src/gpu/ccpr/GrCCCoverageProcessor_GSImpl.cpp | 2 | ||||
-rw-r--r-- | src/gpu/ccpr/GrCCCoverageProcessor_VSImpl.cpp | 2 |
5 files changed, 66 insertions, 21 deletions
diff --git a/samplecode/SampleCCPRGeometry.cpp b/samplecode/SampleCCPRGeometry.cpp index 4b521dea48..4d4bfcf49e 100644 --- a/samplecode/SampleCCPRGeometry.cpp +++ b/samplecode/SampleCCPRGeometry.cpp @@ -49,7 +49,8 @@ public: private: class Click; - class Op; + class DrawCoverageCountOp; + class VisualizeCoverageCountFP; void updateAndInval() { this->updateGpuData(); } @@ -68,15 +69,17 @@ private: typedef SampleView INHERITED; }; -class CCPRGeometryView::Op : public GrDrawOp { +class CCPRGeometryView::DrawCoverageCountOp : public GrDrawOp { DEFINE_OP_CLASS_ID public: - Op(CCPRGeometryView* view) : INHERITED(ClassID()), fView(view) { + DrawCoverageCountOp(CCPRGeometryView* view) : INHERITED(ClassID()), fView(view) { this->setBounds(SkRectPriv::MakeLargest(), GrOp::HasAABloat::kNo, GrOp::IsZeroArea::kNo); } - const char* name() const override { return "[Testing/Sample code] CCPRGeometryView::Op"; } + const char* name() const override { + return "[Testing/Sample code] CCPRGeometryView::DrawCoverageCountOp"; + } private: FixedFunctionFlags fixedFunctionFlags() const override { return FixedFunctionFlags::kNone; } @@ -94,6 +97,32 @@ private: typedef GrDrawOp INHERITED; }; +class CCPRGeometryView::VisualizeCoverageCountFP : public GrFragmentProcessor { +public: + VisualizeCoverageCountFP() : GrFragmentProcessor(kTestFP_ClassID, kNone_OptimizationFlags) {} + +private: + const char* name() const override { + return "[Testing/Sample code] CCPRGeometryView::VisualizeCoverageCountFP"; + } + std::unique_ptr<GrFragmentProcessor> clone() const override { + return skstd::make_unique<VisualizeCoverageCountFP>(); + } + void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override {} + bool onIsEqual(const GrFragmentProcessor&) const override { return true; } + + class Impl : public GrGLSLFragmentProcessor { + void emitCode(EmitArgs& args) override { + GrGLSLFPFragmentBuilder* f = args.fFragBuilder; + f->codeAppendf("half count = %s.a;", args.fInputColor); + f->codeAppendf("%s = half4(clamp(-count, 0, 1), clamp(+count, 0, 1), 0, abs(count));", + args.fOutputColor); + } + }; + + GrGLSLFragmentProcessor* onCreateGLSLInstance() const override { return new Impl; } +}; + static void draw_klm_line(int w, int h, SkCanvas* canvas, const SkScalar line[3], SkColor color) { SkPoint p1, p2; if (SkScalarAbs(line[1]) > SkScalarAbs(line[0])) { @@ -153,7 +182,29 @@ void CCPRGeometryView::onDrawContent(SkCanvas* canvas) { SkString caption; if (GrRenderTargetContext* rtc = canvas->internal_private_accessTopLayerRenderTargetContext()) { - rtc->priv().testingOnly_addDrawOp(skstd::make_unique<Op>(this)); + // Render coverage count. + GrContext* ctx = canvas->getGrContext(); + SkASSERT(ctx); + sk_sp<GrRenderTargetContext> ccbuff = + ctx->contextPriv().makeDeferredRenderTargetContext(SkBackingFit::kApprox, + this->width(), this->height(), + kAlpha_half_GrPixelConfig, + nullptr); + SkASSERT(ccbuff); + ccbuff->clear(nullptr, 0, GrRenderTargetContext::CanClearFullscreen::kYes); + ccbuff->priv().testingOnly_addDrawOp(skstd::make_unique<DrawCoverageCountOp>(this)); + + // Visualize coverage count in main canvas. + GrPaint paint; + paint.addColorFragmentProcessor( + GrSimpleTextureEffect::Make(sk_ref_sp(ccbuff->asTextureProxy()), SkMatrix::I())); + paint.addColorFragmentProcessor( + skstd::make_unique<VisualizeCoverageCountFP>()); + paint.setPorterDuffXPFactory(SkBlendMode::kSrcOver); + rtc->drawRect(GrNoClip(), std::move(paint), GrAA::kNo, SkMatrix::I(), + SkRect::MakeIWH(this->width(), this->height())); + + // Add label. caption.appendf("RenderPass_%s", GrCCCoverageProcessor::RenderPassName(fRenderPass)); if (RenderPass::kCubics == fRenderPass) { caption.appendf(" (%s)", SkCubicTypeName(fCubicType)); @@ -238,7 +289,7 @@ void CCPRGeometryView::updateGpuData() { } } -void CCPRGeometryView::Op::onExecute(GrOpFlushState* state) { +void CCPRGeometryView::DrawCoverageCountOp::onExecute(GrOpFlushState* state) { this->drawRenderPass(state, fView->fRenderPass); RenderPass cornerPass = RenderPass((int)fView->fRenderPass + 1); @@ -247,7 +298,8 @@ void CCPRGeometryView::Op::onExecute(GrOpFlushState* state) { } } -void CCPRGeometryView::Op::drawRenderPass(GrOpFlushState* state, RenderPass renderPass) { +void CCPRGeometryView::DrawCoverageCountOp::drawRenderPass(GrOpFlushState* state, + RenderPass renderPass) { GrResourceProvider* rp = state->resourceProvider(); GrContext* context = state->gpu()->getContext(); GrGLGpu* glGpu = kOpenGL_GrBackend == context->contextPriv().getBackend() @@ -255,7 +307,7 @@ void CCPRGeometryView::Op::drawRenderPass(GrOpFlushState* state, RenderPass rend : nullptr; GrCCCoverageProcessor proc(rp, renderPass, GrCCCoverageProcessor::WindMethod::kCrossProduct); - SkDEBUGCODE(proc.enableDebugVisualizations(kDebugBloat)); + SkDEBUGCODE(proc.enableDebugBloat(kDebugBloat)); SkSTArray<1, GrMesh> mesh; if (RenderPass::kCubics == renderPass) { diff --git a/src/gpu/ccpr/GrCCCoverageProcessor.cpp b/src/gpu/ccpr/GrCCCoverageProcessor.cpp index 1d570dca06..10b6736f33 100644 --- a/src/gpu/ccpr/GrCCCoverageProcessor.cpp +++ b/src/gpu/ccpr/GrCCCoverageProcessor.cpp @@ -23,12 +23,6 @@ void GrCCCoverageProcessor::Shader::emitFragmentCode(const GrCCCoverageProcessor this->onEmitFragmentCode(f, "coverage"); f->codeAppendf("%s.a = coverage;", skOutputColor); f->codeAppendf("%s = half4(1);", skOutputCoverage); -#ifdef SK_DEBUG - if (proc.debugVisualizationsEnabled()) { - f->codeAppendf("%s = half4(-%s.a, %s.a, 0, abs(%s.a));", - skOutputColor, skOutputColor, skOutputColor, skOutputColor); - } -#endif } void GrCCCoverageProcessor::Shader::EmitEdgeDistanceEquation(GrGLSLVertexGeoBuilder* s, diff --git a/src/gpu/ccpr/GrCCCoverageProcessor.h b/src/gpu/ccpr/GrCCCoverageProcessor.h index a60a38ee5e..d826b810c9 100644 --- a/src/gpu/ccpr/GrCCCoverageProcessor.h +++ b/src/gpu/ccpr/GrCCCoverageProcessor.h @@ -104,11 +104,10 @@ public: GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override; #ifdef SK_DEBUG - // Increases the 1/2 pixel AA bloat by a factor of debugBloat and outputs color instead of - // coverage (coverage=+1 -> green, coverage=0 -> black, coverage=-1 -> red). - void enableDebugVisualizations(float debugBloat) { fDebugBloat = debugBloat; } - bool debugVisualizationsEnabled() const { return fDebugBloat > 0; } - float debugBloat() const { SkASSERT(this->debugVisualizationsEnabled()); return fDebugBloat; } + // Increases the 1/2 pixel AA bloat by a factor of debugBloat. + void enableDebugBloat(float debugBloat) { fDebugBloat = debugBloat; } + bool debugBloatEnabled() const { return fDebugBloat > 0; } + float debugBloat() const { SkASSERT(this->debugBloatEnabled()); return fDebugBloat; } #endif // Appends a GrMesh that will draw the provided instances. The instanceBuffer must be an array diff --git a/src/gpu/ccpr/GrCCCoverageProcessor_GSImpl.cpp b/src/gpu/ccpr/GrCCCoverageProcessor_GSImpl.cpp index dd3d4890e1..82a292cb06 100644 --- a/src/gpu/ccpr/GrCCCoverageProcessor_GSImpl.cpp +++ b/src/gpu/ccpr/GrCCCoverageProcessor_GSImpl.cpp @@ -95,7 +95,7 @@ protected: float bloat = kAABloatRadius; #ifdef SK_DEBUG - if (proc.debugVisualizationsEnabled()) { + if (proc.debugBloatEnabled()) { bloat *= proc.debugBloat(); } #endif diff --git a/src/gpu/ccpr/GrCCCoverageProcessor_VSImpl.cpp b/src/gpu/ccpr/GrCCCoverageProcessor_VSImpl.cpp index 9fbac5a64f..e0ec4d4142 100644 --- a/src/gpu/ccpr/GrCCCoverageProcessor_VSImpl.cpp +++ b/src/gpu/ccpr/GrCCCoverageProcessor_VSImpl.cpp @@ -62,7 +62,7 @@ protected: float bloat = kAABloatRadius; #ifdef SK_DEBUG - if (proc.debugVisualizationsEnabled()) { + if (proc.debugBloatEnabled()) { bloat *= proc.debugBloat(); } #endif |