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 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 bool hasMixedSamples, | 316 bool hasMixedSamples, |
317 const DstTexture* dst) const { | 317 const DstTexture* dst) const { |
318 // We don't support inverting coverage with mixed samples. We don't expect t
o ever want this in | 318 // 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 | 319 // 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. | 320 // modulation table. Note that an inverted table still won't work if there a
re coverage procs. |
321 if (fInvertCoverage && hasMixedSamples) { | 321 if (fInvertCoverage && hasMixedSamples) { |
322 SkASSERT(false); | 322 SkASSERT(false); |
323 return nullptr; | 323 return nullptr; |
324 } | 324 } |
325 | 325 |
| 326 if (optimizations.fOverrides.fUsePLSDstRead) { |
| 327 return new ShaderCSOXferProcessor(dst, hasMixedSamples, fRegionOp, fInve
rtCoverage); |
| 328 } |
326 return CoverageSetOpXP::Create(fRegionOp, fInvertCoverage); | 329 return CoverageSetOpXP::Create(fRegionOp, fInvertCoverage); |
327 } | 330 } |
328 | 331 |
329 void GrCoverageSetOpXPFactory::getInvariantBlendedColor(const GrProcOptInfo& col
orPOI, | 332 void GrCoverageSetOpXPFactory::getInvariantBlendedColor(const GrProcOptInfo& col
orPOI, |
330 InvariantBlendedColor* b
lendedColor) const { | 333 InvariantBlendedColor* b
lendedColor) const { |
331 blendedColor->fWillBlendWithDst = SkRegion::kReplace_Op != fRegionOp; | 334 blendedColor->fWillBlendWithDst = SkRegion::kReplace_Op != fRegionOp; |
332 blendedColor->fKnownColorFlags = kNone_GrColorComponentFlags; | 335 blendedColor->fKnownColorFlags = kNone_GrColorComponentFlags; |
333 } | 336 } |
334 | 337 |
335 GR_DEFINE_XP_FACTORY_TEST(GrCoverageSetOpXPFactory); | 338 GR_DEFINE_XP_FACTORY_TEST(GrCoverageSetOpXPFactory); |
336 | 339 |
337 const GrXPFactory* GrCoverageSetOpXPFactory::TestCreate(GrProcessorTestData* d)
{ | 340 const GrXPFactory* GrCoverageSetOpXPFactory::TestCreate(GrProcessorTestData* d)
{ |
338 SkRegion::Op regionOp = SkRegion::Op(d->fRandom->nextULessThan(SkRegion::kLa
stOp + 1)); | 341 SkRegion::Op regionOp = SkRegion::Op(d->fRandom->nextULessThan(SkRegion::kLa
stOp + 1)); |
339 bool invertCoverage = !d->fRenderTarget->hasMixedSamples() && d->fRandom->ne
xtBool(); | 342 bool invertCoverage = !d->fRenderTarget->hasMixedSamples() && d->fRandom->ne
xtBool(); |
340 return GrCoverageSetOpXPFactory::Create(regionOp, invertCoverage); | 343 return GrCoverageSetOpXPFactory::Create(regionOp, invertCoverage); |
341 } | 344 } |
342 | 345 |
OLD | NEW |