OLD | NEW |
---|---|
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2014 Google Inc. | 3 * Copyright 2014 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "effects/GrCoverageSetOpXP.h" | 9 #include "effects/GrCoverageSetOpXP.h" |
10 #include "GrCaps.h" | 10 #include "GrCaps.h" |
11 #include "GrColor.h" | 11 #include "GrColor.h" |
12 #include "GrPipeline.h" | |
12 #include "GrProcessor.h" | 13 #include "GrProcessor.h" |
13 #include "GrProcOptInfo.h" | 14 #include "GrProcOptInfo.h" |
14 #include "glsl/GrGLSLBlend.h" | 15 #include "glsl/GrGLSLBlend.h" |
15 #include "glsl/GrGLSLFragmentShaderBuilder.h" | 16 #include "glsl/GrGLSLFragmentShaderBuilder.h" |
16 #include "glsl/GrGLSLUniformHandler.h" | 17 #include "glsl/GrGLSLUniformHandler.h" |
17 #include "glsl/GrGLSLXferProcessor.h" | 18 #include "glsl/GrGLSLXferProcessor.h" |
18 | 19 |
19 class CoverageSetOpXP : public GrXferProcessor { | 20 class CoverageSetOpXP : public GrXferProcessor { |
20 public: | 21 public: |
21 static GrXferProcessor* Create(SkRegion::Op regionOp, bool invertCoverage) { | 22 static GrXferProcessor* Create(SkRegion::Op regionOp, bool invertCoverage) { |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
144 } | 145 } |
145 blendInfo->fBlendConstant = 0; | 146 blendInfo->fBlendConstant = 0; |
146 } | 147 } |
147 | 148 |
148 /////////////////////////////////////////////////////////////////////////////// | 149 /////////////////////////////////////////////////////////////////////////////// |
149 | 150 |
150 class ShaderCSOXferProcessor : public GrXferProcessor { | 151 class ShaderCSOXferProcessor : public GrXferProcessor { |
151 public: | 152 public: |
152 ShaderCSOXferProcessor(const DstTexture* dstTexture, | 153 ShaderCSOXferProcessor(const DstTexture* dstTexture, |
153 bool hasMixedSamples, | 154 bool hasMixedSamples, |
154 SkXfermode::Mode xfermode, | |
155 SkRegion::Op regionOp, | 155 SkRegion::Op regionOp, |
156 bool invertCoverage) | 156 bool invertCoverage) |
157 : INHERITED(dstTexture, true, hasMixedSamples) | 157 : INHERITED(dstTexture, true, hasMixedSamples) |
158 , fRegionOp(regionOp) | 158 , fRegionOp(regionOp) |
159 , fInvertCoverage(invertCoverage) { | 159 , fInvertCoverage(invertCoverage) { |
160 this->initClassID<ShaderCSOXferProcessor>(); | 160 this->initClassID<ShaderCSOXferProcessor>(); |
161 } | 161 } |
162 | 162 |
163 const char* name() const override { return "Coverage Set Op Shader"; } | 163 const char* name() const override { return "Coverage Set Op Shader"; } |
164 | 164 |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
303 static GrCoverageSetOpXPFactory gRevDiffCDXPF(regionOp, invertCo verage); | 303 static GrCoverageSetOpXPFactory gRevDiffCDXPF(regionOp, invertCo verage); |
304 return SkRef(&gRevDiffCDXPF); | 304 return SkRef(&gRevDiffCDXPF); |
305 } | 305 } |
306 break; | 306 break; |
307 } | 307 } |
308 default: | 308 default: |
309 return nullptr; | 309 return nullptr; |
310 } | 310 } |
311 } | 311 } |
312 | 312 |
313 bool GrCoverageSetOpXPFactory::willReadDstColor(const GrCaps& caps, | |
314 const GrPipelineOptimizations& o ptimizations, | |
315 bool hasMixedSamples) const { | |
316 return optimizations.fOverrides.fUsePLSDstRead; | |
egdaniel
2016/01/13 21:47:19
I am slightly worried about the need to check PLS
| |
317 } | |
318 | |
313 GrXferProcessor* | 319 GrXferProcessor* |
314 GrCoverageSetOpXPFactory::onCreateXferProcessor(const GrCaps& caps, | 320 GrCoverageSetOpXPFactory::onCreateXferProcessor(const GrCaps& caps, |
315 const GrPipelineOptimizations& o ptimizations, | 321 const GrPipelineOptimizations& o ptimizations, |
316 bool hasMixedSamples, | 322 bool hasMixedSamples, |
317 const DstTexture* dst) const { | 323 const DstTexture* dst) const { |
egdaniel
2016/01/13 21:47:19
extra spaces
| |
318 // We don't support inverting coverage with mixed samples. We don't expect t o ever want this in | 324 // We don't support inverting coverage with mixed samples. We don't expect t o ever want this in |
319 // the future, however we could at some point make this work using an invert ed coverage | 325 // the future, however we could at some point make this work using an invert ed coverage |
320 // modulation table. Note that an inverted table still won't work if there a re coverage procs. | 326 // modulation table. Note that an inverted table still won't work if there a re coverage procs. |
321 if (fInvertCoverage && hasMixedSamples) { | 327 if (fInvertCoverage && hasMixedSamples) { |
322 SkASSERT(false); | 328 SkASSERT(false); |
323 return nullptr; | 329 return nullptr; |
324 } | 330 } |
325 | 331 |
332 if (optimizations.fOverrides.fUsePLSDstRead) { | |
333 return new ShaderCSOXferProcessor(dst, hasMixedSamples, fRegionOp, fInve rtCoverage); | |
334 } | |
326 return CoverageSetOpXP::Create(fRegionOp, fInvertCoverage); | 335 return CoverageSetOpXP::Create(fRegionOp, fInvertCoverage); |
327 } | 336 } |
328 | 337 |
329 void GrCoverageSetOpXPFactory::getInvariantBlendedColor(const GrProcOptInfo& col orPOI, | 338 void GrCoverageSetOpXPFactory::getInvariantBlendedColor(const GrProcOptInfo& col orPOI, |
330 InvariantBlendedColor* b lendedColor) const { | 339 InvariantBlendedColor* b lendedColor) const { |
331 blendedColor->fWillBlendWithDst = SkRegion::kReplace_Op != fRegionOp; | 340 blendedColor->fWillBlendWithDst = SkRegion::kReplace_Op != fRegionOp; |
332 blendedColor->fKnownColorFlags = kNone_GrColorComponentFlags; | 341 blendedColor->fKnownColorFlags = kNone_GrColorComponentFlags; |
333 } | 342 } |
334 | 343 |
335 GR_DEFINE_XP_FACTORY_TEST(GrCoverageSetOpXPFactory); | 344 GR_DEFINE_XP_FACTORY_TEST(GrCoverageSetOpXPFactory); |
336 | 345 |
337 const GrXPFactory* GrCoverageSetOpXPFactory::TestCreate(GrProcessorTestData* d) { | 346 const GrXPFactory* GrCoverageSetOpXPFactory::TestCreate(GrProcessorTestData* d) { |
338 SkRegion::Op regionOp = SkRegion::Op(d->fRandom->nextULessThan(SkRegion::kLa stOp + 1)); | 347 SkRegion::Op regionOp = SkRegion::Op(d->fRandom->nextULessThan(SkRegion::kLa stOp + 1)); |
339 bool invertCoverage = !d->fRenderTarget->hasMixedSamples() && d->fRandom->ne xtBool(); | 348 bool invertCoverage = !d->fRenderTarget->hasMixedSamples() && d->fRandom->ne xtBool(); |
340 return GrCoverageSetOpXPFactory::Create(regionOp, invertCoverage); | 349 return GrCoverageSetOpXPFactory::Create(regionOp, invertCoverage); |
341 } | 350 } |
342 | 351 |
OLD | NEW |