aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/GrCCPRTest.cpp
diff options
context:
space:
mode:
authorGravatar Chris Dalton <csmartdalton@google.com>2017-10-06 16:27:32 -0600
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-10-06 22:48:59 +0000
commitcc604e5e9e33030a3033d2c6cc22e7759ab4d42e (patch)
treea6df3bced36be543445e95d5516b395356d563ea /tests/GrCCPRTest.cpp
parent4a6a732352fcb1445802dc95a477a943a31a9ac4 (diff)
CCPR: Add workaround for PowerVR crash
Bug: skia: Change-Id: Icd00f81fda5366813f9c959fdc91b0415894cbfc Reviewed-on: https://skia-review.googlesource.com/55360 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Chris Dalton <csmartdalton@google.com>
Diffstat (limited to 'tests/GrCCPRTest.cpp')
-rw-r--r--tests/GrCCPRTest.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/tests/GrCCPRTest.cpp b/tests/GrCCPRTest.cpp
new file mode 100644
index 0000000000..d8be726d6e
--- /dev/null
+++ b/tests/GrCCPRTest.cpp
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkTypes.h"
+#include "Test.h"
+
+#if SK_SUPPORT_GPU
+
+#include "GrContext.h"
+#include "GrContextPriv.h"
+#include "GrClip.h"
+#include "GrRenderTargetContext.h"
+#include "GrRenderTargetContextPriv.h"
+#include "GrShape.h"
+#include "GrPathRenderer.h"
+#include "GrPaint.h"
+#include "SkMatrix.h"
+#include "SkRect.h"
+#include "ccpr/GrCoverageCountingPathRenderer.h"
+#include <cmath>
+
+static constexpr int kCanvasSize = 100;
+
+class CCPRPathDrawer {
+public:
+ CCPRPathDrawer(GrContext* ctx)
+ : fCtx(ctx)
+ , fCCPR(GrCoverageCountingPathRenderer::CreateIfSupported(*fCtx->caps()))
+ , fRTC(fCtx->makeDeferredRenderTargetContext(SkBackingFit::kExact, kCanvasSize,
+ kCanvasSize, kRGBA_8888_GrPixelConfig,
+ nullptr)) {
+ if (fCCPR) {
+ fCtx->contextPriv().addOnFlushCallbackObject(fCCPR.get());
+ }
+ }
+
+ ~CCPRPathDrawer() {
+ if (fCCPR) {
+ fCtx->contextPriv().testingOnly_flushAndRemoveOnFlushCallbackObject(fCCPR.get());
+ }
+ }
+
+ bool valid() { return fCCPR && fRTC; }
+
+ void clear() { fRTC->clear(nullptr, 0, true); }
+
+ void drawPath(const SkPath& path, GrColor4f color = GrColor4f(0, 1, 0, 1)) {
+ GrPaint paint;
+ paint.setColor4f(color);
+ GrNoClip noClip;
+ SkIRect clipBounds = SkIRect::MakeWH(kCanvasSize, kCanvasSize);
+ SkMatrix matrix = SkMatrix::I();
+ GrShape shape(path);
+ fCCPR->drawPath({fCtx, std::move(paint), &GrUserStencilSettings::kUnused, fRTC.get(),
+ &noClip, &clipBounds, &matrix, &shape, GrAAType::kCoverage, false});
+ }
+
+ void flush() {
+ fCtx->flush();
+ }
+
+private:
+ GrContext* const fCtx;
+ sk_sp<GrCoverageCountingPathRenderer> fCCPR;
+ sk_sp<GrRenderTargetContext> fRTC;
+};
+
+DEF_GPUTEST_FOR_RENDERING_CONTEXTS(GrCCPRTest, reporter, ctxInfo) {
+ GrContext* const ctx = ctxInfo.grContext();
+ if (!GrCoverageCountingPathRenderer::IsSupported(*ctx->caps())) {
+ return;
+ }
+
+ CCPRPathDrawer ccpr(ctx);
+ if (!ccpr.valid()) {
+ ERRORF(reporter, "could not create render target context for ccpr.");
+ return;
+ }
+
+ // Test very busy paths.
+ static constexpr int kNumBusyVerbs = 1 << 17;
+ ccpr.clear();
+ SkPath busyPath;
+ busyPath.moveTo(0, 0); // top left
+ busyPath.lineTo(kCanvasSize, kCanvasSize); // bottom right
+ for (int i = 2; i < kNumBusyVerbs; ++i) {
+ float offset = i * ((float)kCanvasSize / kNumBusyVerbs);
+ busyPath.lineTo(kCanvasSize - offset, kCanvasSize + offset); // offscreen
+ }
+ ccpr.drawPath(busyPath);
+
+ ccpr.flush(); // If this doesn't crash, the test passed.
+ // If it does, maybe fiddle with fMaxInstancesPerDrawArraysWithoutCrashing in your
+ // platform's GrGLCaps.
+}
+
+#endif