Index: src/gpu/GrDrawState.cpp |
diff --git a/src/gpu/GrDrawState.cpp b/src/gpu/GrDrawState.cpp |
index a6b3d68238cdc18a20f527c9f7a3dccd5b05b8c9..0c2b1c3684e295d3bb321669375a9f3d414cb4ed 100644 |
--- a/src/gpu/GrDrawState.cpp |
+++ b/src/gpu/GrDrawState.cpp |
@@ -75,7 +75,7 @@ GrDrawState& GrDrawState::operator=(const GrDrawState& that) { |
fFlagBits = that.fFlagBits; |
fVACount = that.fVACount; |
fVAPtr = that.fVAPtr; |
- fVertexSize = that.fVertexSize; |
+ fVAStride = that.fVAStride; |
fStencilSettings = that.fStencilSettings; |
fCoverage = that.fCoverage; |
fDrawFace = that.fDrawFace; |
@@ -178,35 +178,34 @@ void GrDrawState::setFromPaint(const GrPaint& paint, const SkMatrix& vm, GrRende |
//////////////////////////////////////////////////////////////////////////////// |
-static size_t vertex_size(const GrVertexAttrib* attribs, int count) { |
+static void validate_vertex_attribs(const GrVertexAttrib* attribs, int count, size_t stride) { |
// this works as long as we're 4 byte-aligned |
#ifdef SK_DEBUG |
uint32_t overlapCheck = 0; |
-#endif |
SkASSERT(count <= GrRODrawState::kMaxVertexAttribCnt); |
- size_t size = 0; |
for (int index = 0; index < count; ++index) { |
size_t attribSize = GrVertexAttribTypeSize(attribs[index].fType); |
- size += attribSize; |
-#ifdef SK_DEBUG |
+ size_t attribOffset = attribs[index].fOffset; |
+ SkASSERT(attribOffset + attribSize <= stride); |
size_t dwordCount = attribSize >> 2; |
uint32_t mask = (1 << dwordCount)-1; |
- size_t offsetShift = attribs[index].fOffset >> 2; |
+ size_t offsetShift = attribOffset >> 2; |
SkASSERT(!(overlapCheck & (mask << offsetShift))); |
overlapCheck |= (mask << offsetShift); |
-#endif |
} |
- return size; |
+#endif |
} |
//////////////////////////////////////////////////////////////////////////////// |
-void GrDrawState::setVertexAttribs(const GrVertexAttrib* attribs, int count) { |
+void GrDrawState::internalSetVertexAttribs(const GrVertexAttrib* attribs, int count, |
+ size_t stride) { |
SkASSERT(count <= kMaxVertexAttribCnt); |
fVAPtr = attribs; |
fVACount = count; |
- fVertexSize = vertex_size(fVAPtr, fVACount); |
+ fVAStride = stride; |
+ validate_vertex_attribs(fVAPtr, fVACount, fVAStride); |
// Set all the indices to -1 |
memset(fFixedFunctionVertexAttribIndices, |
@@ -244,7 +243,7 @@ void GrDrawState::setDefaultVertexAttribs() { |
fVAPtr = &kPositionAttrib; |
fVACount = 1; |
- fVertexSize = GrVertexAttribTypeSize(kVec2f_GrVertexAttribType); |
+ fVAStride = GrVertexAttribTypeSize(kVec2f_GrVertexAttribType); |
// set all the fixed function indices to -1 except position. |
memset(fFixedFunctionVertexAttribIndices, |
@@ -279,6 +278,7 @@ GrDrawState::AutoVertexAttribRestore::AutoVertexAttribRestore( |
fDrawState = drawState; |
fVAPtr = drawState->fVAPtr; |
fVACount = drawState->fVACount; |
+ fVAStride = drawState->fVAStride; |
fDrawState->setDefaultVertexAttribs(); |
} |