Index: Source/platform/graphics/gpu/DrawingBuffer.cpp |
diff --git a/Source/platform/graphics/gpu/DrawingBuffer.cpp b/Source/platform/graphics/gpu/DrawingBuffer.cpp |
index aa528a3b761c82c8ed8dd9b4e8eaa86145009398..921199de031989157712021ea049004b5a7385ea 100644 |
--- a/Source/platform/graphics/gpu/DrawingBuffer.cpp |
+++ b/Source/platform/graphics/gpu/DrawingBuffer.cpp |
@@ -620,7 +620,8 @@ bool DrawingBuffer::resizeFramebuffer(const IntSize& size) |
m_context->bindTexture(GL_TEXTURE_2D, m_colorBuffer.textureId); |
- allocateTextureMemory(&m_colorBuffer, size); |
+ if (!allocateTextureMemory(&m_colorBuffer, size)) |
+ return false; |
if (m_multisampleMode == ImplicitResolve) |
m_context->framebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_colorBuffer.textureId, 0, m_sampleCount); |
@@ -629,8 +630,10 @@ bool DrawingBuffer::resizeFramebuffer(const IntSize& size) |
m_context->bindTexture(GL_TEXTURE_2D, 0); |
- if (m_multisampleMode != ExplicitResolve) |
- resizeDepthStencil(size); |
+ if (m_multisampleMode != ExplicitResolve) { |
+ if (!resizeDepthStencil(size)) |
+ return false; |
+ } |
if (m_context->checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) |
return false; |
@@ -649,7 +652,8 @@ bool DrawingBuffer::resizeMultisampleFramebuffer(const IntSize& size) |
return false; |
m_context->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_multisampleColorBuffer); |
- resizeDepthStencil(size); |
+ if (!resizeDepthStencil(size)) |
+ return false; |
if (m_context->checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) |
return false; |
} |
@@ -657,10 +661,10 @@ bool DrawingBuffer::resizeMultisampleFramebuffer(const IntSize& size) |
return true; |
} |
-void DrawingBuffer::resizeDepthStencil(const IntSize& size) |
+bool DrawingBuffer::resizeDepthStencil(const IntSize& size) |
{ |
if (!m_requestedAttributes.depth && !m_requestedAttributes.stencil) |
- return; |
+ return true; |
if (m_packedDepthStencilExtensionSupported) { |
if (!m_depthStencilBuffer) |
@@ -701,6 +705,11 @@ void DrawingBuffer::resizeDepthStencil(const IntSize& size) |
} |
} |
m_context->bindRenderbuffer(GL_RENDERBUFFER, 0); |
+ |
+ if (m_context->getError() == GL_OUT_OF_MEMORY) |
+ return false; |
+ |
+ return true; |
} |
@@ -963,19 +972,28 @@ void DrawingBuffer::texImage2DResourceSafe(GLenum target, GLint level, GLenum in |
m_context->texImage2D(target, level, internalformat, width, height, border, format, type, 0); |
} |
-void DrawingBuffer::allocateTextureMemory(TextureInfo* info, const IntSize& size) |
+bool DrawingBuffer::allocateTextureMemory(TextureInfo* info, const IntSize& size) |
{ |
if (RuntimeEnabledFeatures::webGLImageChromiumEnabled()) { |
deleteChromiumImageForTexture(info); |
info->imageId = m_context->createGpuMemoryBufferImageCHROMIUM(size.width(), size.height(), GL_RGBA, GC3D_SCANOUT_CHROMIUM); |
+ |
+ if (m_context->getError() == GL_OUT_OF_MEMORY) |
+ return false; |
+ |
if (info->imageId) { |
m_context->bindTexImage2DCHROMIUM(GL_TEXTURE_2D, info->imageId); |
- return; |
+ return true; |
} |
} |
texImage2DResourceSafe(GL_TEXTURE_2D, 0, m_internalColorFormat, size.width(), size.height(), 0, m_colorFormat, GL_UNSIGNED_BYTE); |
+ |
+ if (m_context->getError() == GL_OUT_OF_MEMORY) |
+ return false; |
+ |
+ return true; |
} |
void DrawingBuffer::deleteChromiumImageForTexture(TextureInfo* info) |