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

Side by Side Diff: src/gpu/GrDefaultGeoProcFactory.cpp

Issue 746423007: Draft change to start pulling uniform color into GP (Closed) Base URL: https://skia.googlesource.com/skia.git@no_factories
Patch Set: Created 6 years 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 | « no previous file | src/gpu/GrGeometryProcessor.h » ('j') | src/gpu/GrOptDrawState.cpp » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 } 61 }
62 } 62 }
63 63
64 virtual const char* name() const SK_OVERRIDE { return "DefaultGeometryProces sor"; } 64 virtual const char* name() const SK_OVERRIDE { return "DefaultGeometryProces sor"; }
65 65
66 const GrAttribute* inPosition() const { return fInPosition; } 66 const GrAttribute* inPosition() const { return fInPosition; }
67 const GrAttribute* inColor() const { return fInColor; } 67 const GrAttribute* inColor() const { return fInColor; }
68 const GrAttribute* inLocalCoords() const { return fInLocalCoords; } 68 const GrAttribute* inLocalCoords() const { return fInLocalCoords; }
69 const GrAttribute* inCoverage() const { return fInCoverage; } 69 const GrAttribute* inCoverage() const { return fInCoverage; }
70 70
71 struct BatchTracker {
bsalomon 2014/12/05 14:43:03 can this be private?
72 Output fOutputColor;
73 Output fOutputCoverage;
74 GrColor fColor;
75 GrColor fCoverage;
76 };
77
78 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR IDE {
79 BatchTracker* local = bt->cast<BatchTracker>();
80
81 // We will ignore this color unless we have uniform color
82 local->fColor = init.fColor;
83 local->fOutputColor = GetColorOutputType(init, SkToBool(fInColor));
84
85 bool hasVertexCoverage = init.fOutputCoverage && fInCoverage && !init.fR emoveCoverageAttr;
86 bool covIsSolidWhite = !hasVertexCoverage && 0xffffffff == init.fCoverag e;
87 if (covIsSolidWhite || !init.fOutputCoverage) {
88 local->fOutputCoverage = kAllOnes_Output;
89 } else if (!hasVertexCoverage) {
90 local->fOutputCoverage = kUniform_Output;
91 local->fCoverage = init.fCoverage;
92 } else {
93 SkASSERT(fInCoverage);
94 local->fOutputCoverage = kAttribute_Output;
95 }
96 }
97
98 virtual bool canBatch(const GrBatchTracker& l, const GrBatchTracker& r) cons t SK_OVERRIDE {
99 const BatchTracker& left = l.cast<BatchTracker>();
100 const BatchTracker& right = r.cast<BatchTracker>();
101 bool sameColors = ((left.fOutputColor == kAttribute_Output &&
bsalomon 2014/12/05 14:43:03 I think this might be a little easier to read with
102 right.fOutputColor == kAttribute_Output) ||
103 (left.fOutputColor != kAttribute_Output &&
104 right.fOutputColor != kAttribute_Output &&
105 left.fColor == right.fColor));
106 if (!sameColors) {
107 return false;
108 }
109
110 bool sameCoverage = ((left.fOutputCoverage == kAttribute_Output &&
111 right.fOutputCoverage == kAttribute_Output) ||
112 (left.fOutputCoverage != kAttribute_Output &&
113 right.fOutputCoverage != kAttribute_Output &&
114 left.fCoverage == right.fCoverage));
115 if (!sameCoverage) {
116 return false;
117 }
118 return true;
119 }
120
71 class GLProcessor : public GrGLGeometryProcessor { 121 class GLProcessor : public GrGLGeometryProcessor {
72 public: 122 public:
73 GLProcessor(const GrGeometryProcessor&, 123 GLProcessor(const GrGeometryProcessor&, const GrBatchTracker&) {}
74 const GrBatchTracker&) {}
75 124
76 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { 125 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
77 const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>(); 126 const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>();
78 GrGLVertexBuilder* vs = args.fPB->getVertexShaderBuilder(); 127 GrGLGPBuilder* pb = args.fPB;
128 GrGLVertexBuilder* vs = pb->getVertexShaderBuilder();
129 GrGLGPFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder();
130 const BatchTracker& local = args.fBT.cast<BatchTracker>();
79 131
80 vs->codeAppendf("%s = %s;", vs->positionCoords(), gp.inPosition()->f Name); 132 vs->codeAppendf("%s = %s;", vs->positionCoords(), gp.inPosition()->f Name);
81 133
82 // Setup pass through color 134 // Setup pass through color
83 if (gp.inColor()) { 135 if (kUniform_Output == local.fOutputColor) {
136 const char* fragColor;
137 fColorUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Vis ibility,
138 kVec4f_GrSLType,
139 "Color",
140 &fragColor);
141 fs->codeAppendf("%s = %s;", args.fOutputColor, fragColor);
142 } else if (kAttribute_Output == local.fOutputColor) {
143 SkASSERT(gp.inColor());
84 args.fPB->addPassThroughAttribute(gp.inColor(), args.fOutputColo r); 144 args.fPB->addPassThroughAttribute(gp.inColor(), args.fOutputColo r);
145 } else {
146 fs->codeAppendf("%s = vec4(1);", args.fOutputColor);
85 } 147 }
86 148
87 // Setup local coords if needed 149 // Setup local coords if needed
88 if (gp.inLocalCoords()) { 150 if (gp.inLocalCoords()) {
89 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inLocalCoords( )->fName); 151 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inLocalCoords( )->fName);
90 } else { 152 } else {
91 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inPosition()-> fName); 153 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inPosition()-> fName);
92 } 154 }
93 155
94 // setup position varying 156 // setup position varying
95 vs->codeAppendf("%s = %s * vec3(%s, 1);", vs->glPosition(), vs->uVie wM(), 157 vs->codeAppendf("%s = %s * vec3(%s, 1);", vs->glPosition(), vs->uVie wM(),
96 gp.inPosition()->fName); 158 gp.inPosition()->fName);
97 159
98 // Setup coverage as pass through 160 // Setup coverage as pass through
99 GrGLGPFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); 161 if (kUniform_Output == local.fOutputCoverage) {
100 fs->codeAppendf("float alpha = 1.0;"); 162 const char* fragCoverage;
101 if (gp.inCoverage()) { 163 fCoverageUniform = pb->addUniform(GrGLProgramBuilder::kFragment_ Visibility,
164 kFloat_GrSLType,
165 "Coverage",
166 &fragCoverage);
167 fs->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCove rage);
168 } else if (kAttribute_Output == local.fOutputCoverage) {
169 SkASSERT(gp.inCoverage());
170 fs->codeAppendf("float alpha = 1.0;");
102 args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha"); 171 args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha");
172 fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage);
173 } else {
174 fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage);
103 } 175 }
104 fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage);
105 } 176 }
106 177
107 static inline void GenKey(const GrGeometryProcessor& gp, 178 static inline void GenKey(const GrGeometryProcessor& gp,
108 const GrBatchTracker&, 179 const GrBatchTracker& bt,
109 const GrGLCaps&, 180 const GrGLCaps&,
110 GrProcessorKeyBuilder* b) { 181 GrProcessorKeyBuilder* b) {
111 const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); 182 const DefaultGeoProc& def = gp.cast<DefaultGeoProc>();
112 b->add32(def.fFlags); 183 b->add32(def.fFlags);
184
185 const BatchTracker& local = bt.cast<BatchTracker>();
186 b->add32(local.fOutputColor | local.fOutputCoverage << 16);
113 } 187 }
114 188
115 virtual void setData(const GrGLProgramDataManager&, 189 virtual void setData(const GrGLProgramDataManager& pdman,
116 const GrGeometryProcessor&, 190 const GrGeometryProcessor& gp,
117 const GrBatchTracker&) SK_OVERRIDE {} 191 const GrBatchTracker& bt) SK_OVERRIDE {
192 const BatchTracker& local = bt.cast<BatchTracker>();
193 if (kUniform_Output == local.fOutputColor) {
194 GrGLfloat c[4];
195 GrColorToRGBAFloat(local.fColor, c);
196 pdman.set4fv(fColorUniform, 1, c);
197 }
198 if (kUniform_Output == local.fOutputCoverage) {
199 pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(local.fCove rage));
200 }
201 }
118 202
119 private: 203 private:
204 UniformHandle fColorUniform;
205 UniformHandle fCoverageUniform;
206
120 typedef GrGLGeometryProcessor INHERITED; 207 typedef GrGLGeometryProcessor INHERITED;
121 }; 208 };
122 209
123 virtual void getGLProcessorKey(const GrBatchTracker& bt, 210 virtual void getGLProcessorKey(const GrBatchTracker& bt,
124 const GrGLCaps& caps, 211 const GrGLCaps& caps,
125 GrProcessorKeyBuilder* b) const SK_OVERRIDE { 212 GrProcessorKeyBuilder* b) const SK_OVERRIDE {
126 GLProcessor::GenKey(*this, bt, caps, b); 213 GLProcessor::GenKey(*this, bt, caps, b);
127 } 214 }
128 215
129 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co nst SK_OVERRIDE { 216 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co nst SK_OVERRIDE {
(...skipping 19 matching lines...) Expand all
149 if (hasLocalCoord) { 236 if (hasLocalCoord) {
150 fInLocalCoords = &this->addVertexAttrib(GrAttribute("inLocalCoord", 237 fInLocalCoords = &this->addVertexAttrib(GrAttribute("inLocalCoord",
151 kVec2f_GrVertexA ttribType)); 238 kVec2f_GrVertexA ttribType));
152 this->setHasLocalCoords(); 239 this->setHasLocalCoords();
153 } 240 }
154 if (hasCoverage) { 241 if (hasCoverage) {
155 fInCoverage = &this->addVertexAttrib(GrAttribute("inCoverage", 242 fInCoverage = &this->addVertexAttrib(GrAttribute("inCoverage",
156 kFloat_GrVertexAttr ibType)); 243 kFloat_GrVertexAttr ibType));
157 this->setHasVertexCoverage(); 244 this->setHasVertexCoverage();
158 } 245 }
246 fNewStyle = true;
bsalomon 2014/12/05 14:43:03 ?
159 } 247 }
160 248
161 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { 249 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE {
162 const DefaultGeoProc& gp = other.cast<DefaultGeoProc>(); 250 const DefaultGeoProc& gp = other.cast<DefaultGeoProc>();
163 return gp.fFlags == this->fFlags; 251 return gp.fFlags == this->fFlags;
164 } 252 }
165 253
166 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE RRIDE { 254 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE RRIDE {
167 if (fInCoverage) { 255 if (fInCoverage) {
168 inout->mulByUnknownAlpha(); 256 inout->mulByUnknownAlpha();
(...skipping 29 matching lines...) Expand all
198 if (random->nextBool()) { 286 if (random->nextBool()) {
199 flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType; 287 flags |= GrDefaultGeoProcFactory::kLocalCoord_GPType;
200 } 288 }
201 289
202 return DefaultGeoProc::Create(flags); 290 return DefaultGeoProc::Create(flags);
203 } 291 }
204 292
205 const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(uint32_t gpTypeFlags) { 293 const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(uint32_t gpTypeFlags) {
206 return DefaultGeoProc::Create(gpTypeFlags); 294 return DefaultGeoProc::Create(gpTypeFlags);
207 } 295 }
OLDNEW
« no previous file with comments | « no previous file | src/gpu/GrGeometryProcessor.h » ('j') | src/gpu/GrOptDrawState.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698