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

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: cleanup 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
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 15 matching lines...) Expand all
26 return SkNEW_ARGS(DefaultGeoProc, (color, coverage, gpTypeFlags, opaqueV ertexColors)); 26 return SkNEW_ARGS(DefaultGeoProc, (color, coverage, gpTypeFlags, opaqueV ertexColors));
27 } 27 }
28 28
29 virtual const char* name() const SK_OVERRIDE { return "DefaultGeometryProces sor"; } 29 virtual const char* name() const SK_OVERRIDE { return "DefaultGeometryProces sor"; }
30 30
31 const GrAttribute* inPosition() const { return fInPosition; } 31 const GrAttribute* inPosition() const { return fInPosition; }
32 const GrAttribute* inColor() const { return fInColor; } 32 const GrAttribute* inColor() const { return fInColor; }
33 const GrAttribute* inLocalCoords() const { return fInLocalCoords; } 33 const GrAttribute* inLocalCoords() const { return fInLocalCoords; }
34 const GrAttribute* inCoverage() const { return fInCoverage; } 34 const GrAttribute* inCoverage() const { return fInCoverage; }
35 35
36 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR IDE {
37 BatchTracker* local = bt->cast<BatchTracker>();
38
39 // We will ignore this color unless we have uniform color
40 local->fColor = init.fColor;
41 local->fInputColorType = GetColorInputType(init, SkToBool(fInColor));
42
43 bool hasVertexCoverage = init.fOutputCoverage && fInCoverage && !init.fR emoveCoverageAttr;
44 bool covIsSolidWhite = !hasVertexCoverage && 0xffffffff == init.fCoverag e;
45 if (covIsSolidWhite || !init.fOutputCoverage) {
46 local->fInputCoverageType = kAllOnes_GPInput;
47 } else if (!hasVertexCoverage) {
48 local->fInputCoverageType = kUniform_GPInput;
49 local->fCoverage = init.fCoverage;
50 } else {
51 SkASSERT(fInCoverage);
52 local->fInputCoverageType = kAttribute_GPInput;
53 }
54 }
55
56 bool onCanBatch(const GrBatchTracker& l, const GrBatchTracker& r) const SK_O VERRIDE {
57 const BatchTracker& left = l.cast<BatchTracker>();
58 const BatchTracker& right = r.cast<BatchTracker>();
59 return CanCombineOutput(left.fInputColorType, left.fColor,
60 right.fInputColorType, right.fColor) &&
61 CanCombineOutput(left.fInputCoverageType, left.fCoverage,
62 right.fInputCoverageType, right.fCoverage);
63 }
64
36 class GLProcessor : public GrGLGeometryProcessor { 65 class GLProcessor : public GrGLGeometryProcessor {
37 public: 66 public:
38 GLProcessor(const GrGeometryProcessor&, 67 GLProcessor(const GrGeometryProcessor&, const GrBatchTracker&) {}
39 const GrBatchTracker&) {}
40 68
41 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { 69 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
42 const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>(); 70 const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>();
43 GrGLVertexBuilder* vs = args.fPB->getVertexShaderBuilder(); 71 GrGLGPBuilder* pb = args.fPB;
72 GrGLVertexBuilder* vs = pb->getVertexShaderBuilder();
73 GrGLGPFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder();
74 const BatchTracker& local = args.fBT.cast<BatchTracker>();
44 75
45 vs->codeAppendf("%s = %s;", vs->positionCoords(), gp.inPosition()->f Name); 76 vs->codeAppendf("%s = %s;", vs->positionCoords(), gp.inPosition()->f Name);
46 77
47 // Setup pass through color 78 // Setup pass through color
48 if (gp.inColor()) { 79 this->setupColor(pb, local.fInputColorType, args.fOutputColor, gp.in Color(),
49 args.fPB->addPassThroughAttribute(gp.inColor(), args.fOutputColo r); 80 &fColorUniform);
50 }
51 81
52 // Setup local coords if needed 82 // Setup local coords if needed
53 if (gp.inLocalCoords()) { 83 if (gp.inLocalCoords()) {
54 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inLocalCoords( )->fName); 84 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inLocalCoords( )->fName);
55 } else { 85 } else {
56 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inPosition()-> fName); 86 vs->codeAppendf("%s = %s;", vs->localCoords(), gp.inPosition()-> fName);
57 } 87 }
58 88
59 // setup position varying 89 // setup position varying
60 vs->codeAppendf("%s = %s * vec3(%s, 1);", vs->glPosition(), vs->uVie wM(), 90 vs->codeAppendf("%s = %s * vec3(%s, 1);", vs->glPosition(), vs->uVie wM(),
61 gp.inPosition()->fName); 91 gp.inPosition()->fName);
62 92
63 // Setup coverage as pass through 93 // Setup coverage as pass through
64 GrGLGPFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); 94 if (kUniform_GPInput == local.fInputCoverageType) {
65 fs->codeAppendf("float alpha = 1.0;"); 95 const char* fragCoverage;
66 if (gp.inCoverage()) { 96 fCoverageUniform = pb->addUniform(GrGLProgramBuilder::kFragment_ Visibility,
97 kFloat_GrSLType,
98 kDefault_GrSLPrecision,
99 "Coverage",
100 &fragCoverage);
101 fs->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, fragCove rage);
102 } else if (kAttribute_GPInput == local.fInputCoverageType) {
103 SkASSERT(gp.inCoverage());
104 fs->codeAppendf("float alpha = 1.0;");
67 args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha"); 105 args.fPB->addPassThroughAttribute(gp.inCoverage(), "alpha");
106 fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage);
107 } else {
108 fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage);
68 } 109 }
69 fs->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage);
70 } 110 }
71 111
72 static inline void GenKey(const GrGeometryProcessor& gp, 112 static inline void GenKey(const GrGeometryProcessor& gp,
73 const GrBatchTracker&, 113 const GrBatchTracker& bt,
74 const GrGLCaps&, 114 const GrGLCaps&,
75 GrProcessorKeyBuilder* b) { 115 GrProcessorKeyBuilder* b) {
76 const DefaultGeoProc& def = gp.cast<DefaultGeoProc>(); 116 const DefaultGeoProc& def = gp.cast<DefaultGeoProc>();
77 b->add32(def.fFlags); 117 b->add32(def.fFlags);
118
119 const BatchTracker& local = bt.cast<BatchTracker>();
120 b->add32(local.fInputColorType | local.fInputCoverageType << 16);
78 } 121 }
79 122
80 virtual void setData(const GrGLProgramDataManager&, 123 virtual void setData(const GrGLProgramDataManager& pdman,
81 const GrGeometryProcessor&, 124 const GrGeometryProcessor& gp,
82 const GrBatchTracker&) SK_OVERRIDE {} 125 const GrBatchTracker& bt) SK_OVERRIDE {
126 const BatchTracker& local = bt.cast<BatchTracker>();
127 this->setUniformColorIfRequired(pdman, local.fInputColorType, local. fColor,
128 fColorUniform);
129 if (kUniform_GPInput == local.fInputCoverageType) {
130 pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(local.fCove rage));
131 }
132 }
83 133
84 private: 134 private:
135 UniformHandle fColorUniform;
136 UniformHandle fCoverageUniform;
137
85 typedef GrGLGeometryProcessor INHERITED; 138 typedef GrGLGeometryProcessor INHERITED;
86 }; 139 };
87 140
88 virtual void getGLProcessorKey(const GrBatchTracker& bt, 141 virtual void getGLProcessorKey(const GrBatchTracker& bt,
89 const GrGLCaps& caps, 142 const GrGLCaps& caps,
90 GrProcessorKeyBuilder* b) const SK_OVERRIDE { 143 GrProcessorKeyBuilder* b) const SK_OVERRIDE {
91 GLProcessor::GenKey(*this, bt, caps, b); 144 GLProcessor::GenKey(*this, bt, caps, b);
92 } 145 }
93 146
94 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co nst SK_OVERRIDE { 147 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co nst SK_OVERRIDE {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 184
132 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE { 185 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE {
133 if (fInCoverage) { 186 if (fInCoverage) {
134 out->setUnknownSingleComponent(); 187 out->setUnknownSingleComponent();
135 } else { 188 } else {
136 // uniform coverage 189 // uniform coverage
137 out->setKnownSingleComponent(this->coverage()); 190 out->setKnownSingleComponent(this->coverage());
138 } 191 }
139 } 192 }
140 193
194 struct BatchTracker {
195 GPInput fInputColorType;
196 GPInput fInputCoverageType;
197 GrColor fColor;
198 GrColor fCoverage;
199 };
200
141 const GrAttribute* fInPosition; 201 const GrAttribute* fInPosition;
142 const GrAttribute* fInColor; 202 const GrAttribute* fInColor;
143 const GrAttribute* fInLocalCoords; 203 const GrAttribute* fInLocalCoords;
144 const GrAttribute* fInCoverage; 204 const GrAttribute* fInCoverage;
145 uint32_t fFlags; 205 uint32_t fFlags;
146 206
147 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; 207 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
148 208
149 typedef GrGeometryProcessor INHERITED; 209 typedef GrGeometryProcessor INHERITED;
150 }; 210 };
(...skipping 18 matching lines...) Expand all
169 return DefaultGeoProc::Create(GrRandomColor(random), GrRandomCoverage(random ), 229 return DefaultGeoProc::Create(GrRandomColor(random), GrRandomCoverage(random ),
170 random->nextBool(), flags); 230 random->nextBool(), flags);
171 } 231 }
172 232
173 const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(GrColor color, 233 const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(GrColor color,
174 uint32_t gpTypeFlags, 234 uint32_t gpTypeFlags,
175 bool opaqueVertexColo rs, 235 bool opaqueVertexColo rs,
176 uint8_t coverage) { 236 uint8_t coverage) {
177 return DefaultGeoProc::Create(color, coverage, gpTypeFlags, opaqueVertexColo rs); 237 return DefaultGeoProc::Create(color, coverage, gpTypeFlags, opaqueVertexColo rs);
178 } 238 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698