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

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

Issue 701123003: Remove cached OptDrawState from GrDrawState. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Update comment Created 6 years, 1 month 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/GrOptDrawState.h » ('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 9
10 #include "GrOptDrawState.h" 10 #include "GrOptDrawState.h"
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 } 102 }
103 } 103 }
104 return aIsOpaque ? kB_CombinedState : kA_CombinedState; 104 return aIsOpaque ? kB_CombinedState : kA_CombinedState;
105 } 105 }
106 } 106 }
107 return kAOrB_CombinedState; 107 return kAOrB_CombinedState;
108 } 108 }
109 109
110 //////////////////////////////////////////////////////////////////////////////s 110 //////////////////////////////////////////////////////////////////////////////s
111 111
112 GrDrawState::GrDrawState(const GrDrawState& state, const SkMatrix& preConcatMatr ix) 112 GrDrawState::GrDrawState(const GrDrawState& state, const SkMatrix& preConcatMatr ix) {
113 : fCachedOptState(NULL) {
114 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;) 113 SkDEBUGCODE(fBlockEffectRemovalCnt = 0;)
115 *this = state; 114 *this = state;
116 if (!preConcatMatrix.isIdentity()) { 115 if (!preConcatMatrix.isIdentity()) {
117 for (int i = 0; i < this->numColorStages(); ++i) { 116 for (int i = 0; i < this->numColorStages(); ++i) {
118 fColorStages[i].localCoordChange(preConcatMatrix); 117 fColorStages[i].localCoordChange(preConcatMatrix);
119 } 118 }
120 for (int i = 0; i < this->numCoverageStages(); ++i) { 119 for (int i = 0; i < this->numCoverageStages(); ++i) {
121 fCoverageStages[i].localCoordChange(preConcatMatrix); 120 fCoverageStages[i].localCoordChange(preConcatMatrix);
122 } 121 }
123 this->invalidateOptState();
124 } 122 }
125 } 123 }
126 124
127 GrDrawState& GrDrawState::operator=(const GrDrawState& that) { 125 GrDrawState& GrDrawState::operator=(const GrDrawState& that) {
128 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); 126 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages());
129 SkASSERT(!that.fRenderTarget.ownsPendingIO()); 127 SkASSERT(!that.fRenderTarget.ownsPendingIO());
130 SkASSERT(!this->fRenderTarget.ownsPendingIO()); 128 SkASSERT(!this->fRenderTarget.ownsPendingIO());
131 this->setRenderTarget(that.getRenderTarget()); 129 this->setRenderTarget(that.getRenderTarget());
132 fColor = that.fColor; 130 fColor = that.fColor;
133 fViewMatrix = that.fViewMatrix; 131 fViewMatrix = that.fViewMatrix;
(...skipping 10 matching lines...) Expand all
144 if (that.hasGeometryProcessor()) { 142 if (that.hasGeometryProcessor()) {
145 fGeometryProcessor.initAndRef(that.fGeometryProcessor); 143 fGeometryProcessor.initAndRef(that.fGeometryProcessor);
146 } else { 144 } else {
147 fGeometryProcessor.reset(NULL); 145 fGeometryProcessor.reset(NULL);
148 } 146 }
149 fColorStages = that.fColorStages; 147 fColorStages = that.fColorStages;
150 fCoverageStages = that.fCoverageStages; 148 fCoverageStages = that.fCoverageStages;
151 149
152 fHints = that.fHints; 150 fHints = that.fHints;
153 151
154 SkRefCnt_SafeAssign(fCachedOptState, that.fCachedOptState);
155
156 memcpy(fFixedFunctionVertexAttribIndices, 152 memcpy(fFixedFunctionVertexAttribIndices,
157 that.fFixedFunctionVertexAttribIndices, 153 that.fFixedFunctionVertexAttribIndices,
158 sizeof(fFixedFunctionVertexAttribIndices)); 154 sizeof(fFixedFunctionVertexAttribIndices));
159 return *this; 155 return *this;
160 } 156 }
161 157
162 void GrDrawState::onReset(const SkMatrix* initialViewMatrix) { 158 void GrDrawState::onReset(const SkMatrix* initialViewMatrix) {
163 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); 159 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages());
164 SkASSERT(!fRenderTarget.ownsPendingIO()); 160 SkASSERT(!fRenderTarget.ownsPendingIO());
165 161
(...skipping 13 matching lines...) Expand all
179 } 175 }
180 fSrcBlend = kOne_GrBlendCoeff; 176 fSrcBlend = kOne_GrBlendCoeff;
181 fDstBlend = kZero_GrBlendCoeff; 177 fDstBlend = kZero_GrBlendCoeff;
182 fBlendConstant = 0x0; 178 fBlendConstant = 0x0;
183 fFlagBits = 0x0; 179 fFlagBits = 0x0;
184 fStencilSettings.setDisabled(); 180 fStencilSettings.setDisabled();
185 fCoverage = 0xff; 181 fCoverage = 0xff;
186 fDrawFace = kBoth_DrawFace; 182 fDrawFace = kBoth_DrawFace;
187 183
188 fHints = 0; 184 fHints = 0;
189
190 this->invalidateOptState();
191 } 185 }
192 186
193 bool GrDrawState::setIdentityViewMatrix() { 187 bool GrDrawState::setIdentityViewMatrix() {
194 if (this->numTotalStages()) { 188 if (this->numTotalStages()) {
195 SkMatrix invVM; 189 SkMatrix invVM;
196 if (!fViewMatrix.invert(&invVM)) { 190 if (!fViewMatrix.invert(&invVM)) {
197 // sad trombone sound 191 // sad trombone sound
198 return false; 192 return false;
199 } 193 }
200 for (int s = 0; s < this->numColorStages(); ++s) { 194 for (int s = 0; s < this->numColorStages(); ++s) {
201 fColorStages[s].localCoordChange(invVM); 195 fColorStages[s].localCoordChange(invVM);
202 } 196 }
203 for (int s = 0; s < this->numCoverageStages(); ++s) { 197 for (int s = 0; s < this->numCoverageStages(); ++s) {
204 fCoverageStages[s].localCoordChange(invVM); 198 fCoverageStages[s].localCoordChange(invVM);
205 } 199 }
206 } 200 }
207 this->invalidateOptState();
208 fViewMatrix.reset(); 201 fViewMatrix.reset();
209 return true; 202 return true;
210 } 203 }
211 204
212 void GrDrawState::setFromPaint(const GrPaint& paint, const SkMatrix& vm, GrRende rTarget* rt) { 205 void GrDrawState::setFromPaint(const GrPaint& paint, const SkMatrix& vm, GrRende rTarget* rt) {
213 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); 206 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages());
214 207
215 fGeometryProcessor.reset(NULL); 208 fGeometryProcessor.reset(NULL);
216 fColorStages.reset(); 209 fColorStages.reset();
217 fCoverageStages.reset(); 210 fCoverageStages.reset();
(...skipping 19 matching lines...) Expand all
237 230
238 // Enable the clip bit 231 // Enable the clip bit
239 this->enableState(GrDrawState::kClip_StateBit); 232 this->enableState(GrDrawState::kClip_StateBit);
240 233
241 this->setColor(paint.getColor()); 234 this->setColor(paint.getColor());
242 this->setState(GrDrawState::kDither_StateBit, paint.isDither()); 235 this->setState(GrDrawState::kDither_StateBit, paint.isDither());
243 this->setState(GrDrawState::kHWAntialias_StateBit, paint.isAntiAlias()); 236 this->setState(GrDrawState::kHWAntialias_StateBit, paint.isAntiAlias());
244 237
245 this->setBlendFunc(paint.getSrcBlendCoeff(), paint.getDstBlendCoeff()); 238 this->setBlendFunc(paint.getSrcBlendCoeff(), paint.getDstBlendCoeff());
246 this->setCoverage(paint.getCoverage()); 239 this->setCoverage(paint.getCoverage());
247 this->invalidateOptState();
248 } 240 }
249 241
250 //////////////////////////////////////////////////////////////////////////////// 242 ////////////////////////////////////////////////////////////////////////////////
251 243
252 bool GrDrawState::validateVertexAttribs() const { 244 bool GrDrawState::validateVertexAttribs() const {
253 // check consistency of effects and attributes 245 // check consistency of effects and attributes
254 GrSLType slTypes[kMaxVertexAttribCnt]; 246 GrSLType slTypes[kMaxVertexAttribCnt];
255 for (int i = 0; i < kMaxVertexAttribCnt; ++i) { 247 for (int i = 0; i < kMaxVertexAttribCnt; ++i) {
256 slTypes[i] = static_cast<GrSLType>(-1); 248 slTypes[i] = static_cast<GrSLType>(-1);
257 } 249 }
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 fFixedFunctionVertexAttribIndices[attribs[i].fBinding] = i; 327 fFixedFunctionVertexAttribIndices[attribs[i].fBinding] = i;
336 } 328 }
337 #ifdef SK_DEBUG 329 #ifdef SK_DEBUG
338 size_t dwordCount = GrVertexAttribTypeSize(attribs[i].fType) >> 2; 330 size_t dwordCount = GrVertexAttribTypeSize(attribs[i].fType) >> 2;
339 uint32_t mask = (1 << dwordCount)-1; 331 uint32_t mask = (1 << dwordCount)-1;
340 size_t offsetShift = attribs[i].fOffset >> 2; 332 size_t offsetShift = attribs[i].fOffset >> 2;
341 SkASSERT(!(overlapCheck & (mask << offsetShift))); 333 SkASSERT(!(overlapCheck & (mask << offsetShift)));
342 overlapCheck |= (mask << offsetShift); 334 overlapCheck |= (mask << offsetShift);
343 #endif 335 #endif
344 } 336 }
345 this->invalidateOptState();
346 // Positions must be specified. 337 // Positions must be specified.
347 SkASSERT(-1 != fFixedFunctionVertexAttribIndices[kPosition_GrVertexAttribBin ding]); 338 SkASSERT(-1 != fFixedFunctionVertexAttribIndices[kPosition_GrVertexAttribBin ding]);
348 } 339 }
349 340
350 //////////////////////////////////////////////////////////////////////////////// 341 ////////////////////////////////////////////////////////////////////////////////
351 342
352 void GrDrawState::setDefaultVertexAttribs() { 343 void GrDrawState::setDefaultVertexAttribs() {
353 static const GrVertexAttrib kPositionAttrib = 344 static const GrVertexAttrib kPositionAttrib =
354 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding}; 345 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding};
355 346
356 fVAPtr = &kPositionAttrib; 347 fVAPtr = &kPositionAttrib;
357 fVACount = 1; 348 fVACount = 1;
358 fVAStride = GrVertexAttribTypeSize(kVec2f_GrVertexAttribType); 349 fVAStride = GrVertexAttribTypeSize(kVec2f_GrVertexAttribType);
359 350
360 // set all the fixed function indices to -1 except position. 351 // set all the fixed function indices to -1 except position.
361 memset(fFixedFunctionVertexAttribIndices, 352 memset(fFixedFunctionVertexAttribIndices,
362 0xff, 353 0xff,
363 sizeof(fFixedFunctionVertexAttribIndices)); 354 sizeof(fFixedFunctionVertexAttribIndices));
364 fFixedFunctionVertexAttribIndices[kPosition_GrVertexAttribBinding] = 0; 355 fFixedFunctionVertexAttribIndices[kPosition_GrVertexAttribBinding] = 0;
365 this->invalidateOptState();
366 } 356 }
367 357
368 //////////////////////////////////////////////////////////////////////////////// 358 ////////////////////////////////////////////////////////////////////////////////
369 359
370 bool GrDrawState::couldApplyCoverage(const GrDrawTargetCaps& caps) const { 360 bool GrDrawState::couldApplyCoverage(const GrDrawTargetCaps& caps) const {
371 if (caps.dualSourceBlendingSupport()) { 361 if (caps.dualSourceBlendingSupport()) {
372 return true; 362 return true;
373 } 363 }
374 // we can correctly apply coverage if a) we have dual source blending 364 // we can correctly apply coverage if a) we have dual source blending
375 // or b) one of our blend optimizations applies 365 // or b) one of our blend optimizations applies
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
450 fOriginalGPID = SK_InvalidUniqueID; 440 fOriginalGPID = SK_InvalidUniqueID;
451 } 441 }
452 442
453 int m = fDrawState->numColorStages() - fColorEffectCnt; 443 int m = fDrawState->numColorStages() - fColorEffectCnt;
454 SkASSERT(m >= 0); 444 SkASSERT(m >= 0);
455 fDrawState->fColorStages.pop_back_n(m); 445 fDrawState->fColorStages.pop_back_n(m);
456 446
457 int n = fDrawState->numCoverageStages() - fCoverageEffectCnt; 447 int n = fDrawState->numCoverageStages() - fCoverageEffectCnt;
458 SkASSERT(n >= 0); 448 SkASSERT(n >= 0);
459 fDrawState->fCoverageStages.pop_back_n(n); 449 fDrawState->fCoverageStages.pop_back_n(n);
460 if (m + n > 0) {
461 fDrawState->invalidateOptState();
462 }
463 SkDEBUGCODE(--fDrawState->fBlockEffectRemovalCnt;) 450 SkDEBUGCODE(--fDrawState->fBlockEffectRemovalCnt;)
464 } 451 }
465 fDrawState = ds; 452 fDrawState = ds;
466 if (NULL != ds) { 453 if (NULL != ds) {
467 SkASSERT(SK_InvalidUniqueID == fOriginalGPID); 454 SkASSERT(SK_InvalidUniqueID == fOriginalGPID);
468 if (NULL != ds->getGeometryProcessor()) { 455 if (NULL != ds->getGeometryProcessor()) {
469 fOriginalGPID = ds->getGeometryProcessor()->getUniqueID(); 456 fOriginalGPID = ds->getGeometryProcessor()->getUniqueID();
470 } 457 }
471 fColorEffectCnt = ds->numColorStages(); 458 fColorEffectCnt = ds->numColorStages();
472 fCoverageEffectCnt = ds->numCoverageStages(); 459 fCoverageEffectCnt = ds->numCoverageStages();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
506 int numCoverageStages = fSavedCoordChanges.count() - fNumColorStages; 493 int numCoverageStages = fSavedCoordChanges.count() - fNumColorStages;
507 SkASSERT(fDrawState->numCoverageStages() >= numCoverageStages); 494 SkASSERT(fDrawState->numCoverageStages() >= numCoverageStages);
508 495
509 int i = 0; 496 int i = 0;
510 for (int s = 0; s < fNumColorStages; ++s, ++i) { 497 for (int s = 0; s < fNumColorStages; ++s, ++i) {
511 fDrawState->fColorStages[s].restoreCoordChange(fSavedCoordChanges[i] ); 498 fDrawState->fColorStages[s].restoreCoordChange(fSavedCoordChanges[i] );
512 } 499 }
513 for (int s = 0; s < numCoverageStages; ++s, ++i) { 500 for (int s = 0; s < numCoverageStages; ++s, ++i) {
514 fDrawState->fCoverageStages[s].restoreCoordChange(fSavedCoordChanges [i]); 501 fDrawState->fCoverageStages[s].restoreCoordChange(fSavedCoordChanges [i]);
515 } 502 }
516 fDrawState->invalidateOptState();
517 fDrawState = NULL; 503 fDrawState = NULL;
518 } 504 }
519 } 505 }
520 506
521 void GrDrawState::AutoViewMatrixRestore::set(GrDrawState* drawState, 507 void GrDrawState::AutoViewMatrixRestore::set(GrDrawState* drawState,
522 const SkMatrix& preconcatMatrix) { 508 const SkMatrix& preconcatMatrix) {
523 this->restore(); 509 this->restore();
524 510
525 SkASSERT(NULL == fDrawState); 511 SkASSERT(NULL == fDrawState);
526 if (NULL == drawState || preconcatMatrix.isIdentity()) { 512 if (NULL == drawState || preconcatMatrix.isIdentity()) {
527 return; 513 return;
528 } 514 }
529 fDrawState = drawState; 515 fDrawState = drawState;
530 516
531 fViewMatrix = drawState->getViewMatrix(); 517 fViewMatrix = drawState->getViewMatrix();
532 drawState->fViewMatrix.preConcat(preconcatMatrix); 518 drawState->fViewMatrix.preConcat(preconcatMatrix);
533 519
534 this->doEffectCoordChanges(preconcatMatrix); 520 this->doEffectCoordChanges(preconcatMatrix);
535 SkDEBUGCODE(++fDrawState->fBlockEffectRemovalCnt;) 521 SkDEBUGCODE(++fDrawState->fBlockEffectRemovalCnt;)
536 drawState->invalidateOptState();
537 } 522 }
538 523
539 bool GrDrawState::AutoViewMatrixRestore::setIdentity(GrDrawState* drawState) { 524 bool GrDrawState::AutoViewMatrixRestore::setIdentity(GrDrawState* drawState) {
540 this->restore(); 525 this->restore();
541 526
542 if (NULL == drawState) { 527 if (NULL == drawState) {
543 return false; 528 return false;
544 } 529 }
545 530
546 if (drawState->getViewMatrix().isIdentity()) { 531 if (drawState->getViewMatrix().isIdentity()) {
547 return true; 532 return true;
548 } 533 }
549 534
550 drawState->invalidateOptState();
551 fViewMatrix = drawState->getViewMatrix(); 535 fViewMatrix = drawState->getViewMatrix();
552 if (0 == drawState->numTotalStages()) { 536 if (0 == drawState->numTotalStages()) {
553 drawState->fViewMatrix.reset(); 537 drawState->fViewMatrix.reset();
554 fDrawState = drawState; 538 fDrawState = drawState;
555 fNumColorStages = 0; 539 fNumColorStages = 0;
556 fSavedCoordChanges.reset(0); 540 fSavedCoordChanges.reset(0);
557 SkDEBUGCODE(++fDrawState->fBlockEffectRemovalCnt;) 541 SkDEBUGCODE(++fDrawState->fBlockEffectRemovalCnt;)
558 return true; 542 return true;
559 } else { 543 } else {
560 SkMatrix inv; 544 SkMatrix inv;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 if (fGeometryProcessor) { 581 if (fGeometryProcessor) {
598 fGeometryProcessor.convertToPendingExec(); 582 fGeometryProcessor.convertToPendingExec();
599 } 583 }
600 for (int i = 0; i < fCoverageStages.count(); ++i) { 584 for (int i = 0; i < fCoverageStages.count(); ++i) {
601 fCoverageStages[i].convertToPendingExec(); 585 fCoverageStages[i].convertToPendingExec();
602 } 586 }
603 } 587 }
604 588
605 //////////////////////////////////////////////////////////////////////////////// 589 ////////////////////////////////////////////////////////////////////////////////
606 590
607 void GrDrawState::invalidateOptState() const {
608 SkSafeSetNull(fCachedOptState);
609 }
610
611 ////////////////////////////////////////////////////////////////////////////////
612
613 GrDrawState::~GrDrawState() { 591 GrDrawState::~GrDrawState() {
614 SkSafeUnref(fCachedOptState);
615 SkASSERT(0 == fBlockEffectRemovalCnt); 592 SkASSERT(0 == fBlockEffectRemovalCnt);
616 } 593 }
617 594
618 //////////////////////////////////////////////////////////////////////////////// 595 ////////////////////////////////////////////////////////////////////////////////
619 596
620 GrDrawState::BlendOptFlags GrDrawState::getBlendOpts(bool forceCoverage, 597 GrDrawState::BlendOptFlags GrDrawState::getBlendOpts(bool forceCoverage,
621 GrBlendCoeff* srcCoeff, 598 GrBlendCoeff* srcCoeff,
622 GrBlendCoeff* dstCoeff) con st { 599 GrBlendCoeff* dstCoeff) con st {
623 GrBlendCoeff bogusSrcCoeff, bogusDstCoeff; 600 GrBlendCoeff bogusSrcCoeff, bogusDstCoeff;
624 if (NULL == srcCoeff) { 601 if (NULL == srcCoeff) {
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
758 } 735 }
759 736
760 // Since the shader will multiply coverage and color, the only way the f inal A==1 is if 737 // Since the shader will multiply coverage and color, the only way the f inal A==1 is if
761 // coverage and color both have A==1. 738 // coverage and color both have A==1.
762 return (inoutColor.isOpaque() && inoutCoverage.isOpaque()); 739 return (inoutColor.isOpaque() && inoutCoverage.isOpaque());
763 } 740 }
764 741
765 return inoutColor.isOpaque(); 742 return inoutColor.isOpaque();
766 } 743 }
767 744
OLDNEW
« no previous file with comments | « src/gpu/GrDrawState.h ('k') | src/gpu/GrOptDrawState.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698