Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(272)

Unified Diff: Source/WebCore/platform/graphics/gpu/DrawingBuffer.cpp

Issue 9359020: Merge 106888 - WebGL must allocate smaller drawing buffer when the allocation fails. (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1025/
Patch Set: Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « LayoutTests/platform/chromium/test_expectations.txt ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/WebCore/platform/graphics/gpu/DrawingBuffer.cpp
===================================================================
--- Source/WebCore/platform/graphics/gpu/DrawingBuffer.cpp (revision 107114)
+++ Source/WebCore/platform/graphics/gpu/DrawingBuffer.cpp (working copy)
@@ -49,6 +49,7 @@
static int s_maximumResourceUsePixels = 0;
#endif
static int s_currentResourceUsePixels = 0;
+static const float s_resourceAdjustedRatio = 0.5;
PassRefPtr<DrawingBuffer> DrawingBuffer::create(GraphicsContext3D* context, const IntSize& size, bool separateBackingTexture)
{
@@ -236,19 +237,28 @@
}
int pixelDelta = newSize.width() * newSize.height();
- if (!m_size.isEmpty())
- pixelDelta -= m_size.width() * m_size.height();
-
- if (s_maximumResourceUsePixels && (s_currentResourceUsePixels + pixelDelta) > s_maximumResourceUsePixels) {
- clear();
- return false;
+ int oldSize = 0;
+ if (!m_size.isEmpty()) {
+ oldSize = m_size.width() * m_size.height();
+ pixelDelta -= oldSize;
}
- s_currentResourceUsePixels += pixelDelta;
+ IntSize adjustedSize = newSize;
+ if (s_maximumResourceUsePixels) {
+ while ((s_currentResourceUsePixels + pixelDelta) > s_maximumResourceUsePixels) {
+ adjustedSize.scale(s_resourceAdjustedRatio);
+ if (adjustedSize.isEmpty()) {
+ clear();
+ return false;
+ }
+ pixelDelta = adjustedSize.width() * adjustedSize.height();
+ pixelDelta -= oldSize;
+ }
+ }
+
const GraphicsContext3D::Attributes& attributes = m_context->getContextAttributes();
- if (newSize != m_size) {
- m_size = newSize;
+ if (adjustedSize != m_size) {
unsigned internalColorFormat, colorFormat, internalRenderbufferFormat;
if (attributes.alpha) {
@@ -262,46 +272,56 @@
}
- // resize multisample FBO
- if (multisample()) {
- int maxSampleCount = 0;
-
- m_context->getIntegerv(Extensions3D::MAX_SAMPLES, &maxSampleCount);
- int sampleCount = std::min(4, maxSampleCount);
+ do {
+ m_size = adjustedSize;
+ // resize multisample FBO
+ if (multisample()) {
+ int maxSampleCount = 0;
- m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_multisampleFBO);
+ m_context->getIntegerv(Extensions3D::MAX_SAMPLES, &maxSampleCount);
+ int sampleCount = std::min(4, maxSampleCount);
- m_context->bindRenderbuffer(GraphicsContext3D::RENDERBUFFER, m_multisampleColorBuffer);
- m_context->getExtensions()->renderbufferStorageMultisample(GraphicsContext3D::RENDERBUFFER, sampleCount, internalRenderbufferFormat, m_size.width(), m_size.height());
- m_context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::RENDERBUFFER, m_multisampleColorBuffer);
- resizeDepthStencil(sampleCount);
- if (m_context->checkFramebufferStatus(GraphicsContext3D::FRAMEBUFFER) != GraphicsContext3D::FRAMEBUFFER_COMPLETE) {
- // Cleanup
- clear();
- return false;
+ m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_multisampleFBO);
+
+ m_context->bindRenderbuffer(GraphicsContext3D::RENDERBUFFER, m_multisampleColorBuffer);
+ m_context->getExtensions()->renderbufferStorageMultisample(GraphicsContext3D::RENDERBUFFER, sampleCount, internalRenderbufferFormat, m_size.width(), m_size.height());
+ m_context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::RENDERBUFFER, m_multisampleColorBuffer);
+ resizeDepthStencil(sampleCount);
+ if (m_context->checkFramebufferStatus(GraphicsContext3D::FRAMEBUFFER) != GraphicsContext3D::FRAMEBUFFER_COMPLETE) {
+ adjustedSize.scale(s_resourceAdjustedRatio);
+ continue;
+ }
}
- }
- // resize regular FBO
- m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo);
+ // resize regular FBO
+ m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo);
- m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_colorBuffer);
- m_context->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, internalColorFormat, m_size.width(), m_size.height(), 0, colorFormat, GraphicsContext3D::UNSIGNED_BYTE, 0);
+ m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_colorBuffer);
+ m_context->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, internalColorFormat, m_size.width(), m_size.height(), 0, colorFormat, GraphicsContext3D::UNSIGNED_BYTE, 0);
- m_context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, m_colorBuffer, 0);
+ m_context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, m_colorBuffer, 0);
- // resize the backing color buffer
- if (m_separateBackingTexture) {
- m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_backingColorBuffer);
- m_context->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, internalColorFormat, m_size.width(), m_size.height(), 0, colorFormat, GraphicsContext3D::UNSIGNED_BYTE, 0);
- }
+ // resize the backing color buffer
+ if (m_separateBackingTexture) {
+ m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_backingColorBuffer);
+ m_context->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, internalColorFormat, m_size.width(), m_size.height(), 0, colorFormat, GraphicsContext3D::UNSIGNED_BYTE, 0);
+ }
- m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, 0);
+ m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, 0);
- if (!multisample())
- resizeDepthStencil(0);
- if (m_context->checkFramebufferStatus(GraphicsContext3D::FRAMEBUFFER) != GraphicsContext3D::FRAMEBUFFER_COMPLETE) {
- // Cleanup
+ if (!multisample())
+ resizeDepthStencil(0);
+ if (m_context->checkFramebufferStatus(GraphicsContext3D::FRAMEBUFFER) == GraphicsContext3D::FRAMEBUFFER_COMPLETE)
+ break;
+ adjustedSize.scale(s_resourceAdjustedRatio);
+
+ } while (!adjustedSize.isEmpty());
+
+ pixelDelta = m_size.width() * m_size.height();
+ pixelDelta -= oldSize;
+ s_currentResourceUsePixels += pixelDelta;
+
+ if (!newSize.isEmpty() && adjustedSize.isEmpty()) {
clear();
return false;
}
« no previous file with comments | « LayoutTests/platform/chromium/test_expectations.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698