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 "GrOptDrawState.h" | 8 #include "GrOptDrawState.h" |
9 | 9 |
10 #include "GrDefaultGeoProcFactory.h" | 10 #include "GrDefaultGeoProcFactory.h" |
11 #include "GrDrawState.h" | 11 #include "GrDrawState.h" |
12 #include "GrDrawTargetCaps.h" | 12 #include "GrDrawTargetCaps.h" |
13 #include "GrGpu.h" | 13 #include "GrGpu.h" |
14 #include "GrInvariantOutput.h" | 14 #include "GrProcOptInfo.h" |
15 | 15 |
16 GrOptDrawState::GrOptDrawState(const GrDrawState& drawState, | 16 GrOptDrawState::GrOptDrawState(const GrDrawState& drawState, |
17 BlendOptFlags blendOptFlags, | 17 BlendOptFlags blendOptFlags, |
18 GrBlendCoeff optSrcCoeff, | 18 GrBlendCoeff optSrcCoeff, |
19 GrBlendCoeff optDstCoeff, | 19 GrBlendCoeff optDstCoeff, |
20 GrGpu* gpu, | 20 GrGpu* gpu, |
21 const GrDeviceCoordTexture* dstCopy, | 21 const GrDeviceCoordTexture* dstCopy, |
22 GrGpu::DrawType drawType) { | 22 GrGpu::DrawType drawType) { |
23 fRenderTarget.set(SkSafeRef(drawState.getRenderTarget()), kWrite_GrIOType); | 23 fRenderTarget.set(SkSafeRef(drawState.getRenderTarget()), kWrite_GrIOType); |
24 fColor = drawState.getColor(); | 24 fColor = drawState.getColor(); |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 } else { | 232 } else { |
233 if (ds.vertexColorsAreOpaque()) { | 233 if (ds.vertexColorsAreOpaque()) { |
234 color = 0xFF << GrColor_SHIFT_A; | 234 color = 0xFF << GrColor_SHIFT_A; |
235 flags = kA_GrColorComponentFlag; | 235 flags = kA_GrColorComponentFlag; |
236 } else { | 236 } else { |
237 flags = static_cast<GrColorComponentFlags>(0); | 237 flags = static_cast<GrColorComponentFlags>(0); |
238 // not strictly necessary but we get false alarms from tools about u
ninit. | 238 // not strictly necessary but we get false alarms from tools about u
ninit. |
239 color = 0; | 239 color = 0; |
240 } | 240 } |
241 } | 241 } |
242 GrInvariantOutput inout(color, flags, false); | 242 GrProcOptInfo poi; |
243 | 243 if (ds.numColorStages() > 0) { |
244 for (int i = 0; i < ds.numColorStages(); ++i) { | 244 poi.calcWithInitialValues(&ds.getColorStage(0), ds.numColorStages(), col
or, flags, false); |
245 const GrFragmentProcessor* fp = ds.getColorStage(i).getProcessor(); | 245 *firstColorStageIdx = poi.firstEffectiveStageIndex(); |
246 fp->computeInvariantOutput(&inout); | 246 descInfo->fInputColorIsUsed = poi.inputColorIsUsed(); |
247 if (!inout.willUseInputColor()) { | 247 fColor = poi.inputColorToEffectiveStage(); |
248 *firstColorStageIdx = i; | 248 if (poi.removeVertexAttrib()) { |
249 descInfo->fInputColorIsUsed = false; | |
250 } | |
251 if (kRGBA_GrColorComponentFlags == inout.validFlags()) { | |
252 *firstColorStageIdx = i + 1; | |
253 fColor = inout.color(); | |
254 descInfo->fInputColorIsUsed = true; | |
255 *fixedFunctionVAToRemove |= 0x1 << kColor_GrVertexAttribBinding; | 249 *fixedFunctionVAToRemove |= 0x1 << kColor_GrVertexAttribBinding; |
256 // Since we are clearing all previous color stages we are in a state
where we have found | |
257 // zero stages that don't multiply the inputColor. | |
258 inout.resetNonMulStageFound(); | |
259 } | 250 } |
260 } | 251 } |
261 } | 252 } |
262 | 253 |
263 void GrOptDrawState::computeEffectiveCoverageStages(const GrDrawState& ds, | 254 void GrOptDrawState::computeEffectiveCoverageStages(const GrDrawState& ds, |
264 GrProgramDesc::DescInfo* des
cInfo, | 255 GrProgramDesc::DescInfo* des
cInfo, |
265 int* firstCoverageStageIdx)
{ | 256 int* firstCoverageStageIdx)
{ |
266 // We do not try to optimize out constantColor coverage effects here. It is
extremely rare | 257 // We do not try to optimize out constantColor coverage effects here. It is
extremely rare |
267 // to have a coverage effect that returns a constant value for all four chan
nels. Thus we | 258 // to have a coverage effect that returns a constant value for all four chan
nels. Thus we |
268 // save having to make extra virtual calls by not checking for it. | 259 // save having to make extra virtual calls by not checking for it. |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 bool explicitLocalCoords = this->fDesc.header().fLocalCoordAttributeIndex !=
-1; | 353 bool explicitLocalCoords = this->fDesc.header().fLocalCoordAttributeIndex !=
-1; |
363 for (int i = 0; i < this->numFragmentStages(); i++) { | 354 for (int i = 0; i < this->numFragmentStages(); i++) { |
364 if (!GrFragmentStage::AreCompatible(this->getFragmentStage(i), that.getF
ragmentStage(i), | 355 if (!GrFragmentStage::AreCompatible(this->getFragmentStage(i), that.getF
ragmentStage(i), |
365 explicitLocalCoords)) { | 356 explicitLocalCoords)) { |
366 return false; | 357 return false; |
367 } | 358 } |
368 } | 359 } |
369 return true; | 360 return true; |
370 } | 361 } |
371 | 362 |
OLD | NEW |