Chromium Code Reviews| 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" |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 25 return SkNEW_ARGS(DefaultGeoProc, (color, coverage, gpTypeFlags)); | 25 return SkNEW_ARGS(DefaultGeoProc, (color, coverage, gpTypeFlags)); |
| 26 } | 26 } |
| 27 | 27 |
| 28 virtual const char* name() const SK_OVERRIDE { return "DefaultGeometryProces sor"; } | 28 virtual const char* name() const SK_OVERRIDE { return "DefaultGeometryProces sor"; } |
| 29 | 29 |
| 30 const GrAttribute* inPosition() const { return fInPosition; } | 30 const GrAttribute* inPosition() const { return fInPosition; } |
| 31 const GrAttribute* inColor() const { return fInColor; } | 31 const GrAttribute* inColor() const { return fInColor; } |
| 32 const GrAttribute* inLocalCoords() const { return fInLocalCoords; } | 32 const GrAttribute* inLocalCoords() const { return fInLocalCoords; } |
| 33 const GrAttribute* inCoverage() const { return fInCoverage; } | 33 const GrAttribute* inCoverage() const { return fInCoverage; } |
| 34 | 34 |
| 35 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR IDE { | |
| 36 BatchTracker* local = bt->cast<BatchTracker>(); | |
| 37 | |
| 38 // We will ignore this color unless we have uniform color | |
| 39 local->fColor = init.fColor; | |
| 40 local->fOutputColor = GetColorOutputType(init, SkToBool(fInColor)); | |
| 41 | |
| 42 bool hasVertexCoverage = init.fOutputCoverage && fInCoverage && !init.fR emoveCoverageAttr; | |
| 43 bool covIsSolidWhite = !hasVertexCoverage && 0xffffffff == init.fCoverag e; | |
| 44 if (covIsSolidWhite || !init.fOutputCoverage) { | |
| 45 local->fOutputCoverage = kAllOnes_Output; | |
| 46 } else if (!hasVertexCoverage) { | |
| 47 local->fOutputCoverage = kUniform_Output; | |
| 48 local->fCoverage = init.fCoverage; | |
| 49 } else { | |
| 50 SkASSERT(fInCoverage); | |
| 51 local->fOutputCoverage = kAttribute_Output; | |
| 52 } | |
| 53 } | |
| 54 | |
| 55 virtual bool canBatch(const GrBatchTracker& l, const GrBatchTracker& r) cons t SK_OVERRIDE { | |
| 56 const BatchTracker& left = l.cast<BatchTracker>(); | |
| 57 const BatchTracker& right = r.cast<BatchTracker>(); | |
| 58 if (left.fOutputColor != right.fOutputColor) { | |
| 59 return false; | |
| 60 } | |
| 61 | |
| 62 if (kAttribute_Output != left.fOutputColor && left.fColor != right.fColo r) { | |
|
bsalomon
2014/12/10 18:36:20
need these comparisons for coverage too? also seem
| |
| 63 return false; | |
| 64 } | |
| 65 | |
| 66 return true; | |
| 67 } | |
| 68 | |
| 35 class GLProcessor : public GrGLGeometryProcessor { | 69 class GLProcessor : public GrGLGeometryProcessor { |
| 36 public: | 70 public: |
| 37 GLProcessor(const GrGeometryProcessor&, | 71 GLProcessor(const GrGeometryProcessor&, const GrBatchTracker&) {} |
| 38 const GrBatchTracker&) {} | |
| 39 | 72 |
| 40 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 73 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
| 41 const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>(); | 74 const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>(); |
| 42 GrGLVertexBuilder* vs = args.fPB->getVertexShaderBuilder(); | 75 GrGLGPBuilder* pb = args.fPB; |
| 76 GrGLVertexBuilder* vs = pb->getVertexShaderBuilder(); | |
| 77 GrGLGPFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); | |
| 78 const BatchTracker& local = args.fBT.cast<BatchTracker>(); | |
| 43 | 79 |
| 44 vs->codeAppendf("%s = %s;", vs->positionCoords(), gp.inPosition()->f Name); | 80 vs->codeAppendf("%s = %s;", vs->positionCoords(), gp.inPosition()->f Name); |
| 45 | 81 |
| 46 // Setup pass through color | 82 // Setup pass through color |
| 47 if (gp.inColor()) { | 83 if (kUniform_Output == local.fOutputColor) { |
| 84 const char* fragColor; | |
| 85 fColorUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Vis ibility, | |
| 86 kVec4f_GrSLType, | |
| 87 kDefault_GrSLPrecision, | |
| 88 "Color", | |
| 89 &fragColor); | |
| 90 fs->codeAppendf("%s = %s;", args.fOutputColor, fragColor); | |
| 91 } else if (kAttribute_Output == local.fOutputColor) { | |
| 92 SkASSERT(gp.inColor()); | |
| 48 args.fPB->addPassThroughAttribute(gp.inColor(), args.fOutputColo r); | 93 args.fPB->addPassThroughAttribute(gp.inColor(), args.fOutputColo r); |
| 94 } else { | |
| 95 fs->codeAppendf("%s = vec4(1);", args.fOutputColor); | |
| 49 } | 96 } |
| 50 | 97 |
| 51 // Setup local coords if needed | 98 // Setup local coords if needed |
| 52 if (gp.inLocalCoords()) { | 99 if (gp.inLocalCoords()) { |
| 53 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inLocalCoords( )->fName); | 100 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inLocalCoords( )->fName); |
| 54 } else { | 101 } else { |
| 55 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inPosition()-> fName); | 102 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inPosition()-> fName); |
| 56 } | 103 } |
| 57 | 104 |
| 58 // setup position varying | 105 // setup position varying |
| 59 vs->codeAppendf("%s = %s * vec3(%s, 1);", vs->glPosition(), vs->uVie wM(), | 106 vs->codeAppendf("%s = %s * vec3(%s, 1);", vs->glPosition(), vs->uVie wM(), |
| 60 gp.inPosition()->fName); | 107 gp.inPosition()->fName); |
| 61 | 108 |
| 62 // Setup coverage as pass through | 109 // Setup coverage as pass through |
| 63 GrGLGPFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); | 110 if (kUniform_Output == local.fOutputCoverage) { |
| 64 fs->codeAppendf("float alpha = 1.0;"); | 111 const char* fragCoverage; |
| 65 if (gp.inCoverage()) { | 112 fCoverageUniform = pb->addUniform(GrGLProgramBuilder::kFragment_ Visibility, |
| 113 kFloat_GrSLType, | |
| 114 kDefault_GrSLPrecision, | |
| 115 "Coverage", | |
| 116 &fragCoverage); | |
| 117 fs->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCove rage); | |
| 118 } else if (kAttribute_Output == local.fOutputCoverage) { | |
| 119 SkASSERT(gp.inCoverage()); | |
| 120 fs->codeAppendf("float alpha = 1.0;"); | |
| 66 args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha"); | 121 args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha"); |
| 122 fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); | |
| 123 } else { | |
| 124 fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage); | |
| 67 } | 125 } |
| 68 fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); | |
| 69 } | 126 } |
| 70 | 127 |
| 71 static inline void GenKey(const GrGeometryProcessor& gp, | 128 static inline void GenKey(const GrGeometryProcessor& gp, |
| 72 const GrBatchTracker&, | 129 const GrBatchTracker& bt, |
| 73 const GrGLCaps&, | 130 const GrGLCaps&, |
| 74 GrProcessorKeyBuilder* b) { | 131 GrProcessorKeyBuilder* b) { |
| 75 const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); | 132 const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); |
| 76 b->add32(def.fFlags); | 133 b->add32(def.fFlags); |
| 134 | |
| 135 const BatchTracker& local = bt.cast<BatchTracker>(); | |
| 136 b->add32(local.fOutputColor | local.fOutputCoverage << 16); | |
| 77 } | 137 } |
| 78 | 138 |
| 79 virtual void setData(const GrGLProgramDataManager&, | 139 virtual void setData(const GrGLProgramDataManager& pdman, |
| 80 const GrGeometryProcessor&, | 140 const GrGeometryProcessor& gp, |
| 81 const GrBatchTracker&) SK_OVERRIDE {} | 141 const GrBatchTracker& bt) SK_OVERRIDE { |
| 142 const BatchTracker& local = bt.cast<BatchTracker>(); | |
| 143 if (kUniform_Output == local.fOutputColor) { | |
|
bsalomon
2014/12/10 18:36:20
I wonder whether we should be skipping uni uploads
| |
| 144 GrGLfloat c[4]; | |
| 145 GrColorToRGBAFloat(local.fColor, c); | |
| 146 pdman.set4fv(fColorUniform, 1, c); | |
| 147 } | |
| 148 if (kUniform_Output == local.fOutputCoverage) { | |
| 149 pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(local.fCove rage)); | |
| 150 } | |
| 151 } | |
| 82 | 152 |
| 83 private: | 153 private: |
| 154 UniformHandle fColorUniform; | |
| 155 UniformHandle fCoverageUniform; | |
| 156 | |
| 84 typedef GrGLGeometryProcessor INHERITED; | 157 typedef GrGLGeometryProcessor INHERITED; |
| 85 }; | 158 }; |
| 86 | 159 |
| 87 virtual void getGLProcessorKey(const GrBatchTracker& bt, | 160 virtual void getGLProcessorKey(const GrBatchTracker& bt, |
| 88 const GrGLCaps& caps, | 161 const GrGLCaps& caps, |
| 89 GrProcessorKeyBuilder* b) const SK_OVERRIDE { | 162 GrProcessorKeyBuilder* b) const SK_OVERRIDE { |
| 90 GLProcessor::GenKey(*this, bt, caps, b); | 163 GLProcessor::GenKey(*this, bt, caps, b); |
| 91 } | 164 } |
| 92 | 165 |
| 93 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co nst SK_OVERRIDE { | 166 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co nst SK_OVERRIDE { |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 114 if (hasLocalCoord) { | 187 if (hasLocalCoord) { |
| 115 fInLocalCoords = &this->addVertexAttrib(GrAttribute("inLocalCoord", | 188 fInLocalCoords = &this->addVertexAttrib(GrAttribute("inLocalCoord", |
| 116 kVec2f_GrVertexA ttribType)); | 189 kVec2f_GrVertexA ttribType)); |
| 117 this->setHasLocalCoords(); | 190 this->setHasLocalCoords(); |
| 118 } | 191 } |
| 119 if (hasCoverage) { | 192 if (hasCoverage) { |
| 120 fInCoverage = &this->addVertexAttrib(GrAttribute("inCoverage", | 193 fInCoverage = &this->addVertexAttrib(GrAttribute("inCoverage", |
| 121 kFloat_GrVertexAttr ibType)); | 194 kFloat_GrVertexAttr ibType)); |
| 122 this->setHasVertexCoverage(); | 195 this->setHasVertexCoverage(); |
| 123 } | 196 } |
| 197 fNewStyle = true; | |
| 124 } | 198 } |
| 125 | 199 |
| 126 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { | 200 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { |
| 127 const DefaultGeoProc& gp = other.cast<DefaultGeoProc>(); | 201 const DefaultGeoProc& gp = other.cast<DefaultGeoProc>(); |
| 128 return gp.fFlags == this->fFlags; | 202 return gp.fFlags == this->fFlags; |
| 129 } | 203 } |
| 130 | 204 |
| 131 virtual void onGetOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRI DE { | 205 virtual void onGetOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRI DE { |
| 132 if (fInCoverage) { | 206 if (fInCoverage) { |
| 133 out->setUnknownSingleComponent(); | 207 out->setUnknownSingleComponent(); |
| 134 } else { | 208 } else { |
| 135 // uniform coverage | 209 // uniform coverage |
| 136 out->setKnownSingleComponent(this->coverage()); | 210 out->setKnownSingleComponent(this->coverage()); |
| 137 } | 211 } |
| 138 } | 212 } |
| 139 | 213 |
| 214 struct BatchTracker { | |
| 215 Output fOutputColor; | |
|
bsalomon
2014/12/10 18:36:20
The names of these vars and enum don't seem right
| |
| 216 Output fOutputCoverage; | |
| 217 GrColor fColor; | |
| 218 GrColor fCoverage; | |
| 219 }; | |
| 220 | |
| 140 const GrAttribute* fInPosition; | 221 const GrAttribute* fInPosition; |
| 141 const GrAttribute* fInColor; | 222 const GrAttribute* fInColor; |
| 142 const GrAttribute* fInLocalCoords; | 223 const GrAttribute* fInLocalCoords; |
| 143 const GrAttribute* fInCoverage; | 224 const GrAttribute* fInCoverage; |
| 144 uint32_t fFlags; | 225 uint32_t fFlags; |
| 145 | 226 |
| 146 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 227 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
| 147 | 228 |
| 148 typedef GrGeometryProcessor INHERITED; | 229 typedef GrGeometryProcessor INHERITED; |
| 149 }; | 230 }; |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 165 flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType; | 246 flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType; |
| 166 } | 247 } |
| 167 | 248 |
| 168 return DefaultGeoProc::Create(GrRandomColor(random), GrRandomCoverage(random ), flags); | 249 return DefaultGeoProc::Create(GrRandomColor(random), GrRandomCoverage(random ), flags); |
| 169 } | 250 } |
| 170 | 251 |
| 171 const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(GrColor color, uint32 _t gpTypeFlags, | 252 const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(GrColor color, uint32 _t gpTypeFlags, |
| 172 uint8_t coverage) { | 253 uint8_t coverage) { |
| 173 return DefaultGeoProc::Create(color, coverage, gpTypeFlags); | 254 return DefaultGeoProc::Create(color, coverage, gpTypeFlags); |
| 174 } | 255 } |
| OLD | NEW |