blob: 4f3843672691bccf46615473c9a0a6ccbb8fb497 [file] [log] [blame]
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +00001
2/*
3 * Copyright 2014 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9// This test only works with the GPU backend.
10
11#include "gm.h"
12
13#if SK_SUPPORT_GPU
14
15#include "GrContext.h"
joshualitt5478d422014-11-14 16:00:38 -080016#include "GrDefaultGeoProcFactory.h"
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +000017#include "GrPathUtils.h"
18#include "GrTest.h"
19#include "SkColorPriv.h"
20#include "SkDevice.h"
21#include "SkGeometry.h"
22#include "SkTLList.h"
23
joshualitt2771b562015-08-07 12:46:26 -070024#include "batches/GrTestBatch.h"
bsalomon16b99132015-08-13 14:55:50 -070025#include "batches/GrVertexBatch.h"
joshualitt2771b562015-08-07 12:46:26 -070026
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +000027#include "effects/GrConvexPolyEffect.h"
28
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +000029namespace skiagm {
joshualitt95964c62015-02-11 13:45:50 -080030
31class ConvexPolyTestBatch : public GrTestBatch {
32public:
reed1b55a962015-09-17 20:16:13 -070033 DEFINE_BATCH_CLASS_ID
joshualitt95964c62015-02-11 13:45:50 -080034 struct Geometry : public GrTestBatch::Geometry {
35 SkRect fBounds;
36 };
37
mtklein36352bf2015-03-25 18:17:31 -070038 const char* name() const override { return "ConvexPolyTestBatch"; }
joshualitt95964c62015-02-11 13:45:50 -080039
bsalomonabd30f52015-08-13 13:34:48 -070040 static GrDrawBatch* Create(const GrGeometryProcessor* gp, const Geometry& geo) {
halcanary385fe4d2015-08-26 13:07:48 -070041 return new ConvexPolyTestBatch(gp, geo);
joshualitt95964c62015-02-11 13:45:50 -080042 }
43
44private:
45 ConvexPolyTestBatch(const GrGeometryProcessor* gp, const Geometry& geo)
reed1b55a962015-09-17 20:16:13 -070046 : INHERITED(ClassID(), gp, geo.fBounds)
joshualitt95964c62015-02-11 13:45:50 -080047 , fGeometry(geo) {
48 }
49
mtklein36352bf2015-03-25 18:17:31 -070050 Geometry* geoData(int index) override {
joshualitt95964c62015-02-11 13:45:50 -080051 SkASSERT(0 == index);
52 return &fGeometry;
53 }
54
joshualitt88c23fc2015-05-13 14:18:07 -070055 const Geometry* geoData(int index) const override {
56 SkASSERT(0 == index);
57 return &fGeometry;
58 }
59
bsalomon75398562015-08-17 12:55:38 -070060 void generateGeometry(Target* target) override {
bsalomoned0bcad2015-05-04 10:36:42 -070061 size_t vertexStride = this->geometryProcessor()->getVertexStride();
bsalomonb5238a72015-05-05 07:49:49 -070062 SkASSERT(vertexStride == sizeof(SkPoint));
63 QuadHelper helper;
bsalomon75398562015-08-17 12:55:38 -070064 SkPoint* verts = reinterpret_cast<SkPoint*>(helper.init(target, vertexStride, 1));
bsalomonb5238a72015-05-05 07:49:49 -070065 if (!verts) {
joshualitt4b31de82015-03-05 14:33:41 -080066 return;
67 }
68
joshualitt95964c62015-02-11 13:45:50 -080069 // Make sure any artifacts around the exterior of path are visible by using overly
70 // conservative bounding geometry.
71 fGeometry.fBounds.outset(5.f, 5.f);
72 fGeometry.fBounds.toQuad(verts);
73
bsalomon75398562015-08-17 12:55:38 -070074 helper.recordDraw(target);
joshualitt95964c62015-02-11 13:45:50 -080075 }
76
77 Geometry fGeometry;
78
joshualitt95964c62015-02-11 13:45:50 -080079 typedef GrTestBatch INHERITED;
80};
81
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +000082/**
joshualittb0a8a372014-09-23 09:50:21 -070083 * This GM directly exercises a GrProcessor that draws convex polygons.
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +000084 */
85class ConvexPolyEffect : public GM {
86public:
87 ConvexPolyEffect() {
88 this->setBGColor(0xFFFFFFFF);
89 }
90
91protected:
mtklein36352bf2015-03-25 18:17:31 -070092 SkString onShortName() override {
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +000093 return SkString("convex_poly_effect");
94 }
95
mtklein36352bf2015-03-25 18:17:31 -070096 SkISize onISize() override {
tfarinaf5393182014-06-09 23:59:03 -070097 return SkISize::Make(720, 800);
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +000098 }
99
mtklein36352bf2015-03-25 18:17:31 -0700100 void onOnceBeforeDraw() override {
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000101 SkPath tri;
102 tri.moveTo(5.f, 5.f);
103 tri.lineTo(100.f, 20.f);
104 tri.lineTo(15.f, 100.f);
skia.committer@gmail.com4c18e9f2014-01-31 03:01:59 +0000105
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000106 fPaths.addToTail(tri);
107 fPaths.addToTail(SkPath())->reverseAddPath(tri);
skia.committer@gmail.com4c18e9f2014-01-31 03:01:59 +0000108
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000109 tri.close();
110 fPaths.addToTail(tri);
skia.committer@gmail.com4c18e9f2014-01-31 03:01:59 +0000111
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000112 SkPath ngon;
113 static const SkScalar kRadius = 50.f;
114 const SkPoint center = { kRadius, kRadius };
115 for (int i = 0; i < GrConvexPolyEffect::kMaxEdges; ++i) {
116 SkScalar angle = 2 * SK_ScalarPI * i / GrConvexPolyEffect::kMaxEdges;
117 SkPoint point;
118 point.fY = SkScalarSinCos(angle, &point.fX);
119 point.scale(kRadius);
120 point = center + point;
121 if (0 == i) {
122 ngon.moveTo(point);
123 } else {
124 ngon.lineTo(point);
125 }
126 }
skia.committer@gmail.com4c18e9f2014-01-31 03:01:59 +0000127
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000128 fPaths.addToTail(ngon);
129 SkMatrix scaleM;
130 scaleM.setScale(1.1f, 0.4f);
131 ngon.transform(scaleM);
132 fPaths.addToTail(ngon);
skia.committer@gmail.comf0b0cda2014-02-09 03:02:01 +0000133
commit-bot@chromium.orgf0539802014-02-08 19:31:05 +0000134 // integer edges
135 fRects.addToTail(SkRect::MakeLTRB(5.f, 1.f, 30.f, 25.f));
136 // half-integer edges
137 fRects.addToTail(SkRect::MakeLTRB(5.5f, 0.5f, 29.5f, 24.5f));
138 // vertically/horizontally thin rects that cover pixel centers
139 fRects.addToTail(SkRect::MakeLTRB(5.25f, 0.5f, 5.75f, 24.5f));
140 fRects.addToTail(SkRect::MakeLTRB(5.5f, 0.5f, 29.5f, 0.75f));
141 // vertically/horizontally thin rects that don't cover pixel centers
142 fRects.addToTail(SkRect::MakeLTRB(5.55f, 0.5f, 5.75f, 24.5f));
143 fRects.addToTail(SkRect::MakeLTRB(5.5f, .05f, 29.5f, .25f));
144 // small in x and y
145 fRects.addToTail(SkRect::MakeLTRB(5.05f, .55f, 5.45f, .85f));
146 // inverted in x and y
147 fRects.addToTail(SkRect::MakeLTRB(100.f, 50.5f, 5.f, 0.5f));
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000148 }
149
mtklein36352bf2015-03-25 18:17:31 -0700150 void onDraw(SkCanvas* canvas) override {
joshualittdf0c5572015-08-03 11:35:28 -0700151 using namespace GrDefaultGeoProcFactory;
reed@google.com9c135db2014-03-12 18:28:35 +0000152 GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget();
halcanary96fcdcc2015-08-27 07:41:13 -0700153 if (nullptr == rt) {
halcanary2a243382015-09-09 08:16:41 -0700154 skiagm::GM::DrawGpuOnlyMessage(canvas);
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000155 return;
156 }
157 GrContext* context = rt->getContext();
halcanary96fcdcc2015-08-27 07:41:13 -0700158 if (nullptr == context) {
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000159 return;
160 }
161
joshualittdf0c5572015-08-03 11:35:28 -0700162 Color color(0xff000000);
163 Coverage coverage(Coverage::kSolid_Type);
164 LocalCoords localCoords(LocalCoords::kUnused_Type);
joshualitt95964c62015-02-11 13:45:50 -0800165 SkAutoTUnref<const GrGeometryProcessor> gp(
joshualittdf0c5572015-08-03 11:35:28 -0700166 GrDefaultGeoProcFactory::Create(color, coverage, localCoords, SkMatrix::I()));
joshualitt95964c62015-02-11 13:45:50 -0800167
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000168 SkScalar y = 0;
bsalomonf045d602015-11-18 19:01:12 -0800169 for (PathList::Iter iter(fPaths, PathList::Iter::kHead_IterStart);
bsalomon49f085d2014-09-05 13:34:00 -0700170 iter.get();
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000171 iter.next()) {
commit-bot@chromium.orgf0539802014-02-08 19:31:05 +0000172 const SkPath* path = iter.get();
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000173 SkScalar x = 0;
174
joshualittb0a8a372014-09-23 09:50:21 -0700175 for (int et = 0; et < kGrProcessorEdgeTypeCnt; ++et) {
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000176 GrTestTarget tt;
robertphillips504ce5d2015-11-16 11:02:05 -0800177 context->getTestTarget(&tt, rt);
halcanary96fcdcc2015-08-27 07:41:13 -0700178 if (nullptr == tt.target()) {
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000179 SkDEBUGFAIL("Couldn't get Gr test target.");
180 return;
181 }
robertphillips1d24b8d2015-03-26 19:57:08 -0700182 const SkMatrix m = SkMatrix::MakeTrans(x, y);
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000183 SkPath p;
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000184 path->transform(m, &p);
skia.committer@gmail.com4c18e9f2014-01-31 03:01:59 +0000185
joshualittb0a8a372014-09-23 09:50:21 -0700186 GrPrimitiveEdgeType edgeType = (GrPrimitiveEdgeType) et;
187 SkAutoTUnref<GrFragmentProcessor> fp(GrConvexPolyEffect::Create(edgeType, p));
188 if (!fp) {
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000189 continue;
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000190 }
skia.committer@gmail.com4c18e9f2014-01-31 03:01:59 +0000191
egdaniel8dd688b2015-01-22 10:16:09 -0800192 GrPipelineBuilder pipelineBuilder;
bsalomonac856c92015-08-27 06:30:17 -0700193 pipelineBuilder.addCoverageFragmentProcessor(fp);
egdaniel8dd688b2015-01-22 10:16:09 -0800194 pipelineBuilder.setRenderTarget(rt);
joshualitt9853cce2014-11-17 14:22:48 -0800195
joshualitt95964c62015-02-11 13:45:50 -0800196 ConvexPolyTestBatch::Geometry geometry;
joshualittdf0c5572015-08-03 11:35:28 -0700197 geometry.fColor = color.fColor;
joshualitt95964c62015-02-11 13:45:50 -0800198 geometry.fBounds = p.getBounds();
joshualitt50408ad2014-11-03 12:31:14 -0800199
bsalomonabd30f52015-08-13 13:34:48 -0700200 SkAutoTUnref<GrDrawBatch> batch(ConvexPolyTestBatch::Create(gp, geometry));
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000201
joshualitt1c735482015-07-13 08:08:25 -0700202 tt.target()->drawBatch(pipelineBuilder, batch);
skia.committer@gmail.com4c18e9f2014-01-31 03:01:59 +0000203
commit-bot@chromium.orgf0539802014-02-08 19:31:05 +0000204 x += SkScalarCeilToScalar(path->getBounds().width() + 10.f);
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000205 }
skia.committer@gmail.com4c18e9f2014-01-31 03:01:59 +0000206
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000207 // Draw AA and non AA paths using normal API for reference.
208 canvas->save();
209 canvas->translate(x, y);
210 SkPaint paint;
211 canvas->drawPath(*path, paint);
212 canvas->translate(path->getBounds().width() + 10.f, 0);
213 paint.setAntiAlias(true);
214 canvas->drawPath(*path, paint);
215 canvas->restore();
skia.committer@gmail.com4c18e9f2014-01-31 03:01:59 +0000216
commit-bot@chromium.orgf0539802014-02-08 19:31:05 +0000217 y += SkScalarCeilToScalar(path->getBounds().height() + 20.f);
218 }
219
bsalomonf045d602015-11-18 19:01:12 -0800220 for (RectList::Iter iter(fRects, RectList::Iter::kHead_IterStart);
bsalomon49f085d2014-09-05 13:34:00 -0700221 iter.get();
commit-bot@chromium.orgf0539802014-02-08 19:31:05 +0000222 iter.next()) {
223
224 SkScalar x = 0;
225
joshualittb0a8a372014-09-23 09:50:21 -0700226 for (int et = 0; et < kGrProcessorEdgeTypeCnt; ++et) {
commit-bot@chromium.orgd85f32c2014-02-28 14:43:26 +0000227 GrTestTarget tt;
robertphillips504ce5d2015-11-16 11:02:05 -0800228 context->getTestTarget(&tt, rt);
halcanary96fcdcc2015-08-27 07:41:13 -0700229 if (nullptr == tt.target()) {
commit-bot@chromium.orgd85f32c2014-02-28 14:43:26 +0000230 SkDEBUGFAIL("Couldn't get Gr test target.");
231 return;
232 }
233 SkRect rect = *iter.get();
234 rect.offset(x, y);
joshualittb0a8a372014-09-23 09:50:21 -0700235 GrPrimitiveEdgeType edgeType = (GrPrimitiveEdgeType) et;
236 SkAutoTUnref<GrFragmentProcessor> fp(GrConvexPolyEffect::Create(edgeType, rect));
237 if (!fp) {
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000238 continue;
commit-bot@chromium.orgd85f32c2014-02-28 14:43:26 +0000239 }
240
egdaniel8dd688b2015-01-22 10:16:09 -0800241 GrPipelineBuilder pipelineBuilder;
bsalomonac856c92015-08-27 06:30:17 -0700242 pipelineBuilder.addCoverageFragmentProcessor(fp);
egdaniel8dd688b2015-01-22 10:16:09 -0800243 pipelineBuilder.setRenderTarget(rt);
commit-bot@chromium.orgd85f32c2014-02-28 14:43:26 +0000244
joshualitt95964c62015-02-11 13:45:50 -0800245 ConvexPolyTestBatch::Geometry geometry;
joshualittdf0c5572015-08-03 11:35:28 -0700246 geometry.fColor = color.fColor;
joshualitt95964c62015-02-11 13:45:50 -0800247 geometry.fBounds = rect;
joshualitt50408ad2014-11-03 12:31:14 -0800248
bsalomonabd30f52015-08-13 13:34:48 -0700249 SkAutoTUnref<GrDrawBatch> batch(ConvexPolyTestBatch::Create(gp, geometry));
commit-bot@chromium.orgd85f32c2014-02-28 14:43:26 +0000250
joshualitt1c735482015-07-13 08:08:25 -0700251 tt.target()->drawBatch(pipelineBuilder, batch);
commit-bot@chromium.orgd85f32c2014-02-28 14:43:26 +0000252
253 x += SkScalarCeilToScalar(rect.width() + 10.f);
commit-bot@chromium.orgf0539802014-02-08 19:31:05 +0000254 }
255
commit-bot@chromium.orgd85f32c2014-02-28 14:43:26 +0000256 // Draw rect without and with AA using normal API for reference
commit-bot@chromium.orgf0539802014-02-08 19:31:05 +0000257 canvas->save();
258 canvas->translate(x, y);
259 SkPaint paint;
commit-bot@chromium.orgd85f32c2014-02-28 14:43:26 +0000260 canvas->drawRect(*iter.get(), paint);
261 x += SkScalarCeilToScalar(iter.get()->width() + 10.f);
commit-bot@chromium.orgf0539802014-02-08 19:31:05 +0000262 paint.setAntiAlias(true);
263 canvas->drawRect(*iter.get(), paint);
264 canvas->restore();
265
commit-bot@chromium.orgd85f32c2014-02-28 14:43:26 +0000266 y += SkScalarCeilToScalar(iter.get()->height() + 20.f);
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000267 }
268 }
269
270private:
bsalomonf045d602015-11-18 19:01:12 -0800271 typedef SkTLList<SkPath, 1> PathList;
272 typedef SkTLList<SkRect, 1> RectList;
273 PathList fPaths;
274 RectList fRects;
skia.committer@gmail.comf0b0cda2014-02-09 03:02:01 +0000275
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000276 typedef GM INHERITED;
277};
278
halcanary385fe4d2015-08-26 13:07:48 -0700279DEF_GM(return new ConvexPolyEffect;)
commit-bot@chromium.orgc3fe5492014-01-30 18:15:51 +0000280}
281
282#endif