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

Side by Side Diff: src/gpu/effects/GrPorterDuffXferProcessor.cpp

Issue 851143003: Remove willReadDst from GrFragmentProcessor. (Closed) Base URL: https://skia.googlesource.com/skia.git@xferXP
Patch Set: Rebase Created 5 years, 11 months 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
« no previous file with comments | « src/gpu/effects/GrDisableColorXP.h ('k') | src/gpu/gl/builders/GrGLProgramBuilder.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "effects/GrPorterDuffXferProcessor.h" 8 #include "effects/GrPorterDuffXferProcessor.h"
9 9
10 #include "GrBlend.h" 10 #include "GrBlend.h"
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 case GrPorterDuffXferProcessor::kNone_PrimaryOutputType: 65 case GrPorterDuffXferProcessor::kNone_PrimaryOutputType:
66 fsBuilder->codeAppendf("%s = vec4(0);", args.fOutputPrimary); 66 fsBuilder->codeAppendf("%s = vec4(0);", args.fOutputPrimary);
67 break; 67 break;
68 case GrPorterDuffXferProcessor::kColor_PrimaryOutputType: 68 case GrPorterDuffXferProcessor::kColor_PrimaryOutputType:
69 fsBuilder->codeAppendf("%s = %s;", args.fOutputPrimary, args.fIn putColor); 69 fsBuilder->codeAppendf("%s = %s;", args.fOutputPrimary, args.fIn putColor);
70 break; 70 break;
71 case GrPorterDuffXferProcessor::kCoverage_PrimaryOutputType: 71 case GrPorterDuffXferProcessor::kCoverage_PrimaryOutputType:
72 fsBuilder->codeAppendf("%s = %s;", args.fOutputPrimary, args.fIn putCoverage); 72 fsBuilder->codeAppendf("%s = %s;", args.fOutputPrimary, args.fIn putCoverage);
73 break; 73 break;
74 case GrPorterDuffXferProcessor::kModulate_PrimaryOutputType: 74 case GrPorterDuffXferProcessor::kModulate_PrimaryOutputType:
75 case GrPorterDuffXferProcessor::kCombineWithDst_PrimaryOutputType:
76 fsBuilder->codeAppendf("%s = %s * %s;", args.fOutputPrimary, arg s.fInputColor, 75 fsBuilder->codeAppendf("%s = %s * %s;", args.fOutputPrimary, arg s.fInputColor,
77 args.fInputCoverage); 76 args.fInputCoverage);
78 if (GrPorterDuffXferProcessor::kCombineWithDst_PrimaryOutputType ==
79 xp.primaryOutputType()){
80 fsBuilder->codeAppendf("%s += (vec4(1.0) - %s) * %s;", args. fOutputPrimary,
81 args.fInputCoverage, fsBuilder->dstCo lor());
82 }
83 break; 77 break;
84 default: 78 default:
85 SkFAIL("Unexpected Primary Output"); 79 SkFAIL("Unexpected Primary Output");
86 } 80 }
87 } 81 }
88 82
89 void setData(const GrGLProgramDataManager&, const GrXferProcessor&) SK_OVERR IDE {}; 83 void setData(const GrGLProgramDataManager&, const GrXferProcessor&) SK_OVERR IDE {};
90 84
91 static void GenKey(const GrProcessor& processor, const GrGLCaps& caps, 85 static void GenKey(const GrProcessor& processor, const GrGLCaps& caps,
92 GrProcessorKeyBuilder* b) { 86 GrProcessorKeyBuilder* b) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 // a point where we have RGB coverage. We don't need any color stages si nce the known color 131 // a point where we have RGB coverage. We don't need any color stages si nce the known color
138 // output is already baked into the blendConstant. 132 // output is already baked into the blendConstant.
139 uint8_t alpha = GrColorUnpackA(fBlendConstant); 133 uint8_t alpha = GrColorUnpackA(fBlendConstant);
140 *overrideColor = GrColorPackRGBA(alpha, alpha, alpha, alpha); 134 *overrideColor = GrColorPackRGBA(alpha, alpha, alpha, alpha);
141 optFlags = GrXferProcessor::kOverrideColor_OptFlag; 135 optFlags = GrXferProcessor::kOverrideColor_OptFlag;
142 } else { 136 } else {
143 optFlags = this->internalGetOptimizations(colorPOI, 137 optFlags = this->internalGetOptimizations(colorPOI,
144 coveragePOI, 138 coveragePOI,
145 doesStencilWrite); 139 doesStencilWrite);
146 } 140 }
147 this->calcOutputTypes(optFlags, caps, coveragePOI.isSolidWhite(), 141 this->calcOutputTypes(optFlags, caps, coveragePOI.isSolidWhite());
148 colorPOI.readsDst() || coveragePOI.readsDst());
149 return optFlags; 142 return optFlags;
150 } 143 }
151 144
152 void GrPorterDuffXferProcessor::calcOutputTypes(GrXferProcessor::OptFlags optFla gs, 145 void GrPorterDuffXferProcessor::calcOutputTypes(GrXferProcessor::OptFlags optFla gs,
153 const GrDrawTargetCaps& caps, 146 const GrDrawTargetCaps& caps,
154 bool hasSolidCoverage, bool read sDst) { 147 bool hasSolidCoverage) {
155 if (optFlags & kIgnoreColor_OptFlag) { 148 if (optFlags & kIgnoreColor_OptFlag) {
156 if (optFlags & kIgnoreCoverage_OptFlag) { 149 if (optFlags & kIgnoreCoverage_OptFlag) {
157 fPrimaryOutputType = kNone_PrimaryOutputType; 150 fPrimaryOutputType = kNone_PrimaryOutputType;
158 return; 151 return;
159 } else { 152 } else {
160 fPrimaryOutputType = kCoverage_PrimaryOutputType; 153 fPrimaryOutputType = kCoverage_PrimaryOutputType;
161 return; 154 return;
162 } 155 }
163 } else if (optFlags & kIgnoreCoverage_OptFlag) { 156 } else if (optFlags & kIgnoreCoverage_OptFlag) {
164 fPrimaryOutputType = kColor_PrimaryOutputType; 157 fPrimaryOutputType = kColor_PrimaryOutputType;
(...skipping 12 matching lines...) Expand all
177 fDstBlend = (GrBlendCoeff)GrGpu::kIS2C_GrBlendCoeff; 170 fDstBlend = (GrBlendCoeff)GrGpu::kIS2C_GrBlendCoeff;
178 } else if (kSA_GrBlendCoeff == fDstBlend) { 171 } else if (kSA_GrBlendCoeff == fDstBlend) {
179 // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered. 172 // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered.
180 fSecondaryOutputType = kCoverageISA_SecondaryOutputType; 173 fSecondaryOutputType = kCoverageISA_SecondaryOutputType;
181 fDstBlend = (GrBlendCoeff)GrGpu::kIS2C_GrBlendCoeff; 174 fDstBlend = (GrBlendCoeff)GrGpu::kIS2C_GrBlendCoeff;
182 } else if (kSC_GrBlendCoeff == fDstBlend) { 175 } else if (kSC_GrBlendCoeff == fDstBlend) {
183 // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered. 176 // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered.
184 fSecondaryOutputType = kCoverageISC_SecondaryOutputType; 177 fSecondaryOutputType = kCoverageISC_SecondaryOutputType;
185 fDstBlend = (GrBlendCoeff)GrGpu::kIS2C_GrBlendCoeff; 178 fDstBlend = (GrBlendCoeff)GrGpu::kIS2C_GrBlendCoeff;
186 } 179 }
187 } else if (readsDst &&
188 kOne_GrBlendCoeff == fSrcBlend &&
189 kZero_GrBlendCoeff == fDstBlend) {
190 fPrimaryOutputType = kCombineWithDst_PrimaryOutputType;
191 } 180 }
192 } 181 }
193 } 182 }
194 183
195 GrXferProcessor::OptFlags 184 GrXferProcessor::OptFlags
196 GrPorterDuffXferProcessor::internalGetOptimizations(const GrProcOptInfo& colorPO I, 185 GrPorterDuffXferProcessor::internalGetOptimizations(const GrProcOptInfo& colorPO I,
197 const GrProcOptInfo& coverag ePOI, 186 const GrProcOptInfo& coverag ePOI,
198 bool doesStencilWrite) { 187 bool doesStencilWrite) {
199 bool srcAIsOne; 188 bool srcAIsOne;
200 bool hasCoverage; 189 bool hasCoverage;
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 if (dstCoeffIsZero) { 401 if (dstCoeffIsZero) {
413 if (kZero_GrBlendCoeff == fSrcCoeff) { 402 if (kZero_GrBlendCoeff == fSrcCoeff) {
414 return true; 403 return true;
415 } else if (srcAIsOne) { 404 } else if (srcAIsOne) {
416 return true; 405 return true;
417 } 406 }
418 } else if (dstCoeffIsOne) { 407 } else if (dstCoeffIsOne) {
419 return true; 408 return true;
420 } 409 }
421 410
422 // TODO: once all SkXferEffects are XP's then we will never reads dst here s ince only XP's
423 // will readDst and PD XP's don't read dst.
424 if ((colorPOI.readsDst() || coveragePOI.readsDst()) &&
425 kOne_GrBlendCoeff == fSrcCoeff && kZero_GrBlendCoeff == fDstCoeff) {
426 return true;
427 }
428
429 return false; 411 return false;
430 } 412 }
431 413
432 bool GrPorterDuffXPFactory::canTweakAlphaForCoverage() const { 414 bool GrPorterDuffXPFactory::canTweakAlphaForCoverage() const {
433 return can_tweak_alpha_for_coverage(fDstCoeff); 415 return can_tweak_alpha_for_coverage(fDstCoeff);
434 } 416 }
435 417
436 void GrPorterDuffXPFactory::getInvariantOutput(const GrProcOptInfo& colorPOI, 418 void GrPorterDuffXPFactory::getInvariantOutput(const GrProcOptInfo& colorPOI,
437 const GrProcOptInfo& coveragePOI, 419 const GrProcOptInfo& coveragePOI,
438 GrXPFactory::InvariantOutput* out put) const { 420 GrXPFactory::InvariantOutput* out put) const {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 474
493 // TODO: update this once GrPaint actually has a const color. 475 // TODO: update this once GrPaint actually has a const color.
494 case kConstC_GrBlendCoeff: 476 case kConstC_GrBlendCoeff:
495 case kIConstC_GrBlendCoeff: 477 case kIConstC_GrBlendCoeff:
496 case kConstA_GrBlendCoeff: 478 case kConstA_GrBlendCoeff:
497 case kIConstA_GrBlendCoeff: 479 case kIConstA_GrBlendCoeff:
498 output->fBlendedColorFlags = 0; 480 output->fBlendedColorFlags = 0;
499 break; 481 break;
500 } 482 }
501 483
502 // TODO: once all SkXferEffects are XP's then we will never reads dst here s ince only XP's
503 // will readDst and PD XP's don't read dst.
504 if (colorPOI.readsDst() || coveragePOI.readsDst()) {
505 output->fWillBlendWithDst = true;
506 return;
507 }
508 output->fWillBlendWithDst = false; 484 output->fWillBlendWithDst = false;
509 } 485 }
510 486
511 bool GrPorterDuffXPFactory::willReadDst(const GrProcOptInfo& colorPOI,
512 const GrProcOptInfo& coveragePOI) const {
513 return colorPOI.readsDst() || coveragePOI.readsDst();
514 }
515
516 GR_DEFINE_XP_FACTORY_TEST(GrPorterDuffXPFactory); 487 GR_DEFINE_XP_FACTORY_TEST(GrPorterDuffXPFactory);
517 488
518 GrXPFactory* GrPorterDuffXPFactory::TestCreate(SkRandom* random, 489 GrXPFactory* GrPorterDuffXPFactory::TestCreate(SkRandom* random,
519 GrContext*, 490 GrContext*,
520 const GrDrawTargetCaps&, 491 const GrDrawTargetCaps&,
521 GrTexture*[]) { 492 GrTexture*[]) {
522 GrBlendCoeff src; 493 GrBlendCoeff src;
523 do { 494 do {
524 src = GrBlendCoeff(random->nextRangeU(kFirstPublicGrBlendCoeff, kLastPub licGrBlendCoeff)); 495 src = GrBlendCoeff(random->nextRangeU(kFirstPublicGrBlendCoeff, kLastPub licGrBlendCoeff));
525 } while (GrBlendCoeffRefsSrc(src)); 496 } while (GrBlendCoeffRefsSrc(src));
526 497
527 GrBlendCoeff dst; 498 GrBlendCoeff dst;
528 do { 499 do {
529 dst = GrBlendCoeff(random->nextRangeU(kFirstPublicGrBlendCoeff, kLastPub licGrBlendCoeff)); 500 dst = GrBlendCoeff(random->nextRangeU(kFirstPublicGrBlendCoeff, kLastPub licGrBlendCoeff));
530 } while (GrBlendCoeffRefsDst(dst)); 501 } while (GrBlendCoeffRefsDst(dst));
531 502
532 return GrPorterDuffXPFactory::Create(src, dst); 503 return GrPorterDuffXPFactory::Create(src, dst);
533 } 504 }
534 505
OLDNEW
« no previous file with comments | « src/gpu/effects/GrDisableColorXP.h ('k') | src/gpu/gl/builders/GrGLProgramBuilder.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698