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

Side by Side Diff: src/gpu/GrDrawState.cpp

Issue 509153002: Initial change to create GeometryProcessor (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: last warning Created 6 years, 3 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/GrDrawState.h ('k') | src/gpu/GrDrawTarget.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 2012 Google Inc. 2 * Copyright 2012 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 "GrDrawState.h" 8 #include "GrDrawState.h"
9 #include "GrPaint.h" 9 #include "GrPaint.h"
10 #include "GrDrawTargetCaps.h" 10 #include "GrDrawTargetCaps.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 } 47 }
48 return kAOrB_CombinedState; 48 return kAOrB_CombinedState;
49 } 49 }
50 50
51 //////////////////////////////////////////////////////////////////////////////s 51 //////////////////////////////////////////////////////////////////////////////s
52 52
53 GrDrawState::GrDrawState(const GrDrawState& state, const SkMatrix& preConcatMatr ix) { 53 GrDrawState::GrDrawState(const GrDrawState& state, const SkMatrix& preConcatMatr ix) {
54 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;) 54 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
55 *this = state; 55 *this = state;
56 if (!preConcatMatrix.isIdentity()) { 56 if (!preConcatMatrix.isIdentity()) {
57 if (this->hasGeometryProcessor()) {
58 fGeometryProcessor->localCoordChange(preConcatMatrix);
59 }
57 for (int i = 0; i < this->numColorStages(); ++i) { 60 for (int i = 0; i < this->numColorStages(); ++i) {
58 fColorStages[i].localCoordChange(preConcatMatrix); 61 fColorStages[i].localCoordChange(preConcatMatrix);
59 } 62 }
60 for (int i = 0; i < this->numCoverageStages(); ++i) { 63 for (int i = 0; i < this->numCoverageStages(); ++i) {
61 fCoverageStages[i].localCoordChange(preConcatMatrix); 64 fCoverageStages[i].localCoordChange(preConcatMatrix);
62 } 65 }
63 this->invalidateBlendOptFlags(); 66 this->invalidateBlendOptFlags();
64 } 67 }
65 } 68 }
66 69
67 GrDrawState& GrDrawState::operator=(const GrDrawState& that) { 70 GrDrawState& GrDrawState::operator=(const GrDrawState& that) {
68 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); 71 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages());
69 this->setRenderTarget(that.fRenderTarget.get()); 72 this->setRenderTarget(that.fRenderTarget.get());
70 fColor = that.fColor; 73 fColor = that.fColor;
71 fViewMatrix = that.fViewMatrix; 74 fViewMatrix = that.fViewMatrix;
72 fSrcBlend = that.fSrcBlend; 75 fSrcBlend = that.fSrcBlend;
73 fDstBlend = that.fDstBlend; 76 fDstBlend = that.fDstBlend;
74 fBlendConstant = that.fBlendConstant; 77 fBlendConstant = that.fBlendConstant;
75 fFlagBits = that.fFlagBits; 78 fFlagBits = that.fFlagBits;
76 fVACount = that.fVACount; 79 fVACount = that.fVACount;
77 fVAPtr = that.fVAPtr; 80 fVAPtr = that.fVAPtr;
78 fVAStride = that.fVAStride; 81 fVAStride = that.fVAStride;
79 fStencilSettings = that.fStencilSettings; 82 fStencilSettings = that.fStencilSettings;
80 fCoverage = that.fCoverage; 83 fCoverage = that.fCoverage;
81 fDrawFace = that.fDrawFace; 84 fDrawFace = that.fDrawFace;
85 if (that.hasGeometryProcessor()) {
86 fGeometryProcessor.reset(SkNEW_ARGS(GrEffectStage, (*that.fGeometryProce ssor.get())));
87 } else {
88 fGeometryProcessor.reset(NULL);
89 }
82 fColorStages = that.fColorStages; 90 fColorStages = that.fColorStages;
83 fCoverageStages = that.fCoverageStages; 91 fCoverageStages = that.fCoverageStages;
84 fOptSrcBlend = that.fOptSrcBlend; 92 fOptSrcBlend = that.fOptSrcBlend;
85 fOptDstBlend = that.fOptDstBlend; 93 fOptDstBlend = that.fOptDstBlend;
86 fBlendOptFlags = that.fBlendOptFlags; 94 fBlendOptFlags = that.fBlendOptFlags;
87 95
88 fHints = that.fHints; 96 fHints = that.fHints;
89 97
90 memcpy(fFixedFunctionVertexAttribIndices, 98 memcpy(fFixedFunctionVertexAttribIndices,
91 that.fFixedFunctionVertexAttribIndices, 99 that.fFixedFunctionVertexAttribIndices,
92 sizeof(fFixedFunctionVertexAttribIndices)); 100 sizeof(fFixedFunctionVertexAttribIndices));
93 return *this; 101 return *this;
94 } 102 }
95 103
96 void GrDrawState::onReset(const SkMatrix* initialViewMatrix) { 104 void GrDrawState::onReset(const SkMatrix* initialViewMatrix) {
97 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); 105 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages());
106 fGeometryProcessor.reset(NULL);
98 fColorStages.reset(); 107 fColorStages.reset();
99 fCoverageStages.reset(); 108 fCoverageStages.reset();
100 109
101 fRenderTarget.reset(NULL); 110 fRenderTarget.reset(NULL);
102 111
103 this->setDefaultVertexAttribs(); 112 this->setDefaultVertexAttribs();
104 113
105 fColor = 0xffffffff; 114 fColor = 0xffffffff;
106 if (NULL == initialViewMatrix) { 115 if (NULL == initialViewMatrix) {
107 fViewMatrix.reset(); 116 fViewMatrix.reset();
(...skipping 13 matching lines...) Expand all
121 this->invalidateBlendOptFlags(); 130 this->invalidateBlendOptFlags();
122 } 131 }
123 132
124 bool GrDrawState::setIdentityViewMatrix() { 133 bool GrDrawState::setIdentityViewMatrix() {
125 if (this->numTotalStages()) { 134 if (this->numTotalStages()) {
126 SkMatrix invVM; 135 SkMatrix invVM;
127 if (!fViewMatrix.invert(&invVM)) { 136 if (!fViewMatrix.invert(&invVM)) {
128 // sad trombone sound 137 // sad trombone sound
129 return false; 138 return false;
130 } 139 }
140 if (this->hasGeometryProcessor()) {
141 fGeometryProcessor->localCoordChange(invVM);
142 }
131 for (int s = 0; s < this->numColorStages(); ++s) { 143 for (int s = 0; s < this->numColorStages(); ++s) {
132 fColorStages[s].localCoordChange(invVM); 144 fColorStages[s].localCoordChange(invVM);
133 } 145 }
134 for (int s = 0; s < this->numCoverageStages(); ++s) { 146 for (int s = 0; s < this->numCoverageStages(); ++s) {
135 fCoverageStages[s].localCoordChange(invVM); 147 fCoverageStages[s].localCoordChange(invVM);
136 } 148 }
137 } 149 }
138 fViewMatrix.reset(); 150 fViewMatrix.reset();
139 return true; 151 return true;
140 } 152 }
141 153
142 void GrDrawState::setFromPaint(const GrPaint& paint, const SkMatrix& vm, GrRende rTarget* rt) { 154 void GrDrawState::setFromPaint(const GrPaint& paint, const SkMatrix& vm, GrRende rTarget* rt) {
143 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); 155 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages());
144 156
157 fGeometryProcessor.reset(NULL);
145 fColorStages.reset(); 158 fColorStages.reset();
146 fCoverageStages.reset(); 159 fCoverageStages.reset();
147 160
148 for (int i = 0; i < paint.numColorStages(); ++i) { 161 for (int i = 0; i < paint.numColorStages(); ++i) {
149 fColorStages.push_back(paint.getColorStage(i)); 162 fColorStages.push_back(paint.getColorStage(i));
150 } 163 }
151 164
152 for (int i = 0; i < paint.numCoverageStages(); ++i) { 165 for (int i = 0; i < paint.numCoverageStages(); ++i) {
153 fCoverageStages.push_back(paint.getCoverageStage(i)); 166 fCoverageStages.push_back(paint.getCoverageStage(i));
154 } 167 }
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 fVAPtr = drawState->fVAPtr; 292 fVAPtr = drawState->fVAPtr;
280 fVACount = drawState->fVACount; 293 fVACount = drawState->fVACount;
281 fVAStride = drawState->fVAStride; 294 fVAStride = drawState->fVAStride;
282 fDrawState->setDefaultVertexAttribs(); 295 fDrawState->setDefaultVertexAttribs();
283 } 296 }
284 297
285 //////////////////////////////////////////////////////////////////////////////s 298 //////////////////////////////////////////////////////////////////////////////s
286 299
287 void GrDrawState::AutoRestoreEffects::set(GrDrawState* ds) { 300 void GrDrawState::AutoRestoreEffects::set(GrDrawState* ds) {
288 if (NULL != fDrawState) { 301 if (NULL != fDrawState) {
302 fDrawState->fGeometryProcessor.reset(fGeometryProcessor.detach());
303
289 int m = fDrawState->numColorStages() - fColorEffectCnt; 304 int m = fDrawState->numColorStages() - fColorEffectCnt;
290 SkASSERT(m >= 0); 305 SkASSERT(m >= 0);
291 fDrawState->fColorStages.pop_back_n(m); 306 fDrawState->fColorStages.pop_back_n(m);
292 307
293 int n = fDrawState->numCoverageStages() - fCoverageEffectCnt; 308 int n = fDrawState->numCoverageStages() - fCoverageEffectCnt;
294 SkASSERT(n >= 0); 309 SkASSERT(n >= 0);
295 fDrawState->fCoverageStages.pop_back_n(n); 310 fDrawState->fCoverageStages.pop_back_n(n);
296 if (m + n > 0) { 311 if (m + n > 0) {
297 fDrawState->invalidateBlendOptFlags(); 312 fDrawState->invalidateBlendOptFlags();
298 } 313 }
299 SkDEBUGCODE(--fDrawState->fBlockEffectRemovalCnt;) 314 SkDEBUGCODE(--fDrawState->fBlockEffectRemovalCnt;)
300 } 315 }
301 fDrawState = ds; 316 fDrawState = ds;
302 if (NULL != ds) { 317 if (NULL != ds) {
318 if (ds->hasGeometryProcessor()) {
319 fGeometryProcessor.reset(SkNEW_ARGS(GrEffectStage, (*ds->getGeometry Processor())));
320 } else {
321 fGeometryProcessor.reset(NULL);
322 }
303 fColorEffectCnt = ds->numColorStages(); 323 fColorEffectCnt = ds->numColorStages();
304 fCoverageEffectCnt = ds->numCoverageStages(); 324 fCoverageEffectCnt = ds->numCoverageStages();
305 SkDEBUGCODE(++ds->fBlockEffectRemovalCnt;) 325 SkDEBUGCODE(++ds->fBlockEffectRemovalCnt;)
306 } 326 }
307 } 327 }
308 328
309 //////////////////////////////////////////////////////////////////////////////// 329 ////////////////////////////////////////////////////////////////////////////////
310 330
311 GrRODrawState::BlendOptFlags GrDrawState::getBlendOpts(bool forceCoverage, 331 GrRODrawState::BlendOptFlags GrDrawState::getBlendOpts(bool forceCoverage,
312 GrBlendCoeff* srcCoeff, 332 GrBlendCoeff* srcCoeff,
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
422 442
423 void GrDrawState::AutoViewMatrixRestore::restore() { 443 void GrDrawState::AutoViewMatrixRestore::restore() {
424 if (NULL != fDrawState) { 444 if (NULL != fDrawState) {
425 SkDEBUGCODE(--fDrawState->fBlockEffectRemovalCnt;) 445 SkDEBUGCODE(--fDrawState->fBlockEffectRemovalCnt;)
426 fDrawState->fViewMatrix = fViewMatrix; 446 fDrawState->fViewMatrix = fViewMatrix;
427 SkASSERT(fDrawState->numColorStages() >= fNumColorStages); 447 SkASSERT(fDrawState->numColorStages() >= fNumColorStages);
428 int numCoverageStages = fSavedCoordChanges.count() - fNumColorStages; 448 int numCoverageStages = fSavedCoordChanges.count() - fNumColorStages;
429 SkASSERT(fDrawState->numCoverageStages() >= numCoverageStages); 449 SkASSERT(fDrawState->numCoverageStages() >= numCoverageStages);
430 450
431 int i = 0; 451 int i = 0;
452 if (fHasGeometryProcessor) {
453 SkASSERT(fDrawState->hasGeometryProcessor());
454 fDrawState->fGeometryProcessor->restoreCoordChange(fSavedCoordChange s[i++]);
455 }
432 for (int s = 0; s < fNumColorStages; ++s, ++i) { 456 for (int s = 0; s < fNumColorStages; ++s, ++i) {
433 fDrawState->fColorStages[s].restoreCoordChange(fSavedCoordChanges[i] ); 457 fDrawState->fColorStages[s].restoreCoordChange(fSavedCoordChanges[i] );
434 } 458 }
435 for (int s = 0; s < numCoverageStages; ++s, ++i) { 459 for (int s = 0; s < numCoverageStages; ++s, ++i) {
436 fDrawState->fCoverageStages[s].restoreCoordChange(fSavedCoordChanges [i]); 460 fDrawState->fCoverageStages[s].restoreCoordChange(fSavedCoordChanges [i]);
437 } 461 }
438 fDrawState = NULL; 462 fDrawState = NULL;
439 } 463 }
440 } 464 }
441 465
(...skipping 22 matching lines...) Expand all
464 } 488 }
465 489
466 if (drawState->getViewMatrix().isIdentity()) { 490 if (drawState->getViewMatrix().isIdentity()) {
467 return true; 491 return true;
468 } 492 }
469 493
470 fViewMatrix = drawState->getViewMatrix(); 494 fViewMatrix = drawState->getViewMatrix();
471 if (0 == drawState->numTotalStages()) { 495 if (0 == drawState->numTotalStages()) {
472 drawState->fViewMatrix.reset(); 496 drawState->fViewMatrix.reset();
473 fDrawState = drawState; 497 fDrawState = drawState;
498 fHasGeometryProcessor = false;
474 fNumColorStages = 0; 499 fNumColorStages = 0;
475 fSavedCoordChanges.reset(0); 500 fSavedCoordChanges.reset(0);
476 SkDEBUGCODE(++fDrawState->fBlockEffectRemovalCnt;) 501 SkDEBUGCODE(++fDrawState->fBlockEffectRemovalCnt;)
477 return true; 502 return true;
478 } else { 503 } else {
479 SkMatrix inv; 504 SkMatrix inv;
480 if (!fViewMatrix.invert(&inv)) { 505 if (!fViewMatrix.invert(&inv)) {
481 return false; 506 return false;
482 } 507 }
483 drawState->fViewMatrix.reset(); 508 drawState->fViewMatrix.reset();
484 fDrawState = drawState; 509 fDrawState = drawState;
485 this->doEffectCoordChanges(inv); 510 this->doEffectCoordChanges(inv);
486 SkDEBUGCODE(++fDrawState->fBlockEffectRemovalCnt;) 511 SkDEBUGCODE(++fDrawState->fBlockEffectRemovalCnt;)
487 return true; 512 return true;
488 } 513 }
489 } 514 }
490 515
491 void GrDrawState::AutoViewMatrixRestore::doEffectCoordChanges(const SkMatrix& co ordChangeMatrix) { 516 void GrDrawState::AutoViewMatrixRestore::doEffectCoordChanges(const SkMatrix& co ordChangeMatrix) {
492 fSavedCoordChanges.reset(fDrawState->numTotalStages()); 517 fSavedCoordChanges.reset(fDrawState->numTotalStages());
493 int i = 0; 518 int i = 0;
494 519
520 fHasGeometryProcessor = false;
521 if (fDrawState->hasGeometryProcessor()) {
522 fDrawState->fGeometryProcessor->saveCoordChange(&fSavedCoordChanges[i++] );
523 fDrawState->fGeometryProcessor->localCoordChange(coordChangeMatrix);
524 fHasGeometryProcessor = true;
525 }
526
495 fNumColorStages = fDrawState->numColorStages(); 527 fNumColorStages = fDrawState->numColorStages();
496 for (int s = 0; s < fNumColorStages; ++s, ++i) { 528 for (int s = 0; s < fNumColorStages; ++s, ++i) {
497 fDrawState->getColorStage(s).saveCoordChange(&fSavedCoordChanges[i]); 529 fDrawState->getColorStage(s).saveCoordChange(&fSavedCoordChanges[i]);
498 fDrawState->fColorStages[s].localCoordChange(coordChangeMatrix); 530 fDrawState->fColorStages[s].localCoordChange(coordChangeMatrix);
499 } 531 }
500 532
501 int numCoverageStages = fDrawState->numCoverageStages(); 533 int numCoverageStages = fDrawState->numCoverageStages();
502 for (int s = 0; s < numCoverageStages; ++s, ++i) { 534 for (int s = 0; s < numCoverageStages; ++s, ++i) {
503 fDrawState->getCoverageStage(s).saveCoordChange(&fSavedCoordChanges[i]); 535 fDrawState->getCoverageStage(s).saveCoordChange(&fSavedCoordChanges[i]);
504 fDrawState->fCoverageStages[s].localCoordChange(coordChangeMatrix); 536 fDrawState->fCoverageStages[s].localCoordChange(coordChangeMatrix);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 uint32_t coverageComponentFlags; 568 uint32_t coverageComponentFlags;
537 if (this->hasCoverageVertexAttribute()) { 569 if (this->hasCoverageVertexAttribute()) {
538 coverageComponentFlags = 0; 570 coverageComponentFlags = 0;
539 coverage = 0; // suppresses any warnings. 571 coverage = 0; // suppresses any warnings.
540 } else { 572 } else {
541 coverageComponentFlags = kRGBA_GrColorComponentFlags; 573 coverageComponentFlags = kRGBA_GrColorComponentFlags;
542 coverage = this->getCoverageColor(); 574 coverage = this->getCoverageColor();
543 } 575 }
544 576
545 // Run through the coverage stages 577 // Run through the coverage stages
578 if (this->hasGeometryProcessor()) {
579 const GrEffect* effect = fGeometryProcessor->getEffect();
580 effect->getConstantColorComponents(&coverage, &coverageComponentFlag s);
581 }
546 for (int s = 0; s < this->numCoverageStages(); ++s) { 582 for (int s = 0; s < this->numCoverageStages(); ++s) {
547 const GrEffect* effect = this->getCoverageStage(s).getEffect(); 583 const GrEffect* effect = this->getCoverageStage(s).getEffect();
548 effect->getConstantColorComponents(&coverage, &coverageComponentFlag s); 584 effect->getConstantColorComponents(&coverage, &coverageComponentFlag s);
549 } 585 }
550 586
551 // Since the shader will multiply coverage and color, the only way the f inal A==1 is if 587 // Since the shader will multiply coverage and color, the only way the f inal A==1 is if
552 // coverage and color both have A==1. 588 // coverage and color both have A==1.
553 return (kA_GrColorComponentFlag & validComponentFlags & coverageComponen tFlags) && 589 return (kA_GrColorComponentFlag & validComponentFlags & coverageComponen tFlags) &&
554 0xFF == GrColorUnpackA(color) && 0xFF == GrColorUnpackA(coverage ); 590 0xFF == GrColorUnpackA(color) && 0xFF == GrColorUnpackA(coverage );
555 591
556 } 592 }
557 593
558 return (kA_GrColorComponentFlag & validComponentFlags) && 0xFF == GrColorUnp ackA(color); 594 return (kA_GrColorComponentFlag & validComponentFlags) && 0xFF == GrColorUnp ackA(color);
559 } 595 }
560 596
561 //////////////////////////////////////////////////////////////////////////////// 597 ////////////////////////////////////////////////////////////////////////////////
562 598
563 bool GrDrawState::canIgnoreColorAttribute() const { 599 bool GrDrawState::canIgnoreColorAttribute() const {
564 if (fBlendOptFlags & kInvalid_BlendOptFlag) { 600 if (fBlendOptFlags & kInvalid_BlendOptFlag) {
565 this->getBlendOpts(); 601 this->getBlendOpts();
566 } 602 }
567 return SkToBool(fBlendOptFlags & (GrRODrawState::kEmitTransBlack_BlendOptFla g | 603 return SkToBool(fBlendOptFlags & (GrRODrawState::kEmitTransBlack_BlendOptFla g |
568 GrRODrawState::kEmitCoverage_BlendOptFlag) ); 604 GrRODrawState::kEmitCoverage_BlendOptFlag) );
569 } 605 }
570 606
OLDNEW
« no previous file with comments | « src/gpu/GrDrawState.h ('k') | src/gpu/GrDrawTarget.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698