aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Chris Dalton <csmartdalton@google.com>2018-03-19 14:16:44 -0600
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-03-20 20:46:17 +0000
commit8d38a7f5215e584d2d3c94e77e213a89d1e4ff97 (patch)
tree6466e8335cd6c943289172b90819c8550e443bf2
parentf36b8a30c57266d02725bed7e807eeb78ef2e559 (diff)
ccpr: Update the sample to use proper coverage count buffers
Bug: skia: Change-Id: I6ce3ec567e671fa2ab3f05403015b48251518227 Reviewed-on: https://skia-review.googlesource.com/115072 Reviewed-by: Robert Phillips <robertphillips@google.com> Commit-Queue: Chris Dalton <csmartdalton@google.com>
-rw-r--r--samplecode/SampleCCPRGeometry.cpp68
-rw-r--r--src/gpu/ccpr/GrCCCoverageProcessor.cpp6
-rw-r--r--src/gpu/ccpr/GrCCCoverageProcessor.h9
-rw-r--r--src/gpu/ccpr/GrCCCoverageProcessor_GSImpl.cpp2
-rw-r--r--src/gpu/ccpr/GrCCCoverageProcessor_VSImpl.cpp2
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