Translate/lift vertex attributes when input stride or offset is not a multiple of 4.
TRAC #11847
Signed-off-by: Nicolas Capens
Signed-off-by: Daniel Koch
Author: Andrew Lewycky
git-svn-id: https://angleproject.googlecode.com/svn/trunk@149 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/geometry/VertexDataManager.cpp b/src/libGLESv2/geometry/VertexDataManager.cpp
index 54e894c..a8766ce 100644
--- a/src/libGLESv2/geometry/VertexDataManager.cpp
+++ b/src/libGLESv2/geometry/VertexDataManager.cpp
@@ -128,12 +128,22 @@
{
if (attribs[i].mBoundBuffer != 0 && mBackend->getFormatConverter(attribs[i].mType, attribs[i].mSize, attribs[i].mNormalized).identity)
{
- translated[i].type = attribs[i].mType;
- translated[i].size = attribs[i].mSize;
- translated[i].normalized = attribs[i].mNormalized;
- translated[i].stride = interpretGlStride(attribs[i]);
- translated[i].offset = static_cast<std::size_t>(static_cast<const char*>(attribs[i].mPointer) - static_cast<const char*>(NULL)) + translated[i].stride * minIndex;
- translated[i].buffer = mContext->getBuffer(attribs[i].mBoundBuffer)->identityBuffer();
+ std::size_t stride = interpretGlStride(attribs[i]);
+ std::size_t offset = static_cast<std::size_t>(static_cast<const char*>(attribs[i].mPointer) - static_cast<const char*>(NULL)) + translated[i].stride * minIndex;
+
+ if (mBackend->validateStream(attribs[i].mType, attribs[i].mSize, stride, offset))
+ {
+ translated[i].type = attribs[i].mType;
+ translated[i].size = attribs[i].mSize;
+ translated[i].normalized = attribs[i].mNormalized;
+ translated[i].stride = stride;
+ translated[i].offset = offset;
+ translated[i].buffer = mContext->getBuffer(attribs[i].mBoundBuffer)->identityBuffer();
+ }
+ else
+ {
+ translateOrLift[i] = true;
+ }
}
else
{