blob: b5234423931af6561f497c047235c629f2dadc8c [file] [log] [blame]
Chris Dalton5ba36ba2018-05-09 01:08:38 -06001/*
2 * Copyright 2018 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
8#ifndef GrCCDrawPathsOp_DEFINED
9#define GrCCDrawPathsOp_DEFINED
10
11#include "SkTInternalLList.h"
Chris Dalton4bfb50b2018-05-21 09:10:53 -060012#include "ccpr/GrCCPathParser.h"
Chris Dalton5ba36ba2018-05-09 01:08:38 -060013#include "ccpr/GrCCPathProcessor.h"
Chris Dalton4bfb50b2018-05-21 09:10:53 -060014#include "ccpr/GrCCSTLList.h"
Chris Dalton5ba36ba2018-05-09 01:08:38 -060015#include "ops/GrDrawOp.h"
16
17class GrCCAtlas;
18class GrCCPerFlushResources;
19struct GrCCRTPendingPaths;
20class GrCoverageCountingPathRenderer;
21
22/**
23 * This is the Op that draws paths to the actual canvas, using atlases generated by CCPR.
24 */
25class GrCCDrawPathsOp : public GrDrawOp {
26public:
27 DEFINE_OP_CLASS_ID
28 SK_DECLARE_INTERNAL_LLIST_INTERFACE(GrCCDrawPathsOp);
29
30 GrCCDrawPathsOp(GrCoverageCountingPathRenderer*, GrPaint&&, const SkIRect& clipIBounds,
31 const SkMatrix&, const SkPath&, const SkRect& devBounds);
32 ~GrCCDrawPathsOp() override;
33
Chris Dalton5ba36ba2018-05-09 01:08:38 -060034 const char* name() const override { return "GrCCDrawOp"; }
35 FixedFunctionFlags fixedFunctionFlags() const override { return FixedFunctionFlags::kNone; }
36 RequiresDstTexture finalize(const GrCaps&, const GrAppliedClip*,
37 GrPixelConfigIsClamped) override;
Chris Dalton5ba36ba2018-05-09 01:08:38 -060038 bool onCombineIfPossible(GrOp* other, const GrCaps& caps) override;
39 void visitProxies(const VisitProxyFunc& func) const override {
40 fProcessors.visitProxies(func);
41 }
42 void onPrepare(GrOpFlushState*) override {}
43
Chris Daltonf104fec2018-05-22 16:17:48 -060044 void wasRecorded(GrCCRTPendingPaths* owningRTPendingPaths);
Chris Dalton4bfb50b2018-05-21 09:10:53 -060045 int countPaths(GrCCPathParser::PathStats*) const;
Chris Dalton5ba36ba2018-05-09 01:08:38 -060046 void setupResources(GrCCPerFlushResources*, GrOnFlushResourceProvider*);
Chris Dalton4bfb50b2018-05-21 09:10:53 -060047 SkDEBUGCODE(int numSkippedInstances_debugOnly() const { return fNumSkippedInstances; })
Chris Dalton5ba36ba2018-05-09 01:08:38 -060048
49 void onExecute(GrOpFlushState*) override;
50
51private:
52 SkPath::FillType getFillType() const {
Chris Dalton4bfb50b2018-05-21 09:10:53 -060053 SkASSERT(fNumDraws >= 1);
54 return fDraws.head().fPath.getFillType();
Chris Dalton5ba36ba2018-05-09 01:08:38 -060055 }
56
57 struct AtlasBatch {
58 const GrCCAtlas* fAtlas;
59 int fEndInstanceIdx;
60 };
61
62 void addAtlasBatch(const GrCCAtlas* atlas, int endInstanceIdx) {
63 SkASSERT(endInstanceIdx > fBaseInstance);
64 SkASSERT(fAtlasBatches.empty() ||
65 endInstanceIdx > fAtlasBatches.back().fEndInstanceIdx);
66 fAtlasBatches.push_back() = {atlas, endInstanceIdx};
67 }
68
69 GrCoverageCountingPathRenderer* const fCCPR;
Chris Dalton4bfb50b2018-05-21 09:10:53 -060070 const uint32_t fSRGBFlags;
Chris Dalton1c548942018-05-22 13:09:48 -060071 const SkMatrix fViewMatrixIfUsingLocalCoords;
Chris Dalton4bfb50b2018-05-21 09:10:53 -060072
73 struct SingleDraw {
74 SkIRect fClipIBounds;
75 SkMatrix fMatrix;
76 SkPath fPath;
77 GrColor fColor;
78 SingleDraw* fNext;
79 };
80
81 GrCCSTLList<SingleDraw> fDraws;
82 SkDEBUGCODE(int fNumDraws = 1);
83
84 GrProcessorSet fProcessors;
Chris Dalton5ba36ba2018-05-09 01:08:38 -060085 GrCCRTPendingPaths* fOwningRTPendingPaths = nullptr;
86
Chris Dalton5ba36ba2018-05-09 01:08:38 -060087 int fBaseInstance;
Chris Dalton5ba36ba2018-05-09 01:08:38 -060088 SkSTArray<1, AtlasBatch, true> fAtlasBatches;
Chris Dalton4bfb50b2018-05-21 09:10:53 -060089 SkDEBUGCODE(int fNumSkippedInstances = 0);
Chris Dalton5ba36ba2018-05-09 01:08:38 -060090};
91
92#endif