| 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 return SkNEW_ARGS(DefaultGeoProc, (color, coverage, gpTypeFlags)); | 25 bool opaqueVertexColors) { |
| 26 return SkNEW_ARGS(DefaultGeoProc, (color, coverage, gpTypeFlags, opaqueV
ertexColors)); |
| 26 } | 27 } |
| 27 | 28 |
| 28 virtual const char* name() const SK_OVERRIDE { return "DefaultGeometryProces
sor"; } | 29 virtual const char* name() const SK_OVERRIDE { return "DefaultGeometryProces
sor"; } |
| 29 | 30 |
| 30 const GrAttribute* inPosition() const { return fInPosition; } | 31 const GrAttribute* inPosition() const { return fInPosition; } |
| 31 const GrAttribute* inColor() const { return fInColor; } | 32 const GrAttribute* inColor() const { return fInColor; } |
| 32 const GrAttribute* inLocalCoords() const { return fInLocalCoords; } | 33 const GrAttribute* inLocalCoords() const { return fInLocalCoords; } |
| 33 const GrAttribute* inCoverage() const { return fInCoverage; } | 34 const GrAttribute* inCoverage() const { return fInCoverage; } |
| 34 | 35 |
| 35 class GLProcessor : public GrGLGeometryProcessor { | 36 class GLProcessor : public GrGLGeometryProcessor { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 const GrGLCaps& caps, | 89 const GrGLCaps& caps, |
| 89 GrProcessorKeyBuilder* b) const SK_OVERRIDE { | 90 GrProcessorKeyBuilder* b) const SK_OVERRIDE { |
| 90 GLProcessor::GenKey(*this, bt, caps, b); | 91 GLProcessor::GenKey(*this, bt, caps, b); |
| 91 } | 92 } |
| 92 | 93 |
| 93 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE { | 94 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co
nst SK_OVERRIDE { |
| 94 return SkNEW_ARGS(GLProcessor, (*this, bt)); | 95 return SkNEW_ARGS(GLProcessor, (*this, bt)); |
| 95 } | 96 } |
| 96 | 97 |
| 97 private: | 98 private: |
| 98 DefaultGeoProc(GrColor color, uint8_t coverage, uint32_t gpTypeFlags) | 99 DefaultGeoProc(GrColor color, uint8_t coverage, uint32_t gpTypeFlags, bool o
paqueVertexColors) |
| 99 : INHERITED(color, coverage) | 100 : INHERITED(color, opaqueVertexColors, coverage) |
| 100 , fInPosition(NULL) | 101 , fInPosition(NULL) |
| 101 , fInColor(NULL) | 102 , fInColor(NULL) |
| 102 , fInLocalCoords(NULL) | 103 , fInLocalCoords(NULL) |
| 103 , fInCoverage(NULL) | 104 , fInCoverage(NULL) |
| 104 , fFlags(gpTypeFlags) { | 105 , fFlags(gpTypeFlags) { |
| 105 this->initClassID<DefaultGeoProc>(); | 106 this->initClassID<DefaultGeoProc>(); |
| 106 bool hasColor = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kColor_G
PType); | 107 bool hasColor = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kColor_G
PType); |
| 107 bool hasLocalCoord = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kLo
calCoord_GPType); | 108 bool hasLocalCoord = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kLo
calCoord_GPType); |
| 108 bool hasCoverage = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kCove
rage_GPType); | 109 bool hasCoverage = SkToBool(gpTypeFlags & GrDefaultGeoProcFactory::kCove
rage_GPType); |
| 109 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); | 110 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 121 kFloat_GrVertexAttr
ibType)); | 122 kFloat_GrVertexAttr
ibType)); |
| 122 this->setHasVertexCoverage(); | 123 this->setHasVertexCoverage(); |
| 123 } | 124 } |
| 124 } | 125 } |
| 125 | 126 |
| 126 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { | 127 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { |
| 127 const DefaultGeoProc& gp = other.cast<DefaultGeoProc>(); | 128 const DefaultGeoProc& gp = other.cast<DefaultGeoProc>(); |
| 128 return gp.fFlags == this->fFlags; | 129 return gp.fFlags == this->fFlags; |
| 129 } | 130 } |
| 130 | 131 |
| 131 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE { | 132 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const
SK_OVERRIDE { |
| 132 if (fInCoverage) { | 133 if (fInCoverage) { |
| 133 inout->mulByUnknownAlpha(); | 134 out->setUnknownSingleComponent(); |
| 134 } else { | 135 } else { |
| 135 inout->mulByKnownAlpha(255); | 136 // uniform coverage |
| 137 out->setKnownSingleComponent(this->coverage()); |
| 136 } | 138 } |
| 137 } | 139 } |
| 138 | 140 |
| 139 const GrAttribute* fInPosition; | 141 const GrAttribute* fInPosition; |
| 140 const GrAttribute* fInColor; | 142 const GrAttribute* fInColor; |
| 141 const GrAttribute* fInLocalCoords; | 143 const GrAttribute* fInLocalCoords; |
| 142 const GrAttribute* fInCoverage; | 144 const GrAttribute* fInCoverage; |
| 143 uint32_t fFlags; | 145 uint32_t fFlags; |
| 144 | 146 |
| 145 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 147 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 157 if (random->nextBool()) { | 159 if (random->nextBool()) { |
| 158 flags |= GrDefaultGeoProcFactory::kColor_GPType; | 160 flags |= GrDefaultGeoProcFactory::kColor_GPType; |
| 159 } | 161 } |
| 160 if (random->nextBool()) { | 162 if (random->nextBool()) { |
| 161 flags |= GrDefaultGeoProcFactory::kCoverage_GPType; | 163 flags |= GrDefaultGeoProcFactory::kCoverage_GPType; |
| 162 } | 164 } |
| 163 if (random->nextBool()) { | 165 if (random->nextBool()) { |
| 164 flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType; | 166 flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType; |
| 165 } | 167 } |
| 166 | 168 |
| 167 return DefaultGeoProc::Create(GrRandomColor(random), GrRandomCoverage(random
), flags); | 169 return DefaultGeoProc::Create(GrRandomColor(random), GrRandomCoverage(random
), |
| 170 flags, random->nextBool()); |
| 168 } | 171 } |
| 169 | 172 |
| 170 const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(GrColor color, uint32
_t gpTypeFlags, | 173 const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(GrColor color, |
| 174 uint32_t gpTypeFlags, |
| 175 bool opaqueVertexColo
rs, |
| 171 uint8_t coverage) { | 176 uint8_t coverage) { |
| 172 return DefaultGeoProc::Create(color, coverage, gpTypeFlags); | 177 return DefaultGeoProc::Create(color, coverage, gpTypeFlags, opaqueVertexColo
rs); |
| 173 } | 178 } |
| OLD | NEW |