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 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 | 52 |
53 // Enable the clip bit | 53 // Enable the clip bit |
54 this->enableState(GrDrawState::kClip_StateBit); | 54 this->enableState(GrDrawState::kClip_StateBit); |
55 | 55 |
56 this->setColor(paint.getColor()); | 56 this->setColor(paint.getColor()); |
57 this->setState(GrDrawState::kDither_StateBit, paint.isDither()); | 57 this->setState(GrDrawState::kDither_StateBit, paint.isDither()); |
58 this->setState(GrDrawState::kHWAntialias_StateBit, paint.isAntiAlias()); | 58 this->setState(GrDrawState::kHWAntialias_StateBit, paint.isAntiAlias()); |
59 | 59 |
60 this->setBlendFunc(paint.getSrcBlendCoeff(), paint.getDstBlendCoeff()); | 60 this->setBlendFunc(paint.getSrcBlendCoeff(), paint.getDstBlendCoeff()); |
61 this->setCoverage(paint.getCoverage()); | 61 this->setCoverage(paint.getCoverage()); |
| 62 this->invalidateBlendOptFlags(); |
62 } | 63 } |
63 | 64 |
64 //////////////////////////////////////////////////////////////////////////////// | 65 //////////////////////////////////////////////////////////////////////////////// |
65 | 66 |
66 static size_t vertex_size(const GrVertexAttrib* attribs, int count) { | 67 static size_t vertex_size(const GrVertexAttrib* attribs, int count) { |
67 // this works as long as we're 4 byte-aligned | 68 // this works as long as we're 4 byte-aligned |
68 #ifdef SK_DEBUG | 69 #ifdef SK_DEBUG |
69 uint32_t overlapCheck = 0; | 70 uint32_t overlapCheck = 0; |
70 #endif | 71 #endif |
71 SkASSERT(count <= GrDrawState::kMaxVertexAttribCnt); | 72 SkASSERT(count <= GrDrawState::kMaxVertexAttribCnt); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 fFixedFunctionVertexAttribIndices[attribs[i].fBinding] = i; | 113 fFixedFunctionVertexAttribIndices[attribs[i].fBinding] = i; |
113 } | 114 } |
114 #ifdef SK_DEBUG | 115 #ifdef SK_DEBUG |
115 size_t dwordCount = GrVertexAttribTypeSize(attribs[i].fType) >> 2; | 116 size_t dwordCount = GrVertexAttribTypeSize(attribs[i].fType) >> 2; |
116 uint32_t mask = (1 << dwordCount)-1; | 117 uint32_t mask = (1 << dwordCount)-1; |
117 size_t offsetShift = attribs[i].fOffset >> 2; | 118 size_t offsetShift = attribs[i].fOffset >> 2; |
118 SkASSERT(!(overlapCheck & (mask << offsetShift))); | 119 SkASSERT(!(overlapCheck & (mask << offsetShift))); |
119 overlapCheck |= (mask << offsetShift); | 120 overlapCheck |= (mask << offsetShift); |
120 #endif | 121 #endif |
121 } | 122 } |
| 123 this->invalidateBlendOptFlags(); |
122 // Positions must be specified. | 124 // Positions must be specified. |
123 SkASSERT(-1 != fFixedFunctionVertexAttribIndices[kPosition_GrVertexAttribBin
ding]); | 125 SkASSERT(-1 != fFixedFunctionVertexAttribIndices[kPosition_GrVertexAttribBin
ding]); |
124 } | 126 } |
125 | 127 |
126 //////////////////////////////////////////////////////////////////////////////// | 128 //////////////////////////////////////////////////////////////////////////////// |
127 | 129 |
128 void GrDrawState::setDefaultVertexAttribs() { | 130 void GrDrawState::setDefaultVertexAttribs() { |
129 static const GrVertexAttrib kPositionAttrib = | 131 static const GrVertexAttrib kPositionAttrib = |
130 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding}; | 132 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding}; |
131 | 133 |
132 fVAPtr = &kPositionAttrib; | 134 fVAPtr = &kPositionAttrib; |
133 fVACount = 1; | 135 fVACount = 1; |
134 | 136 |
135 // set all the fixed function indices to -1 except position. | 137 // set all the fixed function indices to -1 except position. |
136 memset(fFixedFunctionVertexAttribIndices, | 138 memset(fFixedFunctionVertexAttribIndices, |
137 0xff, | 139 0xff, |
138 sizeof(fFixedFunctionVertexAttribIndices)); | 140 sizeof(fFixedFunctionVertexAttribIndices)); |
139 fFixedFunctionVertexAttribIndices[kPosition_GrVertexAttribBinding] = 0; | 141 fFixedFunctionVertexAttribIndices[kPosition_GrVertexAttribBinding] = 0; |
| 142 this->invalidateBlendOptFlags(); |
140 } | 143 } |
141 | 144 |
142 //////////////////////////////////////////////////////////////////////////////// | 145 //////////////////////////////////////////////////////////////////////////////// |
143 | 146 |
144 bool GrDrawState::validateVertexAttribs() const { | 147 bool GrDrawState::validateVertexAttribs() const { |
145 // check consistency of effects and attributes | 148 // check consistency of effects and attributes |
146 GrSLType slTypes[kMaxVertexAttribCnt]; | 149 GrSLType slTypes[kMaxVertexAttribCnt]; |
147 for (int i = 0; i < kMaxVertexAttribCnt; ++i) { | 150 for (int i = 0; i < kMaxVertexAttribCnt; ++i) { |
148 slTypes[i] = static_cast<GrSLType>(-1); | 151 slTypes[i] = static_cast<GrSLType>(-1); |
149 } | 152 } |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 */ | 282 */ |
280 return kOne_GrBlendCoeff == fDstBlend || | 283 return kOne_GrBlendCoeff == fDstBlend || |
281 kISA_GrBlendCoeff == fDstBlend || | 284 kISA_GrBlendCoeff == fDstBlend || |
282 kISC_GrBlendCoeff == fDstBlend || | 285 kISC_GrBlendCoeff == fDstBlend || |
283 this->isCoverageDrawing(); | 286 this->isCoverageDrawing(); |
284 } | 287 } |
285 | 288 |
286 GrDrawState::BlendOptFlags GrDrawState::getBlendOpts(bool forceCoverage, | 289 GrDrawState::BlendOptFlags GrDrawState::getBlendOpts(bool forceCoverage, |
287 GrBlendCoeff* srcCoeff, | 290 GrBlendCoeff* srcCoeff, |
288 GrBlendCoeff* dstCoeff) con
st { | 291 GrBlendCoeff* dstCoeff) con
st { |
289 | |
290 GrBlendCoeff bogusSrcCoeff, bogusDstCoeff; | 292 GrBlendCoeff bogusSrcCoeff, bogusDstCoeff; |
291 if (NULL == srcCoeff) { | 293 if (NULL == srcCoeff) { |
292 srcCoeff = &bogusSrcCoeff; | 294 srcCoeff = &bogusSrcCoeff; |
293 } | 295 } |
294 *srcCoeff = this->getSrcBlendCoeff(); | |
295 | |
296 if (NULL == dstCoeff) { | 296 if (NULL == dstCoeff) { |
297 dstCoeff = &bogusDstCoeff; | 297 dstCoeff = &bogusDstCoeff; |
298 } | 298 } |
| 299 |
| 300 if (forceCoverage) { |
| 301 return this->calcBlendOpts(true, srcCoeff, dstCoeff); |
| 302 } |
| 303 |
| 304 if (0 == (fBlendOptFlags & kInvalid_BlendOptFlag)) { |
| 305 *srcCoeff = fOptSrcBlend; |
| 306 *dstCoeff = fOptDstBlend; |
| 307 return fBlendOptFlags; |
| 308 } |
| 309 |
| 310 fBlendOptFlags = this->calcBlendOpts(forceCoverage, srcCoeff, dstCoeff); |
| 311 fOptSrcBlend = *srcCoeff; |
| 312 fOptDstBlend = *dstCoeff; |
| 313 |
| 314 return fBlendOptFlags; |
| 315 } |
| 316 |
| 317 GrDrawState::BlendOptFlags GrDrawState::calcBlendOpts(bool forceCoverage, |
| 318 GrBlendCoeff* srcCoeff, |
| 319 GrBlendCoeff* dstCoeff) co
nst { |
| 320 *srcCoeff = this->getSrcBlendCoeff(); |
299 *dstCoeff = this->getDstBlendCoeff(); | 321 *dstCoeff = this->getDstBlendCoeff(); |
300 | 322 |
301 if (this->isColorWriteDisabled()) { | 323 if (this->isColorWriteDisabled()) { |
302 *srcCoeff = kZero_GrBlendCoeff; | 324 *srcCoeff = kZero_GrBlendCoeff; |
303 *dstCoeff = kOne_GrBlendCoeff; | 325 *dstCoeff = kOne_GrBlendCoeff; |
304 } | 326 } |
305 | 327 |
306 bool srcAIsOne = this->srcAlphaWillBeOne(); | 328 bool srcAIsOne = this->srcAlphaWillBeOne(); |
307 bool dstCoeffIsOne = kOne_GrBlendCoeff == *dstCoeff || | 329 bool dstCoeffIsOne = kOne_GrBlendCoeff == *dstCoeff || |
308 (kSA_GrBlendCoeff == *dstCoeff && srcAIsOne); | 330 (kSA_GrBlendCoeff == *dstCoeff && srcAIsOne); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
466 fDrawState->fColorStages[s].saveCoordChange(&fSavedCoordChanges[i]); | 488 fDrawState->fColorStages[s].saveCoordChange(&fSavedCoordChanges[i]); |
467 fDrawState->fColorStages[s].localCoordChange(coordChangeMatrix); | 489 fDrawState->fColorStages[s].localCoordChange(coordChangeMatrix); |
468 } | 490 } |
469 | 491 |
470 int numCoverageStages = fDrawState->numCoverageStages(); | 492 int numCoverageStages = fDrawState->numCoverageStages(); |
471 for (int s = 0; s < numCoverageStages; ++s, ++i) { | 493 for (int s = 0; s < numCoverageStages; ++s, ++i) { |
472 fDrawState->fCoverageStages[s].saveCoordChange(&fSavedCoordChanges[i]); | 494 fDrawState->fCoverageStages[s].saveCoordChange(&fSavedCoordChanges[i]); |
473 fDrawState->fCoverageStages[s].localCoordChange(coordChangeMatrix); | 495 fDrawState->fCoverageStages[s].localCoordChange(coordChangeMatrix); |
474 } | 496 } |
475 } | 497 } |
OLD | NEW |