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

Side by Side Diff: src/gpu/instanced/InstancedRenderingTypes.h

Issue 2066993003: Begin instanced rendering for simple shapes (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: get mixed samples and base instance paths working again Created 4 years, 6 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
« no previous file with comments | « src/gpu/instanced/InstancedRendering.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 gr_instanced_InstancedRenderingTypes_DEFINED
9 #define gr_instanced_InstancedRenderingTypes_DEFINED
10
11 #include "GrTypes.h"
12 #include "SkRRect.h"
13
14 namespace gr_instanced {
15
16 enum class AntialiasMode : uint8_t {
17 kNone,
18 kCoverage,
19 kMSAA,
20 kMixedSamples
21 };
22 constexpr int kNumAntialiasModes = 1 + (int)AntialiasMode::kMixedSamples;
23
24 enum class ShapeType : uint8_t {
25 kRect,
26 kOval,
27 kSimpleRRect,
28 kNinePatch,
29 kComplexRRect
30 };
31 constexpr int kNumShapeTypes = 1 + (int)ShapeType::kComplexRRect;
32
33 inline static ShapeType GetRRectShapeType(const SkRRect& rrect) {
34 SkASSERT(rrect.getType() >= SkRRect::kRect_Type &&
35 rrect.getType() <= SkRRect::kComplex_Type);
36 return static_cast<ShapeType>(rrect.getType() - 1);
37
38 GR_STATIC_ASSERT((int)ShapeType::kRect == SkRRect::kRect_Type - 1);
39 GR_STATIC_ASSERT((int)ShapeType::kOval == SkRRect::kOval_Type - 1);
40 GR_STATIC_ASSERT((int)ShapeType::kSimpleRRect == SkRRect::kSimple_Type - 1);
41 GR_STATIC_ASSERT((int)ShapeType::kNinePatch == SkRRect::kNinePatch_Type - 1) ;
42 GR_STATIC_ASSERT((int)ShapeType::kComplexRRect == SkRRect::kComplex_Type - 1 );
43 GR_STATIC_ASSERT(kNumShapeTypes == SkRRect::kComplex_Type);
44 }
45
46 /**
47 * Per-vertex data. These values get fed into normal vertex attribs.
48 */
49 struct ShapeVertex {
50 float fX, fY; //!< Shape coordinates.
51 int32_t fAttrs; //!< Shape-specific vertex attributes, if needed.
52 };
53
54 template<typename T> struct TRange {
55 bool operator ==(const TRange& that) const {
56 return fStart == that.fStart && fCount == that.fCount;
57 }
58 bool operator !=(const TRange& that) const { return !(*this == that); }
59
60 bool isEmpty() const { return fCount <= 0; }
61 T end() { return fStart + fCount; }
62
63 T fStart;
64 T fCount;
65 };
66
67 typedef TRange<int16_t> IndexRange;
68 typedef TRange<int> InstanceRange;
69
70 /**
71 * Per-instance data. These values get fed into instanced vertex attribs.
72 */
73 struct Instance {
74 uint32_t fInfo; //!< Packed info about the instance. See Inf oBits.
75 float fShapeMatrix2x3[6]; //!< Maps canonical shape coords -> device s pace coords.
76 uint32_t fColor; //!< Color to be written out by the primitiv e processor.
77 float fLocalRect[4]; //!< Local coords rect that spans [-1, +1] i n shape coords.
78 };
79
80 /**
81 * Additional parameters required by some instances (e.g. round rect radii, pers pective column,
82 * local matrix). These are accessed via texel buffer.
83 */
84 struct ParamsTexel {
85 float fX, fY, fZ, fW;
86 };
87
88 GR_STATIC_ASSERT(0 == offsetof(ParamsTexel, fX));
89 GR_STATIC_ASSERT(4 * 4 == sizeof(ParamsTexel));
90
91 enum AttribIdx {
bsalomon 2016/06/20 14:49:54 You could make these enum classes if you wanted. I
csmartdalton 2016/06/20 15:33:47 Yeah AttribIdx should be made into an enum class w
92 kShapeCoords_AttribIdx,
93 kVertexAttrs_AttribIdx,
94 kInstanceInfo_AttribIdx,
95 kShapeMatrixX_AttribIdx,
96 kShapeMatrixY_AttribIdx,
97 kColor_AttribIdx,
98 kLocalRect_AttribIdx,
99
100 kNumVertexAttribs
101 };
102
103 enum ShapeFlag {
104 kRect_ShapeFlag = (1 << (int)ShapeType::kRect),
105 kOval_ShapeFlag = (1 << (int)ShapeType::kOval),
106 kSimpleRRect_ShapeFlag = (1 << (int)ShapeType::kSimpleRRect),
107 kNinePatch_ShapeFlag = (1 << (int)ShapeType::kNinePatch),
108 kComplexRRect_ShapeFlag = (1 << (int)ShapeType::kComplexRRect),
109
110 kRRect_ShapesMask = kSimpleRRect_ShapeFlag | kNinePatch_ShapeFlag | kComplex RRect_ShapeFlag
111 };
112
113 constexpr uint8_t GetShapeFlag(ShapeType type) { return 1 << (int)type; }
114
115 /**
116 * Defines what data is stored at which bits in the fInfo field of the instanced data.
117 */
118 enum InfoBits {
119 kShapeType_InfoBit = 29,
120 kInnerShapeType_InfoBit = 27,
121 kPerspective_InfoBit = 26,
122 kLocalMatrix_InfoBit = 25,
123 kParamsIdx_InfoBit = 0
124 };
125
126 enum InfoMasks {
127 kShapeType_InfoMask = 0u - (1 << kShapeType_InfoBit),
128 kInnerShapeType_InfoMask = (1 << kShapeType_InfoBit) - (1 << kInnerShapeTyp e_InfoBit),
129 kPerspective_InfoFlag = (1 << kPerspective_InfoBit),
130 kLocalMatrix_InfoFlag = (1 << kLocalMatrix_InfoBit),
131 kParamsIdx_InfoMask = (1 << kLocalMatrix_InfoBit) - 1
132 };
133
134 GR_STATIC_ASSERT((kNumShapeTypes - 1) <= (uint32_t)kShapeType_InfoMask >> kShape Type_InfoBit);
135 GR_STATIC_ASSERT((int)ShapeType::kSimpleRRect <=
136 kInnerShapeType_InfoMask >> kInnerShapeType_InfoBit);
137
138 /**
139 * Tracks all information needed in order to draw a batch of instances. This str uct also serves
140 * as an all-in-one shader key for the batch.
141 */
142 struct BatchInfo {
143 BatchInfo() : fData(0) {}
144
145 bool isSimpleRects() const {
146 return !((fShapeTypes & ~kRect_ShapeFlag) | fInnerShapeTypes);
147 }
148
149 bool canJoin(BatchInfo that) const {
150 if (fAntialiasMode != that.fAntialiasMode) {
151 return false;
152 }
153 if (SkToBool(fInnerShapeTypes) != SkToBool(that.fInnerShapeTypes)) {
154 // GrInstanceProcessor can't currently combine draws with and withou t inner shapes.
155 return false;
156 }
157 if (fCannotDiscard != that.fCannotDiscard) {
158 // For stencil draws, the use of discard can be a requirement.
159 return false;
160 }
161 return true;
162 }
163
164 void join(BatchInfo that) {
165 SkASSERT(this->canJoin(that));
166 fData |= that.fData;
167 }
168
169 union {
170 struct {
171 AntialiasMode fAntialiasMode;
172 uint8_t fShapeTypes;
173 uint8_t fInnerShapeTypes;
174 bool fHasPerspective : 1;
175 bool fHasLocalMatrix : 1;
176 bool fHasParams : 1;
177 bool fNonSquare : 1;
178 bool fUsesLocalCoords : 1;
179 bool fCannotTweakAlphaForCoverage : 1;
180 bool fCannotDiscard : 1;
181 };
182 uint32_t fData;
183 };
184 };
185
186 // This is required since all the data must fit into 32 bits of a shader key.
187 GR_STATIC_ASSERT(sizeof(uint32_t) == sizeof(BatchInfo));
188 GR_STATIC_ASSERT(kNumShapeTypes <= 8);
189
190 }
191
192 #endif
OLDNEW
« no previous file with comments | « src/gpu/instanced/InstancedRendering.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698