Commit b23375fe by Brandon Jones

Fixed an issue with Streaming Vertex data overflowing it's buffer.

Bug=angle:689 Change-Id: Ia0ee6f951822901560888ea300a3889601fa1d89 Reviewed-on: https://chromium-review.googlesource.com/207010Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarBrandon Jones <bajones@chromium.org>
parent aa7e1660
...@@ -124,40 +124,37 @@ GLenum VertexDataManager::prepareVertexData(const gl::VertexAttribute attribs[], ...@@ -124,40 +124,37 @@ GLenum VertexDataManager::prepareVertexData(const gl::VertexAttribute attribs[],
if (translated[i].active && attribs[i].enabled) if (translated[i].active && attribs[i].enabled)
{ {
gl::Buffer *buffer = attribs[i].buffer.get(); gl::Buffer *buffer = attribs[i].buffer.get();
if (buffer) BufferD3D *bufferImpl = buffer ? BufferD3D::makeBufferD3D(buffer->getImplementation()) : NULL;
{ StaticVertexBufferInterface *staticBuffer = bufferImpl ? bufferImpl->getStaticVertexBuffer() : NULL;
BufferD3D *bufferImpl = BufferD3D::makeBufferD3D(buffer->getImplementation()); VertexBufferInterface *vertexBuffer = staticBuffer ? staticBuffer : static_cast<VertexBufferInterface*>(mStreamingBuffer);
StaticVertexBufferInterface *staticBuffer = bufferImpl->getStaticVertexBuffer();
VertexBufferInterface *vertexBuffer = staticBuffer ? staticBuffer : static_cast<VertexBufferInterface*>(mStreamingBuffer);
if (!vertexBuffer->directStoragePossible(attribs[i], currentValues[i])) if (!vertexBuffer->directStoragePossible(attribs[i], currentValues[i]))
{
if (staticBuffer)
{ {
if (staticBuffer) if (staticBuffer->getBufferSize() == 0)
{ {
if (staticBuffer->getBufferSize() == 0) int totalCount = ElementsInBuffer(attribs[i], bufferImpl->getSize());
if (!staticBuffer->reserveVertexSpace(attribs[i], totalCount, 0))
{ {
int totalCount = ElementsInBuffer(attribs[i], bufferImpl->getSize()); return GL_OUT_OF_MEMORY;
if (!staticBuffer->reserveVertexSpace(attribs[i], totalCount, 0))
{
return GL_OUT_OF_MEMORY;
}
} }
} }
else }
{ else
int totalCount = StreamingBufferElementCount(attribs[i], count, instances); {
int totalCount = StreamingBufferElementCount(attribs[i], count, instances);
// [OpenGL ES 3.0.2] section 2.9.4 page 40: // [OpenGL ES 3.0.2] section 2.9.4 page 40:
// We can return INVALID_OPERATION if our vertex attribute does not have enough backing data. // We can return INVALID_OPERATION if our vertex attribute does not have enough backing data.
if (bufferImpl && ElementsInBuffer(attribs[i], bufferImpl->getSize()) < totalCount) if (bufferImpl && ElementsInBuffer(attribs[i], bufferImpl->getSize()) < totalCount)
{ {
return GL_INVALID_OPERATION; return GL_INVALID_OPERATION;
} }
if (!mStreamingBuffer->reserveVertexSpace(attribs[i], totalCount, instances)) if (!mStreamingBuffer->reserveVertexSpace(attribs[i], totalCount, instances))
{ {
return GL_OUT_OF_MEMORY; return GL_OUT_OF_MEMORY;
}
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment