OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrDefaultGeoProcFactory.h" | 8 #include "GrDefaultGeoProcFactory.h" |
9 | 9 |
10 #include "GrDrawState.h" | 10 #include "GrDrawState.h" |
11 #include "GrInvariantOutput.h" | 11 #include "GrInvariantOutput.h" |
12 #include "gl/GrGLGeometryProcessor.h" | 12 #include "gl/GrGLGeometryProcessor.h" |
13 #include "gl/builders/GrGLProgramBuilder.h" | 13 #include "gl/builders/GrGLProgramBuilder.h" |
14 | 14 |
15 /* | 15 /* |
16 * The default Geometry Processor simply takes position and multiplies it by the
uniform view | 16 * The default Geometry Processor simply takes position and multiplies it by the
uniform view |
17 * matrix. It also leaves coverage untouched. Behind the scenes, we may add per
vertex color or | 17 * matrix. It also leaves coverage untouched. Behind the scenes, we may add per
vertex color or |
18 * local coords. | 18 * local coords. |
19 */ | 19 */ |
20 typedef GrDefaultGeoProcFactory Flag; | 20 typedef GrDefaultGeoProcFactory Flag; |
21 | 21 |
22 class DefaultGeoProc : public GrGeometryProcessor { | 22 class DefaultGeoProc : public GrGeometryProcessor { |
23 public: | 23 public: |
24 static GrGeometryProcessor* Create(GrColor color, uint8_t coverage, uint32_t
gpTypeFlags, | 24 static GrGeometryProcessor* Create(GrColor color, uint8_t coverage, uint32_t
gpTypeFlags, |
25 bool opaqueVertexColors) { | 25 bool opaqueVertexColors, const SkMatrix&
localMatrix) { |
26 return SkNEW_ARGS(DefaultGeoProc, (color, coverage, gpTypeFlags, opaqueV
ertexColors)); | 26 return SkNEW_ARGS(DefaultGeoProc, (color, coverage, gpTypeFlags, opaqueV
ertexColors, |
| 27 localMatrix)); |
27 } | 28 } |
28 | 29 |
29 virtual const char* name() const SK_OVERRIDE { return "DefaultGeometryProces
sor"; } | 30 virtual const char* name() const SK_OVERRIDE { return "DefaultGeometryProces
sor"; } |
30 | 31 |
31 const GrAttribute* inPosition() const { return fInPosition; } | 32 const GrAttribute* inPosition() const { return fInPosition; } |
32 const GrAttribute* inColor() const { return fInColor; } | 33 const GrAttribute* inColor() const { return fInColor; } |
33 const GrAttribute* inLocalCoords() const { return fInLocalCoords; } | 34 const GrAttribute* inLocalCoords() const { return fInLocalCoords; } |
34 const GrAttribute* inCoverage() const { return fInCoverage; } | 35 const GrAttribute* inCoverage() const { return fInCoverage; } |
35 uint8_t coverage() const { return fCoverage; } | 36 uint8_t coverage() const { return fCoverage; } |
36 | 37 |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 } else if (kAllOnes_GrGPInput == local.fInputCoverageType) { | 116 } else if (kAllOnes_GrGPInput == local.fInputCoverageType) { |
116 fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage); | 117 fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage); |
117 } | 118 } |
118 } | 119 } |
119 | 120 |
120 static inline void GenKey(const GrGeometryProcessor& gp, | 121 static inline void GenKey(const GrGeometryProcessor& gp, |
121 const GrBatchTracker& bt, | 122 const GrBatchTracker& bt, |
122 const GrGLCaps&, | 123 const GrGLCaps&, |
123 GrProcessorKeyBuilder* b) { | 124 GrProcessorKeyBuilder* b) { |
124 const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); | 125 const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); |
125 b->add32(def.fFlags); | |
126 | |
127 const BatchTracker& local = bt.cast<BatchTracker>(); | 126 const BatchTracker& local = bt.cast<BatchTracker>(); |
128 b->add32(local.fInputColorType | local.fInputCoverageType << 16); | 127 uint32_t key = def.fFlags; |
| 128 key |= local.fInputColorType << 8 | local.fInputCoverageType << 16; |
| 129 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ?
0x1 << 24 : 0x0; |
| 130 b->add32(key); |
129 } | 131 } |
130 | 132 |
131 virtual void setData(const GrGLProgramDataManager& pdman, | 133 virtual void setData(const GrGLProgramDataManager& pdman, |
132 const GrPrimitiveProcessor& gp, | 134 const GrPrimitiveProcessor& gp, |
133 const GrBatchTracker& bt) SK_OVERRIDE { | 135 const GrBatchTracker& bt) SK_OVERRIDE { |
134 const BatchTracker& local = bt.cast<BatchTracker>(); | 136 const BatchTracker& local = bt.cast<BatchTracker>(); |
135 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { | 137 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f
Color) { |
136 GrGLfloat c[4]; | 138 GrGLfloat c[4]; |
137 GrColorToRGBAFloat(local.fColor, c); | 139 GrColorToRGBAFloat(local.fColor, c); |
138 pdman.set4fv(fColorUniform, 1, c); | 140 pdman.set4fv(fColorUniform, 1, c); |
(...skipping 18 matching lines...) Expand all Loading... |
157 const GrGLCaps& caps, | 159 const GrGLCaps& caps, |
158 GrProcessorKeyBuilder* b) const SK_OVERRIDE { | 160 GrProcessorKeyBuilder* b) const SK_OVERRIDE { |
159 GLProcessor::GenKey(*this, bt, caps, b); | 161 GLProcessor::GenKey(*this, bt, caps, b); |
160 } | 162 } |
161 | 163 |
162 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE { | 164 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE { |
163 return SkNEW_ARGS(GLProcessor, (*this, bt)); | 165 return SkNEW_ARGS(GLProcessor, (*this, bt)); |
164 } | 166 } |
165 | 167 |
166 private: | 168 private: |
167 DefaultGeoProc(GrColor color, uint8_t coverage, uint32_t gpTypeFlags, bool o
paqueVertexColors) | 169 DefaultGeoProc(GrColor color, uint8_t coverage, uint32_t gpTypeFlags, bool o
paqueVertexColors, |
168 : INHERITED(color, opaqueVertexColors) | 170 const SkMatrix& localMatrix) |
| 171 : INHERITED(color, opaqueVertexColors, localMatrix) |
169 , fInPosition(NULL) | 172 , fInPosition(NULL) |
170 , fInColor(NULL) | 173 , fInColor(NULL) |
171 , fInLocalCoords(NULL) | 174 , fInLocalCoords(NULL) |
172 , fInCoverage(NULL) | 175 , fInCoverage(NULL) |
173 , fCoverage(coverage) | 176 , fCoverage(coverage) |
174 , fFlags(gpTypeFlags) { | 177 , fFlags(gpTypeFlags) { |
175 this->initClassID<DefaultGeoProc>(); | 178 this->initClassID<DefaultGeoProc>(); |
176 bool hasColor = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kColor_G
PType); | 179 bool hasColor = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kColor_G
PType); |
177 bool hasLocalCoord = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kLo
calCoord_GPType); | 180 bool hasLocalCoord = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kLo
calCoord_GPType); |
178 bool hasCoverage = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kCove
rage_GPType); | 181 bool hasCoverage = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kCove
rage_GPType); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 flags |= GrDefaultGeoProcFactory::kColor_GPType; | 240 flags |= GrDefaultGeoProcFactory::kColor_GPType; |
238 } | 241 } |
239 if (random->nextBool()) { | 242 if (random->nextBool()) { |
240 flags |= GrDefaultGeoProcFactory::kCoverage_GPType; | 243 flags |= GrDefaultGeoProcFactory::kCoverage_GPType; |
241 } | 244 } |
242 if (random->nextBool()) { | 245 if (random->nextBool()) { |
243 flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType; | 246 flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType; |
244 } | 247 } |
245 | 248 |
246 return DefaultGeoProc::Create(GrRandomColor(random), GrRandomCoverage(random
), | 249 return DefaultGeoProc::Create(GrRandomColor(random), GrRandomCoverage(random
), |
247 flags, random->nextBool()); | 250 flags, random->nextBool(), |
| 251 GrProcessorUnitTest::TestMatrix(random)); |
248 } | 252 } |
249 | 253 |
250 const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(GrColor color, | 254 const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(GrColor color, |
251 uint32_t gpTypeFlags, | 255 uint32_t gpTypeFlags, |
252 bool opaqueVertexColo
rs, | 256 bool opaqueVertexColo
rs, |
253 uint8_t coverage) { | 257 uint8_t coverage, |
254 return DefaultGeoProc::Create(color, coverage, gpTypeFlags, opaqueVertexColo
rs); | 258 const SkMatrix& local
Matrix) { |
| 259 return DefaultGeoProc::Create(color, coverage, gpTypeFlags, opaqueVertexColo
rs, localMatrix); |
255 } | 260 } |
OLD | NEW |