Title: [107116] branches/chromium/1025
Revision
107116
Author
k...@google.com
Date
2012-02-08 12:17:20 -0800 (Wed, 08 Feb 2012)

Log Message

Merge 106888 - WebGL must allocate smaller drawing buffer when the allocation fails.
https://bugs.webkit.org/show_bug.cgi?id=76654

Patch by Yongsheng Zhu <yongsheng....@intel.com> on 2012-02-06
Reviewed by Kenneth Russell.

Test: fast/canvas/webgl/drawingbuffer-test.html

* platform/graphics/gpu/DrawingBuffer.cpp:
(WebCore):
(WebCore::DrawingBuffer::create):
(WebCore::DrawingBuffer::reset):

TBR=commit-qu...@webkit.org
Review URL: https://chromiumcodereview.appspot.com/9359020

Modified Paths

Diff

Modified: branches/chromium/1025/LayoutTests/platform/chromium/test_expectations.txt (107115 => 107116)


--- branches/chromium/1025/LayoutTests/platform/chromium/test_expectations.txt	2012-02-08 20:16:21 UTC (rev 107115)
+++ branches/chromium/1025/LayoutTests/platform/chromium/test_expectations.txt	2012-02-08 20:17:20 UTC (rev 107116)
@@ -3827,8 +3827,6 @@
 
 BUGWK76580 : media/media-document-audio-repaint.html = IMAGE PASS
 
-BUGWK76562 : fast/canvas/webgl/drawingbuffer-test.html = TEXT
-
 // This test is passing, but it doesn't seem possible to add GPU+Leopard specific baselines.
 BUGJAMESR LEOPARD GPU : fast/canvas/quadraticCurveTo.xml = IMAGE
 

Modified: branches/chromium/1025/Source/WebCore/platform/graphics/gpu/DrawingBuffer.cpp (107115 => 107116)


--- branches/chromium/1025/Source/WebCore/platform/graphics/gpu/DrawingBuffer.cpp	2012-02-08 20:16:21 UTC (rev 107115)
+++ branches/chromium/1025/Source/WebCore/platform/graphics/gpu/DrawingBuffer.cpp	2012-02-08 20:17:20 UTC (rev 107116)
@@ -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;
         }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to