blob: 40b16a4e9db2933ded7b127402ecd6a6b366ecaa [file] [log] [blame]
Chris Dalton1a325d22017-07-14 15:17:41 -06001/*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Chris Dalton383a2ef2018-01-08 17:21:41 -05008#ifndef GrCCPathProcessor_DEFINED
9#define GrCCPathProcessor_DEFINED
Chris Dalton1a325d22017-07-14 15:17:41 -060010
Chris Dalton27059d32018-01-23 14:06:50 -070011#include "GrCaps.h"
Chris Dalton1a325d22017-07-14 15:17:41 -060012#include "GrGeometryProcessor.h"
13#include "SkPath.h"
14#include <array>
15
16class GrOnFlushResourceProvider;
Chris Daltond925f2d2018-05-07 19:19:06 -060017class GrOpFlushState;
18class GrPipeline;
Chris Dalton1a325d22017-07-14 15:17:41 -060019
20/**
Chris Dalton383a2ef2018-01-08 17:21:41 -050021 * This class draws AA paths using the coverage count masks produced by GrCCCoverageProcessor.
Chris Dalton1a325d22017-07-14 15:17:41 -060022 *
23 * Paths are drawn as bloated octagons, and coverage is derived from the coverage count mask and
24 * fill rule.
25 *
Chris Daltond925f2d2018-05-07 19:19:06 -060026 * To draw paths, the caller must set up an instance buffer as detailed below, then call drawPaths()
27 * providing its own instance buffer alongside the buffers found by calling FindIndexBuffer/
28 * FindVertexBuffer.
Chris Dalton1a325d22017-07-14 15:17:41 -060029 */
Chris Dalton383a2ef2018-01-08 17:21:41 -050030class GrCCPathProcessor : public GrGeometryProcessor {
Chris Dalton1a325d22017-07-14 15:17:41 -060031public:
Chris Dalton1a325d22017-07-14 15:17:41 -060032 enum class InstanceAttribs {
33 kDevBounds,
34 kDevBounds45,
35 kViewMatrix, // FIXME: This causes a lot of duplication. It could move to a texel buffer.
36 kViewTranslate,
37 kAtlasOffset,
38 kColor
39 };
40 static constexpr int kNumInstanceAttribs = 1 + (int)InstanceAttribs::kColor;
41
42 struct Instance {
Chris Daltona3e92712017-12-04 11:45:51 -070043 SkRect fDevBounds;
44 SkRect fDevBounds45; // Bounding box in "| 1 -1 | * devCoords" space.
45 // | 1 1 |
46 std::array<float, 4> fViewMatrix; // {kScaleX, kSkewy, kSkewX, kScaleY}
47 std::array<float, 2> fViewTranslate;
48 std::array<int16_t, 2> fAtlasOffset;
49 uint32_t fColor;
Chris Dalton1a325d22017-07-14 15:17:41 -060050
51 GR_STATIC_ASSERT(SK_SCALAR_IS_FLOAT);
52 };
53
Chris Daltona045eea2017-10-24 13:22:10 -060054 GR_STATIC_ASSERT(4 * 16 == sizeof(Instance));
Chris Dalton1a325d22017-07-14 15:17:41 -060055
Chris Dalton5d2de082017-12-19 10:40:23 -070056 static sk_sp<const GrBuffer> FindVertexBuffer(GrOnFlushResourceProvider*);
Chris Dalton27059d32018-01-23 14:06:50 -070057 static sk_sp<const GrBuffer> FindIndexBuffer(GrOnFlushResourceProvider*);
Chris Dalton5d2de082017-12-19 10:40:23 -070058
Chris Dalton27059d32018-01-23 14:06:50 -070059 GrCCPathProcessor(GrResourceProvider*, sk_sp<GrTextureProxy> atlas, SkPath::FillType);
Chris Dalton1a325d22017-07-14 15:17:41 -060060
Chris Dalton383a2ef2018-01-08 17:21:41 -050061 const char* name() const override { return "GrCCPathProcessor"; }
Robert Phillipse44ef102017-07-21 15:37:19 -040062 const GrSurfaceProxy* atlasProxy() const { return fAtlasAccess.proxy(); }
Chris Dalton1a325d22017-07-14 15:17:41 -060063 const GrTexture* atlas() const { return fAtlasAccess.peekTexture(); }
64 SkPath::FillType fillType() const { return fFillType; }
65 const Attribute& getInstanceAttrib(InstanceAttribs attribID) const {
66 const Attribute& attrib = this->getAttrib((int)attribID);
67 SkASSERT(Attribute::InputRate::kPerInstance == attrib.fInputRate);
68 return attrib;
69 }
70 const Attribute& getEdgeNormsAttrib() const {
71 SkASSERT(1 + kNumInstanceAttribs == this->numAttribs());
72 const Attribute& attrib = this->getAttrib(kNumInstanceAttribs);
73 SkASSERT(Attribute::InputRate::kPerVertex == attrib.fInputRate);
74 return attrib;
75 }
76
77 void getGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
78 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
79
Chris Daltond925f2d2018-05-07 19:19:06 -060080 void drawPaths(GrOpFlushState*, const GrPipeline&, const GrBuffer* indexBuffer,
81 const GrBuffer* vertexBuffer, GrBuffer* instanceBuffer, int baseInstance,
82 int endInstance, const SkRect& bounds) const;
83
Chris Dalton1a325d22017-07-14 15:17:41 -060084private:
Chris Daltona3e92712017-12-04 11:45:51 -070085 const SkPath::FillType fFillType;
86 const TextureSampler fAtlasAccess;
Chris Dalton1a325d22017-07-14 15:17:41 -060087
88 typedef GrGeometryProcessor INHERITED;
89};
90
91#endif