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 #include "GrDrawTargetCaps.h" | 10 #include "GrDrawTargetCaps.h" |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); | 68 SkASSERT(0 == fBlockEffectRemovalCnt || 0 == this->numTotalStages()); |
69 this->setRenderTarget(that.fRenderTarget.get()); | 69 this->setRenderTarget(that.fRenderTarget.get()); |
70 fColor = that.fColor; | 70 fColor = that.fColor; |
71 fViewMatrix = that.fViewMatrix; | 71 fViewMatrix = that.fViewMatrix; |
72 fSrcBlend = that.fSrcBlend; | 72 fSrcBlend = that.fSrcBlend; |
73 fDstBlend = that.fDstBlend; | 73 fDstBlend = that.fDstBlend; |
74 fBlendConstant = that.fBlendConstant; | 74 fBlendConstant = that.fBlendConstant; |
75 fFlagBits = that.fFlagBits; | 75 fFlagBits = that.fFlagBits; |
76 fVACount = that.fVACount; | 76 fVACount = that.fVACount; |
77 fVAPtr = that.fVAPtr; | 77 fVAPtr = that.fVAPtr; |
78 fVertexSize = that.fVertexSize; | 78 fVAStride = that.fVAStride; |
79 fStencilSettings = that.fStencilSettings; | 79 fStencilSettings = that.fStencilSettings; |
80 fCoverage = that.fCoverage; | 80 fCoverage = that.fCoverage; |
81 fDrawFace = that.fDrawFace; | 81 fDrawFace = that.fDrawFace; |
82 fColorStages = that.fColorStages; | 82 fColorStages = that.fColorStages; |
83 fCoverageStages = that.fCoverageStages; | 83 fCoverageStages = that.fCoverageStages; |
84 fOptSrcBlend = that.fOptSrcBlend; | 84 fOptSrcBlend = that.fOptSrcBlend; |
85 fOptDstBlend = that.fOptDstBlend; | 85 fOptDstBlend = that.fOptDstBlend; |
86 fBlendOptFlags = that.fBlendOptFlags; | 86 fBlendOptFlags = that.fBlendOptFlags; |
87 | 87 |
88 fHints = that.fHints; | 88 fHints = that.fHints; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 this->setState(GrDrawState::kDither_StateBit, paint.isDither()); | 171 this->setState(GrDrawState::kDither_StateBit, paint.isDither()); |
172 this->setState(GrDrawState::kHWAntialias_StateBit, paint.isAntiAlias()); | 172 this->setState(GrDrawState::kHWAntialias_StateBit, paint.isAntiAlias()); |
173 | 173 |
174 this->setBlendFunc(paint.getSrcBlendCoeff(), paint.getDstBlendCoeff()); | 174 this->setBlendFunc(paint.getSrcBlendCoeff(), paint.getDstBlendCoeff()); |
175 this->setCoverage(paint.getCoverage()); | 175 this->setCoverage(paint.getCoverage()); |
176 this->invalidateBlendOptFlags(); | 176 this->invalidateBlendOptFlags(); |
177 } | 177 } |
178 | 178 |
179 //////////////////////////////////////////////////////////////////////////////// | 179 //////////////////////////////////////////////////////////////////////////////// |
180 | 180 |
181 static size_t vertex_size(const GrVertexAttrib* attribs, int count) { | 181 static void validate_vertex_attribs(const GrVertexAttrib* attribs, int count, si
ze_t stride) { |
182 // this works as long as we're 4 byte-aligned | 182 // this works as long as we're 4 byte-aligned |
183 #ifdef SK_DEBUG | 183 #ifdef SK_DEBUG |
184 uint32_t overlapCheck = 0; | 184 uint32_t overlapCheck = 0; |
185 #endif | |
186 SkASSERT(count <= GrRODrawState::kMaxVertexAttribCnt); | 185 SkASSERT(count <= GrRODrawState::kMaxVertexAttribCnt); |
187 size_t size = 0; | |
188 for (int index = 0; index < count; ++index) { | 186 for (int index = 0; index < count; ++index) { |
189 size_t attribSize = GrVertexAttribTypeSize(attribs[index].fType); | 187 size_t attribSize = GrVertexAttribTypeSize(attribs[index].fType); |
190 size += attribSize; | 188 size_t attribOffset = attribs[index].fOffset; |
191 #ifdef SK_DEBUG | 189 SkASSERT(attribOffset + attribSize <= stride); |
192 size_t dwordCount = attribSize >> 2; | 190 size_t dwordCount = attribSize >> 2; |
193 uint32_t mask = (1 << dwordCount)-1; | 191 uint32_t mask = (1 << dwordCount)-1; |
194 size_t offsetShift = attribs[index].fOffset >> 2; | 192 size_t offsetShift = attribOffset >> 2; |
195 SkASSERT(!(overlapCheck & (mask << offsetShift))); | 193 SkASSERT(!(overlapCheck & (mask << offsetShift))); |
196 overlapCheck |= (mask << offsetShift); | 194 overlapCheck |= (mask << offsetShift); |
| 195 } |
197 #endif | 196 #endif |
198 } | |
199 return size; | |
200 } | 197 } |
201 | 198 |
202 //////////////////////////////////////////////////////////////////////////////// | 199 //////////////////////////////////////////////////////////////////////////////// |
203 | 200 |
204 void GrDrawState::setVertexAttribs(const GrVertexAttrib* attribs, int count) { | 201 void GrDrawState::internalSetVertexAttribs(const GrVertexAttrib* attribs, int co
unt, |
| 202 size_t stride) { |
205 SkASSERT(count <= kMaxVertexAttribCnt); | 203 SkASSERT(count <= kMaxVertexAttribCnt); |
206 | 204 |
207 fVAPtr = attribs; | 205 fVAPtr = attribs; |
208 fVACount = count; | 206 fVACount = count; |
209 fVertexSize = vertex_size(fVAPtr, fVACount); | 207 fVAStride = stride; |
| 208 validate_vertex_attribs(fVAPtr, fVACount, fVAStride); |
210 | 209 |
211 // Set all the indices to -1 | 210 // Set all the indices to -1 |
212 memset(fFixedFunctionVertexAttribIndices, | 211 memset(fFixedFunctionVertexAttribIndices, |
213 0xff, | 212 0xff, |
214 sizeof(fFixedFunctionVertexAttribIndices)); | 213 sizeof(fFixedFunctionVertexAttribIndices)); |
215 #ifdef SK_DEBUG | 214 #ifdef SK_DEBUG |
216 uint32_t overlapCheck = 0; | 215 uint32_t overlapCheck = 0; |
217 #endif | 216 #endif |
218 for (int i = 0; i < count; ++i) { | 217 for (int i = 0; i < count; ++i) { |
219 if (attribs[i].fBinding < kGrFixedFunctionVertexAttribBindingCnt) { | 218 if (attribs[i].fBinding < kGrFixedFunctionVertexAttribBindingCnt) { |
(...skipping 17 matching lines...) Expand all Loading... |
237 } | 236 } |
238 | 237 |
239 //////////////////////////////////////////////////////////////////////////////// | 238 //////////////////////////////////////////////////////////////////////////////// |
240 | 239 |
241 void GrDrawState::setDefaultVertexAttribs() { | 240 void GrDrawState::setDefaultVertexAttribs() { |
242 static const GrVertexAttrib kPositionAttrib = | 241 static const GrVertexAttrib kPositionAttrib = |
243 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding}; | 242 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding}; |
244 | 243 |
245 fVAPtr = &kPositionAttrib; | 244 fVAPtr = &kPositionAttrib; |
246 fVACount = 1; | 245 fVACount = 1; |
247 fVertexSize = GrVertexAttribTypeSize(kVec2f_GrVertexAttribType); | 246 fVAStride = GrVertexAttribTypeSize(kVec2f_GrVertexAttribType); |
248 | 247 |
249 // set all the fixed function indices to -1 except position. | 248 // set all the fixed function indices to -1 except position. |
250 memset(fFixedFunctionVertexAttribIndices, | 249 memset(fFixedFunctionVertexAttribIndices, |
251 0xff, | 250 0xff, |
252 sizeof(fFixedFunctionVertexAttribIndices)); | 251 sizeof(fFixedFunctionVertexAttribIndices)); |
253 fFixedFunctionVertexAttribIndices[kPosition_GrVertexAttribBinding] = 0; | 252 fFixedFunctionVertexAttribIndices[kPosition_GrVertexAttribBinding] = 0; |
254 this->invalidateBlendOptFlags(); | 253 this->invalidateBlendOptFlags(); |
255 } | 254 } |
256 | 255 |
257 //////////////////////////////////////////////////////////////////////////////// | 256 //////////////////////////////////////////////////////////////////////////////// |
(...skipping 14 matching lines...) Expand all Loading... |
272 } | 271 } |
273 | 272 |
274 ////////////////////////////////////////////////////////////////////////////// | 273 ////////////////////////////////////////////////////////////////////////////// |
275 | 274 |
276 GrDrawState::AutoVertexAttribRestore::AutoVertexAttribRestore( | 275 GrDrawState::AutoVertexAttribRestore::AutoVertexAttribRestore( |
277 GrDrawState* drawState) { | 276 GrDrawState* drawState) { |
278 SkASSERT(NULL != drawState); | 277 SkASSERT(NULL != drawState); |
279 fDrawState = drawState; | 278 fDrawState = drawState; |
280 fVAPtr = drawState->fVAPtr; | 279 fVAPtr = drawState->fVAPtr; |
281 fVACount = drawState->fVACount; | 280 fVACount = drawState->fVACount; |
| 281 fVAStride = drawState->fVAStride; |
282 fDrawState->setDefaultVertexAttribs(); | 282 fDrawState->setDefaultVertexAttribs(); |
283 } | 283 } |
284 | 284 |
285 //////////////////////////////////////////////////////////////////////////////s | 285 //////////////////////////////////////////////////////////////////////////////s |
286 | 286 |
287 void GrDrawState::AutoRestoreEffects::set(GrDrawState* ds) { | 287 void GrDrawState::AutoRestoreEffects::set(GrDrawState* ds) { |
288 if (NULL != fDrawState) { | 288 if (NULL != fDrawState) { |
289 int m = fDrawState->numColorStages() - fColorEffectCnt; | 289 int m = fDrawState->numColorStages() - fColorEffectCnt; |
290 SkASSERT(m >= 0); | 290 SkASSERT(m >= 0); |
291 fDrawState->fColorStages.pop_back_n(m); | 291 fDrawState->fColorStages.pop_back_n(m); |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 //////////////////////////////////////////////////////////////////////////////// | 561 //////////////////////////////////////////////////////////////////////////////// |
562 | 562 |
563 bool GrDrawState::canIgnoreColorAttribute() const { | 563 bool GrDrawState::canIgnoreColorAttribute() const { |
564 if (fBlendOptFlags & kInvalid_BlendOptFlag) { | 564 if (fBlendOptFlags & kInvalid_BlendOptFlag) { |
565 this->getBlendOpts(); | 565 this->getBlendOpts(); |
566 } | 566 } |
567 return SkToBool(fBlendOptFlags & (GrRODrawState::kEmitTransBlack_BlendOptFla
g | | 567 return SkToBool(fBlendOptFlags & (GrRODrawState::kEmitTransBlack_BlendOptFla
g | |
568 GrRODrawState::kEmitCoverage_BlendOptFlag)
); | 568 GrRODrawState::kEmitCoverage_BlendOptFlag)
); |
569 } | 569 } |
570 | 570 |
OLD | NEW |