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

Side by Side Diff: src/gpu/effects/GrBitmapTextGeoProc.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: missed some places to update uniform cache 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 2013 Google Inc. 2 * Copyright 2013 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 "GrBitmapTextGeoProc.h" 8 #include "GrBitmapTextGeoProc.h"
9 #include "GrInvariantOutput.h" 9 #include "GrInvariantOutput.h"
10 #include "GrTexture.h" 10 #include "GrTexture.h"
11 #include "gl/GrGLProcessor.h" 11 #include "gl/GrGLProcessor.h"
12 #include "gl/GrGLSL.h" 12 #include "gl/GrGLSL.h"
13 #include "gl/GrGLTexture.h" 13 #include "gl/GrGLTexture.h"
14 #include "gl/GrGLGeometryProcessor.h" 14 #include "gl/GrGLGeometryProcessor.h"
15 #include "gl/builders/GrGLProgramBuilder.h" 15 #include "gl/builders/GrGLProgramBuilder.h"
16 16
17 struct BitmapTextBatchTracker {
18 GrGPInput fInputColorType;
19 GrColor fColor;
20 };
21
17 class GrGLBitmapTextGeoProc : public GrGLGeometryProcessor { 22 class GrGLBitmapTextGeoProc : public GrGLGeometryProcessor {
18 public: 23 public:
19 GrGLBitmapTextGeoProc(const GrGeometryProcessor&, const GrBatchTracker&) {} 24 GrGLBitmapTextGeoProc(const GrGeometryProcessor&, const GrBatchTracker&)
25 : fColor(GrColor_ILLEGAL) {}
20 26
21 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { 27 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
22 const GrBitmapTextGeoProc& cte = args.fGP.cast<GrBitmapTextGeoProc>(); 28 const GrBitmapTextGeoProc& cte = args.fGP.cast<GrBitmapTextGeoProc>();
29 const BitmapTextBatchTracker& local = args.fBT.cast<BitmapTextBatchTrack er>();
23 30
24 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 31 GrGLGPBuilder* pb = args.fPB;
32 GrGLVertexBuilder* vsBuilder = pb->getVertexShaderBuilder();
25 33
26 GrGLVertToFrag v(kVec2f_GrSLType); 34 GrGLVertToFrag v(kVec2f_GrSLType);
27 args.fPB->addVarying("TextureCoords", &v); 35 pb->addVarying("TextureCoords", &v);
28 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), cte.inTextureCoords()->fNa me); 36 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), cte.inTextureCoords()->fNa me);
29 37
30 if (cte.inColor()) { 38 // Setup pass through color
31 args.fPB->addPassThroughAttribute(cte.inColor(), args.fOutputColor); 39 this->setupColor(pb, local.fInputColorType, args.fOutputColor, cte.inCol or(),
32 } 40 &fColorUniform);
33 41
34 // setup output coords 42 // setup output coords
35 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), cte.inPo sition()->fName); 43 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), cte.inPo sition()->fName);
36 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), cte.inPosit ion()->fName); 44 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), cte.inPosit ion()->fName);
37 45
38 // setup position varying 46 // setup position varying
39 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition() , 47 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition() ,
40 vsBuilder->uViewM(), cte.inPosition()->fName); 48 vsBuilder->uViewM(), cte.inPosition()->fName);
41 49
42 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); 50 GrGLGPFragmentBuilder* fsBuilder = pb->getFragmentShaderBuilder();
43 fsBuilder->codeAppendf("%s = ", args.fOutputCoverage); 51 fsBuilder->codeAppendf("%s = ", args.fOutputCoverage);
44 fsBuilder->appendTextureLookup(args.fSamplers[0], v.fsIn(), kVec2f_GrSLT ype); 52 fsBuilder->appendTextureLookup(args.fSamplers[0], v.fsIn(), kVec2f_GrSLT ype);
45 fsBuilder->codeAppend(";"); 53 fsBuilder->codeAppend(";");
46 } 54 }
47 55
48 virtual void setData(const GrGLProgramDataManager&, 56 virtual void setData(const GrGLProgramDataManager& pdman,
49 const GrGeometryProcessor&, 57 const GrGeometryProcessor& gp,
50 const GrBatchTracker&) SK_OVERRIDE {} 58 const GrBatchTracker& bt) SK_OVERRIDE {
59 const BitmapTextBatchTracker& local = bt.cast<BitmapTextBatchTracker>();
60 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColo r) {
61 GrGLfloat c[4];
62 GrColorToRGBAFloat(local.fColor, c);
63 pdman.set4fv(fColorUniform, 1, c);
64 fColor = local.fColor;
65 }
66 }
51 67
52 static inline void GenKey(const GrGeometryProcessor& proc, 68 static inline void GenKey(const GrGeometryProcessor& proc,
53 const GrBatchTracker&, 69 const GrBatchTracker& bt,
54 const GrGLCaps&, 70 const GrGLCaps&,
55 GrProcessorKeyBuilder* b) { 71 GrProcessorKeyBuilder* b) {
72 const BitmapTextBatchTracker& local = bt.cast<BitmapTextBatchTracker>();
56 const GrBitmapTextGeoProc& gp = proc.cast<GrBitmapTextGeoProc>(); 73 const GrBitmapTextGeoProc& gp = proc.cast<GrBitmapTextGeoProc>();
57
58 b->add32(SkToBool(gp.inColor())); 74 b->add32(SkToBool(gp.inColor()));
75 b->add32(local.fInputColorType);
59 } 76 }
60 77
78 private:
79 GrColor fColor;
80 UniformHandle fColorUniform;
61 81
62 private:
63 typedef GrGLGeometryProcessor INHERITED; 82 typedef GrGLGeometryProcessor INHERITED;
64 }; 83 };
65 84
66 /////////////////////////////////////////////////////////////////////////////// 85 ///////////////////////////////////////////////////////////////////////////////
67 86
68 GrBitmapTextGeoProc::GrBitmapTextGeoProc(GrColor color, GrTexture* texture, 87 GrBitmapTextGeoProc::GrBitmapTextGeoProc(GrColor color, GrTexture* texture,
69 const GrTextureParams& params, bool use ColorAttrib, 88 const GrTextureParams& params, bool use ColorAttrib,
70 bool opaqueVertexColors) 89 bool opaqueVertexColors)
71 : INHERITED(color, opaqueVertexColors), fTextureAccess(texture, params), fIn Color(NULL) { 90 : INHERITED(color, opaqueVertexColors), fTextureAccess(texture, params), fIn Color(NULL) {
72 this->initClassID<GrBitmapTextGeoProc>(); 91 this->initClassID<GrBitmapTextGeoProc>();
(...skipping 27 matching lines...) Expand all
100 void GrBitmapTextGeoProc::getGLProcessorKey(const GrBatchTracker& bt, 119 void GrBitmapTextGeoProc::getGLProcessorKey(const GrBatchTracker& bt,
101 const GrGLCaps& caps, 120 const GrGLCaps& caps,
102 GrProcessorKeyBuilder* b) const { 121 GrProcessorKeyBuilder* b) const {
103 GrGLBitmapTextGeoProc::GenKey(*this, bt, caps, b); 122 GrGLBitmapTextGeoProc::GenKey(*this, bt, caps, b);
104 } 123 }
105 124
106 GrGLGeometryProcessor* 125 GrGLGeometryProcessor*
107 GrBitmapTextGeoProc::createGLInstance(const GrBatchTracker& bt) const { 126 GrBitmapTextGeoProc::createGLInstance(const GrBatchTracker& bt) const {
108 return SkNEW_ARGS(GrGLBitmapTextGeoProc, (*this, bt)); 127 return SkNEW_ARGS(GrGLBitmapTextGeoProc, (*this, bt));
109 } 128 }
129
130 void GrBitmapTextGeoProc::initBatchTracker(GrBatchTracker* bt, const InitBT& ini t) const {
131 BitmapTextBatchTracker* local = bt->cast<BitmapTextBatchTracker>();
132 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in it,
133 SkToBool(fInColor));
134 }
135
136 bool GrBitmapTextGeoProc::onCanMakeEqual(const GrBatchTracker& m, const GrBatchT racker& t) const {
137 const BitmapTextBatchTracker& mine = m.cast<BitmapTextBatchTracker>();
138 const BitmapTextBatchTracker& theirs = t.cast<BitmapTextBatchTracker>();
139 return CanCombineOutput(mine.fInputColorType, mine.fColor,
140 theirs.fInputColorType, theirs.fColor);
141 }
142
110 /////////////////////////////////////////////////////////////////////////////// 143 ///////////////////////////////////////////////////////////////////////////////
111 144
112 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrBitmapTextGeoProc); 145 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrBitmapTextGeoProc);
113 146
114 GrGeometryProcessor* GrBitmapTextGeoProc::TestCreate(SkRandom* random, 147 GrGeometryProcessor* GrBitmapTextGeoProc::TestCreate(SkRandom* random,
115 GrContext*, 148 GrContext*,
116 const GrDrawTargetCaps&, 149 const GrDrawTargetCaps&,
117 GrTexture* textures[]) { 150 GrTexture* textures[]) {
118 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx : 151 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx :
119 GrProcessorUnitTest::kAlphaTextureIdx; 152 GrProcessorUnitTest::kAlphaTextureIdx;
120 static const SkShader::TileMode kTileModes[] = { 153 static const SkShader::TileMode kTileModes[] = {
121 SkShader::kClamp_TileMode, 154 SkShader::kClamp_TileMode,
122 SkShader::kRepeat_TileMode, 155 SkShader::kRepeat_TileMode,
123 SkShader::kMirror_TileMode, 156 SkShader::kMirror_TileMode,
124 }; 157 };
125 SkShader::TileMode tileModes[] = { 158 SkShader::TileMode tileModes[] = {
126 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], 159 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
127 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], 160 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
128 }; 161 };
129 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBil erp_FilterMode : 162 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBil erp_FilterMode :
130 GrTextureParams::kNon e_FilterMode); 163 GrTextureParams::kNon e_FilterMode);
131 164
132 return GrBitmapTextGeoProc::Create(GrRandomColor(random), textures[texIdx], params, 165 return GrBitmapTextGeoProc::Create(GrRandomColor(random), textures[texIdx], params,
133 random->nextBool(), random->nextBool()); 166 random->nextBool(), random->nextBool());
134 } 167 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698