Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(164)

Side by Side Diff: src/gpu/GrInstancedRenderingTypes.h

Issue 1897203002: Implement instanced rendering for simple shapes (Closed) Base URL: https://skia.googlesource.com/skia.git@upload2_requireHWAA
Patch Set: rebase Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright 2016 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 GrInstancedRenderingTypes_DEFINED
9 #define GrInstancedRenderingTypes_DEFINED
10
11 #include "GrTypes.h"
12 #include "SkRRect.h"
13
14 /**
15 * Internal structs and enums for classes involved in instanced rendering. This class is intended
16 * to be inherited non-publicly.
17 */
18 class GrInstancedRenderingTypes {
bsalomon 2016/04/25 13:22:39 Why this pattern of inheriting from this class whi
Chris Dalton 2016/04/25 17:01:19 Mainly because then GrInstanceProcessor.cpp gets l
bsalomon 2016/04/27 14:10:32 I'd prefer a namespace and using decls. What do y
csmartdalton 2016/05/20 01:09:45 sgtm
19 public:
20 /**
21 * Per-vertex data. These values get fed into normal vertex attribs.
22 */
23 struct ShapeVertex {
24 float fX, fY; //!< Shape coordinates.
25 int32_t fAttrs; //!< Shape-specific vertex attributes, if needed.
26 };
27
28 /**
29 * Per-instance data. These values get fed into instanced vertex attribs.
30 */
31 struct Instance {
32 uint32_t fInfo; //!< Packed info about the instance. See InfoBits.
33 float fShapeMatrix2x3[6]; //!< Maps canonical shape coords -> devi ce space coords.
34 uint32_t fColor; //!< Color to be written out by the prim itive processor.
35 float fLocalRect[4]; //!< Local coords rect that spans [-1, + 1] in shape coords.
36 };
37
38 /**
39 * Additional parameters required by some instances (e.g. round rect radii, perspective column,
40 * local matrix). These are accessed via texel buffer.
41 */
42 struct ParamsTexel {
43 union {
44 struct { float fX, fY, fZ, fW; };
45 float fValues[4];
46 };
47 };
48
49 GR_STATIC_ASSERT(0 == offsetof(ParamsTexel, fX));
50 GR_STATIC_ASSERT(4 * 4 == sizeof(ParamsTexel));
51
52 enum AttribIdx {
53 kShapeCoords_AttribIdx,
54 kVertexAttrs_AttribIdx,
55 kInstanceInfo_AttribIdx,
56 kShapeMatrixX_AttribIdx,
57 kShapeMatrixY_AttribIdx,
58 kColor_AttribIdx,
59 kLocalRect_AttribIdx,
60
61 kNumVertexAttribs
62 };
63
64 enum ShapeType {
bsalomon 2016/04/25 13:22:39 I think use of the word "shape" may conflict with
Chris Dalton 2016/04/25 17:01:19 SkRRect also has kEmpty, which I would prefer to n
bsalomon 2016/04/27 14:10:32 I guess it is ok.
65 kRect_ShapeType,
66 kOval_ShapeType,
67 kSimpleRRect_ShapeType,
68 kNinePatch_ShapeType,
69 kComplexRRect_ShapeType,
70
71 kLast_ShapeType = kComplexRRect_ShapeType
72 };
73
74 static ShapeType RRectShapeType(const SkRRect& rrect) {
75 SkASSERT(rrect.getType() >= SkRRect::kRect_Type &&
76 rrect.getType() <= SkRRect::kComplex_Type);
77 return static_cast<ShapeType>(rrect.getType() - 1);
78
79 GR_STATIC_ASSERT(kRect_ShapeType == SkRRect::kRect_Type - 1);
80 GR_STATIC_ASSERT(kOval_ShapeType == SkRRect::kOval_Type - 1);
81 GR_STATIC_ASSERT(kSimpleRRect_ShapeType == SkRRect::kSimple_Type - 1);
82 GR_STATIC_ASSERT(kNinePatch_ShapeType == SkRRect::kNinePatch_Type - 1);
83 GR_STATIC_ASSERT(kComplexRRect_ShapeType == SkRRect::kComplex_Type - 1);
84 GR_STATIC_ASSERT(kLast_ShapeType == SkRRect::kComplex_Type - 1);
85 }
86
87 enum ShapeFlag {
88 kRect_ShapeFlag = (1 << kRect_ShapeType),
89 kOval_ShapeFlag = (1 << kOval_ShapeType),
90 kSimpleRRect_ShapeFlag = (1 << kSimpleRRect_ShapeType),
91 kNinePatch_ShapeFlag = (1 << kNinePatch_ShapeType),
92 kComplexRRect_ShapeFlag = (1 << kComplexRRect_ShapeType),
93
94 kRRect_ShapesMask = kSimpleRRect_ShapeFlag | kNinePatch_ShapeFlag | kCom plexRRect_ShapeFlag
95 };
96
97 /**
98 * Defines what data is stored at which bits in the fInfo field of the insta nced data.
99 */
100 enum InfoBits {
101 kShapeType_InfoBit = 29,
102 kInnerShapeType_InfoBit = 27,
103 kPerspective_InfoBit = 26,
104 kLocalMatrix_InfoBit = 25,
105 kParamsIdx_InfoBit = 0
106 };
107
108 enum InfoMasks {
109 kShapeType_InfoMask = 0u - (1 << kShapeType_InfoBit),
110 kInnerShapeType_InfoMask = (1 << kShapeType_InfoBit) - (1 << kInnerShap eType_InfoBit),
111 kPerspective_InfoFlag = (1 << kPerspective_InfoBit),
112 kLocalMatrix_InfoFlag = (1 << kLocalMatrix_InfoBit),
113 kParamsIdx_InfoMask = (1 << kLocalMatrix_InfoBit) - 1
114 };
115
116 GR_STATIC_ASSERT(kLast_ShapeType <= (uint32_t)kShapeType_InfoMask >> kShapeT ype_InfoBit);
117 GR_STATIC_ASSERT(kSimpleRRect_ShapeType <= kInnerShapeType_InfoMask >> kInne rShapeType_InfoBit);
118
119 struct BatchTracker {
bsalomon 2016/04/25 13:22:38 We've been moving away from using "BatchTracker" i
Chris Dalton 2016/04/25 17:01:19 Agreed, I don't like the name either. We can come
Chris Dalton 2016/04/26 19:18:08 Done.
120 BatchTracker() : fData(0) {}
121
122 bool isSimpleRects() const {
123 return !((fShapeTypes & ~kRect_ShapeFlag) | fInnerShapeTypes);
124 }
125
126 bool canJoin(BatchTracker that) const {
127 if (SkToBool(fInnerShapeTypes) != SkToBool(that.fInnerShapeTypes)) {
128 // GrInstanceProcessor can't currently combine draws with and wi thout inner shapes.
129 return false;
130 }
131 if (fCannotDiscard != that.fCannotDiscard) {
132 // For stencil draws, the use of discard can be a requirement.
133 return false;
134 }
135 return true;
136 }
137
138 void join(BatchTracker that) {
139 SkASSERT(this->canJoin(that));
140 fData |= that.fData;
141 }
142
143 union {
144 struct {
145 uint8_t fShapeTypes;
146 uint8_t fInnerShapeTypes;
147 bool fHasPerspective : 1;
148 bool fHasLocalMatrix : 1;
149 bool fHasParams : 1;
150 bool fNonSquare : 1;
151 bool fUsesColor : 1;
bsalomon 2016/04/25 13:22:39 Uses color and uses coverage are rarely useful, do
Chris Dalton 2016/04/25 17:01:19 Ok, I'll gladly take them out.
Chris Dalton 2016/04/26 19:18:08 Done.
152 bool fUsesCoverage : 1;
153 bool fUsesLocalCoords : 1;
154 bool fCannotTweakAlphaForCoverage : 1;
155 bool fCannotDiscard : 1;
156 };
157 uint32_t fData;
158 };
159 };
160
161 // This is required since all the data must fit into 32 bits of a shader key .
162 GR_STATIC_ASSERT(sizeof(uint32_t) == sizeof(BatchTracker));
163 GR_STATIC_ASSERT(kLast_ShapeType <= 8);
164
165 enum AntialiasMode {
166 kNone_AntialiasMode,
167 kCoverage_AntialiasMode,
168 kMSAA_AntialiasMode,
169 kMixedSamples_AntialiasMode,
170
171 kLast_AntialiasMode = kMixedSamples_AntialiasMode
172 };
173
174 enum AntialiasFlags {
175 kNone_AntialiasFlag = (1 << kNone_AntialiasMode),
176 kCoverage_AntialiasFlag = (1 << kCoverage_AntialiasMode),
177 kMSAA_AntialiasFlag = (1 << kMSAA_AntialiasMode),
178 kMixedSamples_AntialiasFlag = (1 << kMixedSamples_AntialiasMode)
179 };
180 };
181
182 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698