1/*
2 * Copyright 2020 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 GrDrawAtlasPathOp_DEFINED
9#define GrDrawAtlasPathOp_DEFINED
10
11#include "src/gpu/ops/GrDrawOp.h"
12
13class GrDrawAtlasPathOp : public GrDrawOp {
14public:
15 DEFINE_OP_CLASS_ID
16
17 GrDrawAtlasPathOp(int numRenderTargetSamples, sk_sp<GrTextureProxy> atlasProxy,
18 const SkIRect& devIBounds, const SkIVector& devToAtlasOffset,
19 const SkMatrix& viewMatrix, GrPaint&& paint)
20 : GrDrawOp(ClassID())
21 , fEnableHWAA(numRenderTargetSamples > 1)
22 , fAtlasProxy(std::move(atlasProxy))
23 , fInstanceList(devIBounds, devToAtlasOffset, paint.getColor4f(), viewMatrix)
24 , fProcessors(std::move(paint)) {
25 this->setBounds(SkRect::Make(devIBounds), HasAABloat::kYes, IsHairline::kNo);
26 }
27
28 const char* name() const override { return "GrDrawAtlasPathOp"; }
29 FixedFunctionFlags fixedFunctionFlags() const override {
30 return (fEnableHWAA) ? FixedFunctionFlags::kUsesHWAA : FixedFunctionFlags::kNone;
31 }
32 void visitProxies(const VisitProxyFunc& fn) const override {
33 fn(fAtlasProxy.get(), GrMipMapped::kNo);
34 fProcessors.visitProxies(fn);
35 }
36 GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*,
37 bool hasMixedSampledCoverage, GrClampType) override;
38 CombineResult onCombineIfPossible(GrOp*, GrRecordingContext::Arenas*, const GrCaps&) override;
39 void onPrepare(GrOpFlushState*) override;
40 void onExecute(GrOpFlushState*, const SkRect& chainBounds) override;
41
42private:
43 void onPrePrepare(GrRecordingContext*,
44 const GrSurfaceProxyView* writeView,
45 GrAppliedClip*,
46 const GrXferProcessor::DstProxyView&) override;
47
48 struct Instance {
49 constexpr static size_t Stride(bool usesLocalCoords) {
50 size_t stride = sizeof(Instance);
51 if (!usesLocalCoords) {
52 stride -= sizeof(Instance::fViewMatrixIfUsingLocalCoords);
53 }
54 return stride;
55 }
56 Instance(const SkIRect& devIBounds, SkIVector devToAtlasOffset, const SkPMColor4f& color,
57 const SkMatrix& m)
58 : fDevIBounds(devIBounds)
59 , fDevToAtlasOffset(devToAtlasOffset)
60 , fColor(color)
61 , fViewMatrixIfUsingLocalCoords{m.getScaleX(), m.getSkewY(),
62 m.getSkewX(), m.getScaleY(),
63 m.getTranslateX(), m.getTranslateY()} {
64 }
65 SkIRect fDevIBounds;
66 SkIVector fDevToAtlasOffset;
67 SkPMColor4f fColor;
68 float fViewMatrixIfUsingLocalCoords[6];
69 };
70
71 struct InstanceList {
72 InstanceList(const SkIRect& devIBounds, SkIVector devToAtlasOffset,
73 const SkPMColor4f& color, const SkMatrix& viewMatrix)
74 : fInstance(devIBounds, devToAtlasOffset, color, viewMatrix) {
75 }
76 InstanceList* fNext = nullptr;
77 Instance fInstance;
78 };
79
80 const bool fEnableHWAA;
81 const sk_sp<GrTextureProxy> fAtlasProxy;
82 bool fUsesLocalCoords = false;
83
84 InstanceList fInstanceList;
85 InstanceList** fInstanceTail = &fInstanceList.fNext;
86 int fInstanceCount = 1;
87
88 sk_sp<const GrBuffer> fInstanceBuffer;
89 int fBaseInstance;
90
91 GrProcessorSet fProcessors;
92};
93
94#endif
95