Commit f99fbb77 by apatrick@chromium.org

Check that IDirect3DVertexBuffer9 and IDirect3DIndexBuffer9::Lock succeed.

I've been seeing crashes like this on Windows XP: 0x013319aa [libglesv2.dll - memcpy.asm:188] memcpy 0x0130989a [libglesv2.dll - vertexdatamanager.cpp:164] gl::VertexDataManager::preRenderValidate(int,int,gl::TranslatedAttribute *) 0x01304f66 [libglesv2.dll - context.cpp:1996] gl::Context::applyVertexBuffer(unsigned int,int,int,bool *,gl::TranslatedIndexData *) 0x013061a7 [libglesv2.dll - context.cpp:2648] gl::Context::drawArrays(unsigned int,int,int) 0x012f7721 [libglesv2.dll - libglesv2.cpp:1741] glDrawArrays 0x01c54f1e [chrome.dll - gles2_cmd_decoder.cc:3179] gpu::gles2::GLES2DecoderImpl::DoDrawArrays(unsigned int,int,int) 0x01c59122 [chrome.dll - gles2_cmd_decoder_autogen.h:640] gpu::gles2::GLES2DecoderImpl::HandleDrawArrays(unsigned int,gpu::gles2::DrawArrays const &) Review URL: http://codereview.appspot.com/3043042 git-svn-id: https://angleproject.googlecode.com/svn/trunk@480 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent bdfb2e50
...@@ -103,6 +103,11 @@ GLenum IndexDataManager::preRenderValidate(GLenum mode, GLenum type, GLsizei cou ...@@ -103,6 +103,11 @@ GLenum IndexDataManager::preRenderValidate(GLenum mode, GLenum type, GLsizei cou
size_t offset; size_t offset;
void *output = streamIb->map(requiredSpace, &offset); void *output = streamIb->map(requiredSpace, &offset);
if (output == NULL)
{
ERR(" failed to map index buffer.");
return GL_OUT_OF_MEMORY;
}
translated->buffer = streamIb; translated->buffer = streamIb;
translated->offset = offset; translated->offset = offset;
...@@ -210,6 +215,11 @@ GLenum IndexDataManager::preRenderValidateUnindexed(GLenum mode, GLsizei count, ...@@ -210,6 +215,11 @@ GLenum IndexDataManager::preRenderValidateUnindexed(GLenum mode, GLsizei count,
mLineLoopBuffer = mBackend->createIndexBuffer((count+1) * sizeof(unsigned short), GL_UNSIGNED_SHORT); mLineLoopBuffer = mBackend->createIndexBuffer((count+1) * sizeof(unsigned short), GL_UNSIGNED_SHORT);
unsigned short *indices = static_cast<unsigned short *>(mLineLoopBuffer->map()); unsigned short *indices = static_cast<unsigned short *>(mLineLoopBuffer->map());
if (indices == NULL)
{
ERR(" failed to map index buffer.");
return GL_OUT_OF_MEMORY;
}
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
...@@ -232,6 +242,11 @@ GLenum IndexDataManager::preRenderValidateUnindexed(GLenum mode, GLsizei count, ...@@ -232,6 +242,11 @@ GLenum IndexDataManager::preRenderValidateUnindexed(GLenum mode, GLsizei count,
mCountingBuffer = mBackend->createIndexBuffer(count * sizeof(unsigned short), GL_UNSIGNED_SHORT); mCountingBuffer = mBackend->createIndexBuffer(count * sizeof(unsigned short), GL_UNSIGNED_SHORT);
unsigned short *indices = static_cast<unsigned short *>(mCountingBuffer->map()); unsigned short *indices = static_cast<unsigned short *>(mCountingBuffer->map());
if (indices == NULL)
{
ERR(" failed to map index buffer.");
return GL_OUT_OF_MEMORY;
}
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
......
...@@ -65,6 +65,7 @@ std::bitset<MAX_VERTEX_ATTRIBS> VertexDataManager::getActiveAttribs() const ...@@ -65,6 +65,7 @@ std::bitset<MAX_VERTEX_ATTRIBS> VertexDataManager::getActiveAttribs() const
GLenum VertexDataManager::preRenderValidate(GLint start, GLsizei count, GLenum VertexDataManager::preRenderValidate(GLint start, GLsizei count,
TranslatedAttribute *translated) TranslatedAttribute *translated)
{ {
GLenum error = GL_NO_ERROR;
const AttributeState *attribs = mContext->getVertexAttribBlock(); const AttributeState *attribs = mContext->getVertexAttribBlock();
const std::bitset<MAX_VERTEX_ATTRIBS> activeAttribs = getActiveAttribs(); const std::bitset<MAX_VERTEX_ATTRIBS> activeAttribs = getActiveAttribs();
...@@ -126,6 +127,11 @@ GLenum VertexDataManager::preRenderValidate(GLint start, GLsizei count, ...@@ -126,6 +127,11 @@ GLenum VertexDataManager::preRenderValidate(GLint start, GLsizei count,
size_t elementSize = typeSize(attribs[i].mType) * attribs[i].mSize; size_t elementSize = typeSize(attribs[i].mType) * attribs[i].mSize;
void *output = mStreamBuffer->map(spaceRequired(attribs[i], count), &translated[i].offset); void *output = mStreamBuffer->map(spaceRequired(attribs[i], count), &translated[i].offset);
if (output == NULL)
{
ERR(" failed to map vertex buffer.");
return GL_OUT_OF_MEMORY;
}
const void *input; const void *input;
if (attribs[i].mBoundBuffer.get()) if (attribs[i].mBoundBuffer.get())
...@@ -174,10 +180,10 @@ GLenum VertexDataManager::preRenderValidate(GLint start, GLsizei count, ...@@ -174,10 +180,10 @@ GLenum VertexDataManager::preRenderValidate(GLint start, GLsizei count,
if (usesCurrentValues) if (usesCurrentValues)
{ {
processNonArrayAttributes(attribs, activeAttribs, translated, count); error = processNonArrayAttributes(attribs, activeAttribs, translated, count);
} }
return GL_NO_ERROR; return error;
} }
std::size_t VertexDataManager::typeSize(GLenum type) const std::size_t VertexDataManager::typeSize(GLenum type) const
...@@ -223,7 +229,7 @@ std::size_t VertexDataManager::spaceRequired(const AttributeState &attrib, std:: ...@@ -223,7 +229,7 @@ std::size_t VertexDataManager::spaceRequired(const AttributeState &attrib, std::
return roundUp(size, 4 * sizeof(GLfloat)); return roundUp(size, 4 * sizeof(GLfloat));
} }
void VertexDataManager::processNonArrayAttributes(const AttributeState *attribs, const std::bitset<MAX_VERTEX_ATTRIBS> &activeAttribs, TranslatedAttribute *translated, std::size_t count) GLenum VertexDataManager::processNonArrayAttributes(const AttributeState *attribs, const std::bitset<MAX_VERTEX_ATTRIBS> &activeAttribs, TranslatedAttribute *translated, std::size_t count)
{ {
if (mDirtyCurrentValues) if (mDirtyCurrentValues)
{ {
...@@ -232,6 +238,11 @@ void VertexDataManager::processNonArrayAttributes(const AttributeState *attribs, ...@@ -232,6 +238,11 @@ void VertexDataManager::processNonArrayAttributes(const AttributeState *attribs,
mCurrentValueBuffer->reserveSpace(totalSize); mCurrentValueBuffer->reserveSpace(totalSize);
float* currentValues = static_cast<float*>(mCurrentValueBuffer->map(totalSize, &mCurrentValueOffset)); float* currentValues = static_cast<float*>(mCurrentValueBuffer->map(totalSize, &mCurrentValueOffset));
if (currentValues == NULL)
{
ERR(" failed to map vertex buffer.");
return GL_OUT_OF_MEMORY;
}
for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++) for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++)
{ {
...@@ -260,6 +271,8 @@ void VertexDataManager::processNonArrayAttributes(const AttributeState *attribs, ...@@ -260,6 +271,8 @@ void VertexDataManager::processNonArrayAttributes(const AttributeState *attribs,
translated[i].offset = mCurrentValueOffset + 4 * sizeof(float) * i; translated[i].offset = mCurrentValueOffset + 4 * sizeof(float) * i;
} }
} }
return GL_NO_ERROR;
} }
} }
...@@ -43,7 +43,7 @@ class VertexDataManager ...@@ -43,7 +43,7 @@ class VertexDataManager
private: private:
std::bitset<MAX_VERTEX_ATTRIBS> getActiveAttribs() const; std::bitset<MAX_VERTEX_ATTRIBS> getActiveAttribs() const;
void processNonArrayAttributes(const AttributeState *attribs, const std::bitset<MAX_VERTEX_ATTRIBS> &activeAttribs, TranslatedAttribute *translated, std::size_t count); GLenum processNonArrayAttributes(const AttributeState *attribs, const std::bitset<MAX_VERTEX_ATTRIBS> &activeAttribs, TranslatedAttribute *translated, std::size_t count);
std::size_t typeSize(GLenum type) const; std::size_t typeSize(GLenum type) const;
std::size_t interpretGlStride(const AttributeState &attrib) const; std::size_t interpretGlStride(const AttributeState &attrib) const;
......
...@@ -516,7 +516,12 @@ void *Dx9BackEnd::Dx9VertexBuffer::map() ...@@ -516,7 +516,12 @@ void *Dx9BackEnd::Dx9VertexBuffer::map()
{ {
void *mapPtr; void *mapPtr;
mVertexBuffer->Lock(0, 0, &mapPtr, 0); HRESULT hr = mVertexBuffer->Lock(0, 0, &mapPtr, 0);
if (FAILED(hr))
{
ERR(" Lock failed with error 0x%08x", hr);
return NULL;
}
return mapPtr; return mapPtr;
} }
...@@ -537,7 +542,12 @@ void *Dx9BackEnd::Dx9VertexBuffer::streamingMap(std::size_t offset, std::size_t ...@@ -537,7 +542,12 @@ void *Dx9BackEnd::Dx9VertexBuffer::streamingMap(std::size_t offset, std::size_t
{ {
void *mapPtr; void *mapPtr;
mVertexBuffer->Lock(offset, size, &mapPtr, D3DLOCK_NOOVERWRITE); HRESULT hr = mVertexBuffer->Lock(offset, size, &mapPtr, D3DLOCK_NOOVERWRITE);
if (FAILED(hr))
{
ERR(" Lock failed with error 0x%08x", hr);
return NULL;
}
return mapPtr; return mapPtr;
} }
...@@ -558,7 +568,12 @@ void *Dx9BackEnd::Dx9VertexBufferZeroStrideWorkaround::streamingMap(std::size_t ...@@ -558,7 +568,12 @@ void *Dx9BackEnd::Dx9VertexBufferZeroStrideWorkaround::streamingMap(std::size_t
{ {
void *mapPtr; void *mapPtr;
getBuffer()->Lock(offset, size, &mapPtr, 0); HRESULT hr = getBuffer()->Lock(offset, size, &mapPtr, 0);
if (FAILED(hr))
{
ERR(" Lock failed with error 0x%08x", hr);
return NULL;
}
return mapPtr; return mapPtr;
} }
...@@ -592,7 +607,12 @@ void *Dx9BackEnd::Dx9IndexBuffer::map() ...@@ -592,7 +607,12 @@ void *Dx9BackEnd::Dx9IndexBuffer::map()
{ {
void *mapPtr; void *mapPtr;
mIndexBuffer->Lock(0, 0, &mapPtr, 0); HRESULT hr = mIndexBuffer->Lock(0, 0, &mapPtr, 0);
if (FAILED(hr))
{
ERR(" Lock failed with error 0x%08x", hr);
return NULL;
}
return mapPtr; return mapPtr;
} }
...@@ -613,7 +633,12 @@ void *Dx9BackEnd::Dx9IndexBuffer::streamingMap(std::size_t offset, std::size_t s ...@@ -613,7 +633,12 @@ void *Dx9BackEnd::Dx9IndexBuffer::streamingMap(std::size_t offset, std::size_t s
{ {
void *mapPtr; void *mapPtr;
mIndexBuffer->Lock(offset, size, &mapPtr, D3DLOCK_NOOVERWRITE); HRESULT hr = mIndexBuffer->Lock(offset, size, &mapPtr, D3DLOCK_NOOVERWRITE);
if (FAILED(hr))
{
ERR(" Lock failed with error 0x%08x", hr);
return NULL;
}
return mapPtr; return mapPtr;
} }
......
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