| OLD | NEW |
| 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 | 10 |
| 11 bool GrDrawState::setIdentityViewMatrix() { | 11 bool GrDrawState::setIdentityViewMatrix() { |
| 12 if (fColorStages.count() || fCoverageStages.count()) { | 12 if (fColorStages.count() || fCoverageStages.count()) { |
| 13 SkMatrix invVM; | 13 SkMatrix invVM; |
| 14 if (!fCommon.fViewMatrix.invert(&invVM)) { | 14 if (!fCommon.fViewMatrix.invert(&invVM)) { |
| 15 // sad trombone sound | 15 // sad trombone sound |
| 16 return false; | 16 return false; |
| 17 } | 17 } |
| 18 for (int s = 0; s < fColorStages.count(); ++s) { | 18 for (int s = 0; s < fColorStages.count(); ++s) { |
| 19 fColorStages[s].localCoordChange(invVM); | 19 fColorStages[s].localCoordChange(invVM); |
| 20 } | 20 } |
| 21 for (int s = 0; s < fCoverageStages.count(); ++s) { | 21 for (int s = 0; s < fCoverageStages.count(); ++s) { |
| 22 fCoverageStages[s].localCoordChange(invVM); | 22 fCoverageStages[s].localCoordChange(invVM); |
| 23 } | 23 } |
| 24 } | 24 } |
| 25 fCommon.fViewMatrix.reset(); | 25 fCommon.fViewMatrix.reset(); |
| 26 return true; | 26 return true; |
| 27 } | 27 } |
| 28 | 28 |
| 29 void GrDrawState::setFromPaint(const GrPaint& paint, const SkMatrix& vm, GrRende
rTarget* rt) { | 29 void GrDrawState::setFromPaint(const GrPaint& paint, const SkMatrix& vm, GrRende
rTarget* rt) { |
| 30 GrAssert(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); | 30 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); |
| 31 | 31 |
| 32 fColorStages.reset(); | 32 fColorStages.reset(); |
| 33 fCoverageStages.reset(); | 33 fCoverageStages.reset(); |
| 34 | 34 |
| 35 for (int i = 0; i < paint.numColorStages(); ++i) { | 35 for (int i = 0; i < paint.numColorStages(); ++i) { |
| 36 fColorStages.push_back(paint.getColorStage(i)); | 36 fColorStages.push_back(paint.getColorStage(i)); |
| 37 } | 37 } |
| 38 | 38 |
| 39 for (int i = 0; i < paint.numCoverageStages(); ++i) { | 39 for (int i = 0; i < paint.numCoverageStages(); ++i) { |
| 40 fCoverageStages.push_back(paint.getCoverageStage(i)); | 40 fCoverageStages.push_back(paint.getCoverageStage(i)); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 63 this->setCoverage(paint.getCoverage()); | 63 this->setCoverage(paint.getCoverage()); |
| 64 } | 64 } |
| 65 | 65 |
| 66 //////////////////////////////////////////////////////////////////////////////// | 66 //////////////////////////////////////////////////////////////////////////////// |
| 67 | 67 |
| 68 static size_t vertex_size(const GrVertexAttrib* attribs, int count) { | 68 static size_t vertex_size(const GrVertexAttrib* attribs, int count) { |
| 69 // this works as long as we're 4 byte-aligned | 69 // this works as long as we're 4 byte-aligned |
| 70 #if GR_DEBUG | 70 #if GR_DEBUG |
| 71 uint32_t overlapCheck = 0; | 71 uint32_t overlapCheck = 0; |
| 72 #endif | 72 #endif |
| 73 GrAssert(count <= GrDrawState::kMaxVertexAttribCnt); | 73 SkASSERT(count <= GrDrawState::kMaxVertexAttribCnt); |
| 74 size_t size = 0; | 74 size_t size = 0; |
| 75 for (int index = 0; index < count; ++index) { | 75 for (int index = 0; index < count; ++index) { |
| 76 size_t attribSize = GrVertexAttribTypeSize(attribs[index].fType); | 76 size_t attribSize = GrVertexAttribTypeSize(attribs[index].fType); |
| 77 size += attribSize; | 77 size += attribSize; |
| 78 #if GR_DEBUG | 78 #if GR_DEBUG |
| 79 size_t dwordCount = attribSize >> 2; | 79 size_t dwordCount = attribSize >> 2; |
| 80 uint32_t mask = (1 << dwordCount)-1; | 80 uint32_t mask = (1 << dwordCount)-1; |
| 81 size_t offsetShift = attribs[index].fOffset >> 2; | 81 size_t offsetShift = attribs[index].fOffset >> 2; |
| 82 GrAssert(!(overlapCheck & (mask << offsetShift))); | 82 SkASSERT(!(overlapCheck & (mask << offsetShift))); |
| 83 overlapCheck |= (mask << offsetShift); | 83 overlapCheck |= (mask << offsetShift); |
| 84 #endif | 84 #endif |
| 85 } | 85 } |
| 86 return size; | 86 return size; |
| 87 } | 87 } |
| 88 | 88 |
| 89 size_t GrDrawState::getVertexSize() const { | 89 size_t GrDrawState::getVertexSize() const { |
| 90 return vertex_size(fCommon.fVAPtr, fCommon.fVACount); | 90 return vertex_size(fCommon.fVAPtr, fCommon.fVACount); |
| 91 } | 91 } |
| 92 | 92 |
| 93 //////////////////////////////////////////////////////////////////////////////// | 93 //////////////////////////////////////////////////////////////////////////////// |
| 94 | 94 |
| 95 void GrDrawState::setVertexAttribs(const GrVertexAttrib* attribs, int count) { | 95 void GrDrawState::setVertexAttribs(const GrVertexAttrib* attribs, int count) { |
| 96 GrAssert(count <= kMaxVertexAttribCnt); | 96 SkASSERT(count <= kMaxVertexAttribCnt); |
| 97 | 97 |
| 98 fCommon.fVAPtr = attribs; | 98 fCommon.fVAPtr = attribs; |
| 99 fCommon.fVACount = count; | 99 fCommon.fVACount = count; |
| 100 | 100 |
| 101 // Set all the indices to -1 | 101 // Set all the indices to -1 |
| 102 memset(fCommon.fFixedFunctionVertexAttribIndices, | 102 memset(fCommon.fFixedFunctionVertexAttribIndices, |
| 103 0xff, | 103 0xff, |
| 104 sizeof(fCommon.fFixedFunctionVertexAttribIndices)); | 104 sizeof(fCommon.fFixedFunctionVertexAttribIndices)); |
| 105 #if GR_DEBUG | 105 #if GR_DEBUG |
| 106 uint32_t overlapCheck = 0; | 106 uint32_t overlapCheck = 0; |
| 107 #endif | 107 #endif |
| 108 for (int i = 0; i < count; ++i) { | 108 for (int i = 0; i < count; ++i) { |
| 109 if (attribs[i].fBinding < kGrFixedFunctionVertexAttribBindingCnt) { | 109 if (attribs[i].fBinding < kGrFixedFunctionVertexAttribBindingCnt) { |
| 110 // The fixed function attribs can only be specified once | 110 // The fixed function attribs can only be specified once |
| 111 GrAssert(-1 == fCommon.fFixedFunctionVertexAttribIndices[attribs[i].
fBinding]); | 111 SkASSERT(-1 == fCommon.fFixedFunctionVertexAttribIndices[attribs[i].
fBinding]); |
| 112 GrAssert(GrFixedFunctionVertexAttribVectorCount(attribs[i].fBinding)
== | 112 SkASSERT(GrFixedFunctionVertexAttribVectorCount(attribs[i].fBinding)
== |
| 113 GrVertexAttribTypeVectorCount(attribs[i].fType)); | 113 GrVertexAttribTypeVectorCount(attribs[i].fType)); |
| 114 fCommon.fFixedFunctionVertexAttribIndices[attribs[i].fBinding] = i; | 114 fCommon.fFixedFunctionVertexAttribIndices[attribs[i].fBinding] = i; |
| 115 } | 115 } |
| 116 #if GR_DEBUG | 116 #if GR_DEBUG |
| 117 size_t dwordCount = GrVertexAttribTypeSize(attribs[i].fType) >> 2; | 117 size_t dwordCount = GrVertexAttribTypeSize(attribs[i].fType) >> 2; |
| 118 uint32_t mask = (1 << dwordCount)-1; | 118 uint32_t mask = (1 << dwordCount)-1; |
| 119 size_t offsetShift = attribs[i].fOffset >> 2; | 119 size_t offsetShift = attribs[i].fOffset >> 2; |
| 120 GrAssert(!(overlapCheck & (mask << offsetShift))); | 120 SkASSERT(!(overlapCheck & (mask << offsetShift))); |
| 121 overlapCheck |= (mask << offsetShift); | 121 overlapCheck |= (mask << offsetShift); |
| 122 #endif | 122 #endif |
| 123 } | 123 } |
| 124 // Positions must be specified. | 124 // Positions must be specified. |
| 125 GrAssert(-1 != fCommon.fFixedFunctionVertexAttribIndices[kPosition_GrVertexA
ttribBinding]); | 125 SkASSERT(-1 != fCommon.fFixedFunctionVertexAttribIndices[kPosition_GrVertexA
ttribBinding]); |
| 126 } | 126 } |
| 127 | 127 |
| 128 //////////////////////////////////////////////////////////////////////////////// | 128 //////////////////////////////////////////////////////////////////////////////// |
| 129 | 129 |
| 130 void GrDrawState::setDefaultVertexAttribs() { | 130 void GrDrawState::setDefaultVertexAttribs() { |
| 131 static const GrVertexAttrib kPositionAttrib = | 131 static const GrVertexAttrib kPositionAttrib = |
| 132 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding}; | 132 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding}; |
| 133 | 133 |
| 134 fCommon.fVAPtr = &kPositionAttrib; | 134 fCommon.fVAPtr = &kPositionAttrib; |
| 135 fCommon.fVACount = 1; | 135 fCommon.fVACount = 1; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 147 // check consistency of effects and attributes | 147 // check consistency of effects and attributes |
| 148 GrSLType slTypes[kMaxVertexAttribCnt]; | 148 GrSLType slTypes[kMaxVertexAttribCnt]; |
| 149 for (int i = 0; i < kMaxVertexAttribCnt; ++i) { | 149 for (int i = 0; i < kMaxVertexAttribCnt; ++i) { |
| 150 slTypes[i] = static_cast<GrSLType>(-1); | 150 slTypes[i] = static_cast<GrSLType>(-1); |
| 151 } | 151 } |
| 152 int totalStages = fColorStages.count() + fCoverageStages.count(); | 152 int totalStages = fColorStages.count() + fCoverageStages.count(); |
| 153 for (int s = 0; s < totalStages; ++s) { | 153 for (int s = 0; s < totalStages; ++s) { |
| 154 int covIdx = s - fColorStages.count(); | 154 int covIdx = s - fColorStages.count(); |
| 155 const GrEffectStage& stage = covIdx < 0 ? fColorStages[s] : fCoverageSta
ges[covIdx]; | 155 const GrEffectStage& stage = covIdx < 0 ? fColorStages[s] : fCoverageSta
ges[covIdx]; |
| 156 const GrEffectRef* effect = stage.getEffect(); | 156 const GrEffectRef* effect = stage.getEffect(); |
| 157 GrAssert(NULL != effect); | 157 SkASSERT(NULL != effect); |
| 158 // make sure that any attribute indices have the correct binding type, t
hat the attrib | 158 // make sure that any attribute indices have the correct binding type, t
hat the attrib |
| 159 // type and effect's shader lang type are compatible, and that attribute
s shared by | 159 // type and effect's shader lang type are compatible, and that attribute
s shared by |
| 160 // multiple effects use the same shader lang type. | 160 // multiple effects use the same shader lang type. |
| 161 const int* attributeIndices = stage.getVertexAttribIndices(); | 161 const int* attributeIndices = stage.getVertexAttribIndices(); |
| 162 int numAttributes = stage.getVertexAttribIndexCount(); | 162 int numAttributes = stage.getVertexAttribIndexCount(); |
| 163 for (int i = 0; i < numAttributes; ++i) { | 163 for (int i = 0; i < numAttributes; ++i) { |
| 164 int attribIndex = attributeIndices[i]; | 164 int attribIndex = attributeIndices[i]; |
| 165 if (attribIndex >= fCommon.fVACount || | 165 if (attribIndex >= fCommon.fVACount || |
| 166 kEffect_GrVertexAttribBinding != fCommon.fVAPtr[attribIndex].fBi
nding) { | 166 kEffect_GrVertexAttribBinding != fCommon.fVAPtr[attribIndex].fBi
nding) { |
| 167 return false; | 167 return false; |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 } | 395 } |
| 396 return kNone_BlendOpt; | 396 return kNone_BlendOpt; |
| 397 } | 397 } |
| 398 | 398 |
| 399 //////////////////////////////////////////////////////////////////////////////// | 399 //////////////////////////////////////////////////////////////////////////////// |
| 400 | 400 |
| 401 void GrDrawState::AutoViewMatrixRestore::restore() { | 401 void GrDrawState::AutoViewMatrixRestore::restore() { |
| 402 if (NULL != fDrawState) { | 402 if (NULL != fDrawState) { |
| 403 GR_DEBUGCODE(--fDrawState->fBlockEffectRemovalCnt;) | 403 GR_DEBUGCODE(--fDrawState->fBlockEffectRemovalCnt;) |
| 404 fDrawState->fCommon.fViewMatrix = fViewMatrix; | 404 fDrawState->fCommon.fViewMatrix = fViewMatrix; |
| 405 GrAssert(fDrawState->numColorStages() >= fNumColorStages); | 405 SkASSERT(fDrawState->numColorStages() >= fNumColorStages); |
| 406 int numCoverageStages = fSavedCoordChanges.count() - fNumColorStages; | 406 int numCoverageStages = fSavedCoordChanges.count() - fNumColorStages; |
| 407 GrAssert(fDrawState->numCoverageStages() >= numCoverageStages); | 407 SkASSERT(fDrawState->numCoverageStages() >= numCoverageStages); |
| 408 | 408 |
| 409 int i = 0; | 409 int i = 0; |
| 410 for (int s = 0; s < fNumColorStages; ++s, ++i) { | 410 for (int s = 0; s < fNumColorStages; ++s, ++i) { |
| 411 fDrawState->fColorStages[s].restoreCoordChange(fSavedCoordChanges[i]
); | 411 fDrawState->fColorStages[s].restoreCoordChange(fSavedCoordChanges[i]
); |
| 412 } | 412 } |
| 413 for (int s = 0; s < numCoverageStages; ++s, ++i) { | 413 for (int s = 0; s < numCoverageStages; ++s, ++i) { |
| 414 fDrawState->fCoverageStages[s].restoreCoordChange(fSavedCoordChanges
[i]); | 414 fDrawState->fCoverageStages[s].restoreCoordChange(fSavedCoordChanges
[i]); |
| 415 } | 415 } |
| 416 fDrawState = NULL; | 416 fDrawState = NULL; |
| 417 } | 417 } |
| 418 } | 418 } |
| 419 | 419 |
| 420 void GrDrawState::AutoViewMatrixRestore::set(GrDrawState* drawState, | 420 void GrDrawState::AutoViewMatrixRestore::set(GrDrawState* drawState, |
| 421 const SkMatrix& preconcatMatrix) { | 421 const SkMatrix& preconcatMatrix) { |
| 422 this->restore(); | 422 this->restore(); |
| 423 | 423 |
| 424 GrAssert(NULL == fDrawState); | 424 SkASSERT(NULL == fDrawState); |
| 425 if (NULL == drawState || preconcatMatrix.isIdentity()) { | 425 if (NULL == drawState || preconcatMatrix.isIdentity()) { |
| 426 return; | 426 return; |
| 427 } | 427 } |
| 428 fDrawState = drawState; | 428 fDrawState = drawState; |
| 429 | 429 |
| 430 fViewMatrix = drawState->getViewMatrix(); | 430 fViewMatrix = drawState->getViewMatrix(); |
| 431 drawState->fCommon.fViewMatrix.preConcat(preconcatMatrix); | 431 drawState->fCommon.fViewMatrix.preConcat(preconcatMatrix); |
| 432 | 432 |
| 433 this->doEffectCoordChanges(preconcatMatrix); | 433 this->doEffectCoordChanges(preconcatMatrix); |
| 434 GR_DEBUGCODE(++fDrawState->fBlockEffectRemovalCnt;) | 434 GR_DEBUGCODE(++fDrawState->fBlockEffectRemovalCnt;) |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 fDrawState->fColorStages[s].saveCoordChange(&fSavedCoordChanges[i]); | 475 fDrawState->fColorStages[s].saveCoordChange(&fSavedCoordChanges[i]); |
| 476 fDrawState->fColorStages[s].localCoordChange(coordChangeMatrix); | 476 fDrawState->fColorStages[s].localCoordChange(coordChangeMatrix); |
| 477 } | 477 } |
| 478 | 478 |
| 479 int numCoverageStages = fDrawState->numCoverageStages(); | 479 int numCoverageStages = fDrawState->numCoverageStages(); |
| 480 for (int s = 0; s < numCoverageStages; ++s, ++i) { | 480 for (int s = 0; s < numCoverageStages; ++s, ++i) { |
| 481 fDrawState->fCoverageStages[s].saveCoordChange(&fSavedCoordChanges[i]); | 481 fDrawState->fCoverageStages[s].saveCoordChange(&fSavedCoordChanges[i]); |
| 482 fDrawState->fCoverageStages[s].localCoordChange(coordChangeMatrix); | 482 fDrawState->fCoverageStages[s].localCoordChange(coordChangeMatrix); |
| 483 } | 483 } |
| 484 } | 484 } |
| OLD | NEW |