aboutsummaryrefslogtreecommitdiffhomepage
path: root/samplecode
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 /samplecode
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>
Diffstat (limited to 'samplecode')
-rw-r--r--samplecode/SampleCCPRGeometry.cpp68
1 files changed, 60 insertions, 8 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) {