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 "GrInvariantOutput.h" | 10 #include "GrInvariantOutput.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 const SkMatrix& viewMatrix() const { return fViewMatrix; } | 48 const SkMatrix& viewMatrix() const { return fViewMatrix; } |
49 const SkMatrix& localMatrix() const { return fLocalMatrix; } | 49 const SkMatrix& localMatrix() const { return fLocalMatrix; } |
50 bool usesLocalCoords() const { return fUsesLocalCoords; } | 50 bool usesLocalCoords() const { return fUsesLocalCoords; } |
51 uint8_t coverage() const { return fCoverage; } | 51 uint8_t coverage() const { return fCoverage; } |
52 bool coverageIgnored() const { return fCoverageIgnored; } | 52 bool coverageIgnored() const { return fCoverageIgnored; } |
53 bool hasVertexCoverage() const { return SkToBool(fInCoverage); } | 53 bool hasVertexCoverage() const { return SkToBool(fInCoverage); } |
54 | 54 |
55 class GLProcessor : public GrGLGeometryProcessor { | 55 class GLProcessor : public GrGLGeometryProcessor { |
56 public: | 56 public: |
57 GLProcessor(const GrGeometryProcessor& gp, const GrBatchTracker&) | 57 GLProcessor(const GrGeometryProcessor& gp, const GrBatchTracker&) |
58 : fColor(GrColor_ILLEGAL), fCoverage(0xff) {} | 58 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), f
Coverage(0xff) {} |
59 | 59 |
60 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override { | 60 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override { |
61 const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>(); | 61 const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>(); |
62 GrGLGPBuilder* pb = args.fPB; | 62 GrGLGPBuilder* pb = args.fPB; |
63 GrGLVertexBuilder* vsBuilder = pb->getVertexShaderBuilder(); | 63 GrGLVertexBuilder* vsBuilder = pb->getVertexShaderBuilder(); |
64 GrGLFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); | 64 GrGLFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); |
65 | 65 |
66 // emit attributes | 66 // emit attributes |
67 vsBuilder->emitAttributes(gp); | 67 vsBuilder->emitAttributes(gp); |
68 | 68 |
69 // Setup pass through color | 69 // Setup pass through color |
70 if (!gp.colorIgnored()) { | 70 if (!gp.colorIgnored()) { |
71 if (gp.hasVertexColor()) { | 71 if (gp.hasVertexColor()) { |
72 pb->addPassThroughAttribute(gp.inColor(), args.fOutputColor)
; | 72 pb->addPassThroughAttribute(gp.inColor(), args.fOutputColor)
; |
73 } else { | 73 } else { |
74 this->setupUniformColor(pb, args.fOutputColor, &fColorUnifor
m); | 74 this->setupUniformColor(pb, args.fOutputColor, &fColorUnifor
m); |
75 } | 75 } |
76 } | 76 } |
77 | 77 |
78 // Setup position | 78 // Setup position |
79 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatri
x()); | 79 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatri
x(), |
| 80 &fViewMatrixUniform); |
80 | 81 |
81 if (gp.inLocalCoords()) { | 82 if (gp.inLocalCoords()) { |
82 // emit transforms with explicit local coords | 83 // emit transforms with explicit local coords |
83 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inLocalCoords(
)->fName, | 84 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inLocalCoords(
)->fName, |
84 gp.localMatrix(), args.fTransformsIn, args.
fTransformsOut); | 85 gp.localMatrix(), args.fTransformsIn, args.
fTransformsOut); |
85 } else { | 86 } else { |
86 // emit transforms with position | 87 // emit transforms with position |
87 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->
fName, | 88 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->
fName, |
88 gp.localMatrix(), args.fTransformsIn, args.
fTransformsOut); | 89 gp.localMatrix(), args.fTransformsIn, args.
fTransformsOut); |
89 } | 90 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 key |= def.coverage() == 0xff ? 0x1 << 12 : 0; | 122 key |= def.coverage() == 0xff ? 0x1 << 12 : 0; |
122 key |= def.usesLocalCoords() && def.localMatrix().hasPerspective() ?
0x1 << 24 : 0x0; | 123 key |= def.usesLocalCoords() && def.localMatrix().hasPerspective() ?
0x1 << 24 : 0x0; |
123 key |= ComputePosKey(def.viewMatrix()) << 25; | 124 key |= ComputePosKey(def.viewMatrix()) << 25; |
124 b->add32(key); | 125 b->add32(key); |
125 } | 126 } |
126 | 127 |
127 virtual void setData(const GrGLProgramDataManager& pdman, | 128 virtual void setData(const GrGLProgramDataManager& pdman, |
128 const GrPrimitiveProcessor& gp, | 129 const GrPrimitiveProcessor& gp, |
129 const GrBatchTracker& bt) override { | 130 const GrBatchTracker& bt) override { |
130 const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>(); | 131 const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>(); |
131 this->setUniformViewMatrix(pdman, dgp.viewMatrix()); | 132 |
| 133 if (!dgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dgp.
viewMatrix())) { |
| 134 fViewMatrix = dgp.viewMatrix(); |
| 135 GrGLfloat viewMatrix[3 * 3]; |
| 136 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); |
| 137 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); |
| 138 } |
132 | 139 |
133 if (dgp.color() != fColor && !dgp.hasVertexColor()) { | 140 if (dgp.color() != fColor && !dgp.hasVertexColor()) { |
134 GrGLfloat c[4]; | 141 GrGLfloat c[4]; |
135 GrColorToRGBAFloat(dgp.color(), c); | 142 GrColorToRGBAFloat(dgp.color(), c); |
136 pdman.set4fv(fColorUniform, 1, c); | 143 pdman.set4fv(fColorUniform, 1, c); |
137 fColor = dgp.color(); | 144 fColor = dgp.color(); |
138 } | 145 } |
139 | 146 |
140 if (!dgp.coverageIgnored() && dgp.coverage() != fCoverage && !dgp.ha
sVertexCoverage()) { | 147 if (!dgp.coverageIgnored() && dgp.coverage() != fCoverage && !dgp.ha
sVertexCoverage()) { |
141 pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverag
e())); | 148 pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverag
e())); |
142 fCoverage = dgp.coverage(); | 149 fCoverage = dgp.coverage(); |
143 } | 150 } |
144 } | 151 } |
145 | 152 |
146 void setTransformData(const GrPrimitiveProcessor& primProc, | 153 void setTransformData(const GrPrimitiveProcessor& primProc, |
147 const GrGLProgramDataManager& pdman, | 154 const GrGLProgramDataManager& pdman, |
148 int index, | 155 int index, |
149 const SkTArray<const GrCoordTransform*, true>& tra
nsforms) override { | 156 const SkTArray<const GrCoordTransform*, true>& tra
nsforms) override { |
150 this->setTransformDataHelper<DefaultGeoProc>(primProc, pdman, index,
transforms); | 157 this->setTransformDataHelper<DefaultGeoProc>(primProc, pdman, index,
transforms); |
151 } | 158 } |
152 | 159 |
153 private: | 160 private: |
| 161 SkMatrix fViewMatrix; |
154 GrColor fColor; | 162 GrColor fColor; |
155 uint8_t fCoverage; | 163 uint8_t fCoverage; |
| 164 UniformHandle fViewMatrixUniform; |
156 UniformHandle fColorUniform; | 165 UniformHandle fColorUniform; |
157 UniformHandle fCoverageUniform; | 166 UniformHandle fCoverageUniform; |
158 | 167 |
159 typedef GrGLGeometryProcessor INHERITED; | 168 typedef GrGLGeometryProcessor INHERITED; |
160 }; | 169 }; |
161 | 170 |
162 virtual void getGLProcessorKey(const GrBatchTracker& bt, | 171 virtual void getGLProcessorKey(const GrBatchTracker& bt, |
163 const GrGLSLCaps& caps, | 172 const GrGLSLCaps& caps, |
164 GrProcessorKeyBuilder* b) const override { | 173 GrProcessorKeyBuilder* b) const override { |
165 GLProcessor::GenKey(*this, bt, caps, b); | 174 GLProcessor::GenKey(*this, bt, caps, b); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 const SkMatrix& local
Matrix, | 269 const SkMatrix& local
Matrix, |
261 uint8_t coverage) { | 270 uint8_t coverage) { |
262 return DefaultGeoProc::Create(gpTypeFlags, | 271 return DefaultGeoProc::Create(gpTypeFlags, |
263 color, | 272 color, |
264 viewMatrix, | 273 viewMatrix, |
265 localMatrix, | 274 localMatrix, |
266 usesLocalCoords, | 275 usesLocalCoords, |
267 coverageIgnored, | 276 coverageIgnored, |
268 coverage); | 277 coverage); |
269 } | 278 } |
OLD | NEW |