blob: e684dfafd750b48572bcbd3dbcb5b06e2f65561f [file] [log] [blame]
joshualitt44701df2015-02-23 14:44:57 -08001/*
2 * Copyright 2010 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 GrClip_DEFINED
9#define GrClip_DEFINED
10
cdalton846c0512016-05-13 10:25:00 -070011#include "GrFragmentProcessor.h"
12#include "GrTypesPriv.h"
joshualitt44701df2015-02-23 14:44:57 -080013#include "SkClipStack.h"
joshualitt44701df2015-02-23 14:44:57 -080014
robertphillips976f5f02016-06-03 10:59:20 -070015class GrDrawContext;
cdalton846c0512016-05-13 10:25:00 -070016class GrPipelineBuilder;
joshualitt44701df2015-02-23 14:44:57 -080017
18/**
cdalton846c0512016-05-13 10:25:00 -070019 * Produced by GrClip. It provides a set of modifications to the drawing state that are used to
20 * create the final GrPipeline for a GrBatch.
joshualitt44701df2015-02-23 14:44:57 -080021 */
robertphillips5f2fa472016-05-19 11:36:25 -070022class GrAppliedClip : public SkNoncopyable {
joshualitt44701df2015-02-23 14:44:57 -080023public:
cdalton846c0512016-05-13 10:25:00 -070024 GrAppliedClip() : fHasStencilClip(false) {}
robertphillips5f2fa472016-05-19 11:36:25 -070025 const GrFragmentProcessor* clipCoverageFragmentProcessor() const {
26 return fClipCoverageFP.get();
27 }
cdalton846c0512016-05-13 10:25:00 -070028 const GrScissorState& scissorState() const { return fScissorState; }
29 bool hasStencilClip() const { return fHasStencilClip; }
joshualitt44701df2015-02-23 14:44:57 -080030
robertphillips5f2fa472016-05-19 11:36:25 -070031 void makeStencil(bool hasStencil) {
32 fClipCoverageFP = nullptr;
33 fScissorState.setDisabled();
34 fHasStencilClip = hasStencil;
35 }
joshualitt44701df2015-02-23 14:44:57 -080036
robertphillips5f2fa472016-05-19 11:36:25 -070037 void makeScissoredStencil(bool hasStencil, const SkIRect& scissor) {
38 fClipCoverageFP = nullptr;
39 fScissorState.set(scissor);
40 fHasStencilClip = hasStencil;
41 }
42
43 void makeFPBased(sk_sp<const GrFragmentProcessor> fp) {
44 fClipCoverageFP = fp;
45 fScissorState.setDisabled();
46 fHasStencilClip = false;
47 }
48
49 void makeScissoredFPBased(sk_sp<const GrFragmentProcessor> fp, SkIRect& scissor) {
50 fClipCoverageFP = fp;
51 fScissorState.set(scissor);
52 fHasStencilClip = false;
53 }
54
55private:
56 sk_sp<const GrFragmentProcessor> fClipCoverageFP;
57 GrScissorState fScissorState;
58 bool fHasStencilClip;
cdalton846c0512016-05-13 10:25:00 -070059
60 typedef SkNoncopyable INHERITED;
61};
62
63/**
64 * GrClip is an abstract base class for applying a clip. It constructs a clip mask if necessary, and
65 * fills out a GrAppliedClip instructing the caller on how to set up the draw state.
66 */
67class GrClip {
68public:
69 virtual bool quickContains(const SkRect&) const = 0;
70 virtual void getConservativeBounds(int width, int height, SkIRect* devResult,
71 bool* isIntersectionOfRects = nullptr) const = 0;
robertphillips976f5f02016-06-03 10:59:20 -070072 virtual bool apply(GrContext*, const GrPipelineBuilder&, GrDrawContext*,
73 const SkRect* devBounds, GrAppliedClip*) const = 0;
cdalton846c0512016-05-13 10:25:00 -070074
75 virtual ~GrClip() {}
76};
77
78/**
79 * Specialized implementation for no clip.
80 */
81class GrNoClip final : public GrClip {
82private:
83 bool quickContains(const SkRect&) const final { return true; }
84 void getConservativeBounds(int width, int height, SkIRect* devResult,
85 bool* isIntersectionOfRects) const final;
robertphillips976f5f02016-06-03 10:59:20 -070086 bool apply(GrContext*, const GrPipelineBuilder&, GrDrawContext*,
cdalton846c0512016-05-13 10:25:00 -070087 const SkRect*, GrAppliedClip*) const final { return true; }
88};
89
90/**
91 * GrFixedClip is a clip that can be represented by fixed-function hardware. It never modifies the
92 * stencil buffer itself, but can be configured to use whatever clip is already there.
93 */
94class GrFixedClip final : public GrClip {
95public:
96 GrFixedClip() : fHasStencilClip(false) {}
97 GrFixedClip(const SkIRect& scissorRect) : fScissorState(scissorRect), fHasStencilClip(false) {}
98
99 void reset() {
100 fScissorState.setDisabled();
101 fHasStencilClip = false;
102 }
103
104 void reset(const SkIRect& scissorRect) {
105 fScissorState.set(scissorRect);
106 fHasStencilClip = false;
107 }
108
109 void enableStencilClip(bool enable) { fHasStencilClip = enable; }
110
111 const GrScissorState& scissorState() const { return fScissorState; }
112 bool hasStencilClip() const { return fHasStencilClip; }
113
114 bool quickContains(const SkRect&) const final;
115 void getConservativeBounds(int width, int height, SkIRect* devResult,
116 bool* isIntersectionOfRects) const final;
117
118private:
robertphillips976f5f02016-06-03 10:59:20 -0700119 bool apply(GrContext*, const GrPipelineBuilder&, GrDrawContext*,
cdalton846c0512016-05-13 10:25:00 -0700120 const SkRect* devBounds, GrAppliedClip* out) const final;
121
122 GrScissorState fScissorState;
123 bool fHasStencilClip;
124};
125
126/**
127 * GrClipStackClip can apply a generic SkClipStack to the draw state. It may generate clip masks or
128 * write to the stencil buffer during apply().
129 */
130class GrClipStackClip final : public GrClip {
131public:
132 GrClipStackClip(const SkClipStack* stack = nullptr, const SkIPoint* origin = nullptr) {
133 this->reset(stack, origin);
134 }
135
136 void reset(const SkClipStack* stack = nullptr, const SkIPoint* origin = nullptr) {
137 fOrigin = origin ? *origin : SkIPoint::Make(0, 0);
138 fStack.reset(SkSafeRef(stack));
139 }
140
141 const SkIPoint& origin() const { return fOrigin; }
142 const SkClipStack* clipStack() const { return fStack; }
143
144 bool quickContains(const SkRect&) const final;
145 void getConservativeBounds(int width, int height, SkIRect* devResult,
146 bool* isIntersectionOfRects) const final;
robertphillips976f5f02016-06-03 10:59:20 -0700147 bool apply(GrContext*, const GrPipelineBuilder&, GrDrawContext*,
cdalton846c0512016-05-13 10:25:00 -0700148 const SkRect* devBounds, GrAppliedClip*) const final;
149
150private:
151 SkIPoint fOrigin;
152 SkAutoTUnref<const SkClipStack> fStack;
joshualitt44701df2015-02-23 14:44:57 -0800153};
154
155#endif