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

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: feedback incorporated 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/GrGeometryProcessor.h » ('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 14 matching lines...) Expand all
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | src/gpu/GrGeometryProcessor.h » ('j') | src/gpu/GrGeometryProcessor.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698