Title: [100308] trunk/Source/WebCore
Revision
100308
Author
commit-qu...@webkit.org
Date
2011-11-15 12:21:09 -0800 (Tue, 15 Nov 2011)

Log Message

Patch removing duplicated code in the setup of the DrawingBuffer used
to host the back-buffer for WebGL contents.
https://bugs.webkit.org/show_bug.cgi?id=72327

Patch by Jeff Timanus <t...@chromium.org> on 2011-11-15
Reviewed by Julien Chaffraix.

* html/canvas/WebGLRenderingContext.cpp:
(WebCore::WebGLRenderingContext::copyTexImage2D):
(WebCore::WebGLRenderingContext::copyTexSubImage2D):
(WebCore::WebGLRenderingContext::readPixels):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (100307 => 100308)


--- trunk/Source/WebCore/ChangeLog	2011-11-15 20:13:53 UTC (rev 100307)
+++ trunk/Source/WebCore/ChangeLog	2011-11-15 20:21:09 UTC (rev 100308)
@@ -1,3 +1,16 @@
+2011-11-15  Jeff Timanus  <t...@chromium.org>
+
+        Patch removing duplicated code in the setup of the DrawingBuffer used
+        to host the back-buffer for WebGL contents.
+        https://bugs.webkit.org/show_bug.cgi?id=72327
+
+        Reviewed by Julien Chaffraix.
+
+        * html/canvas/WebGLRenderingContext.cpp:
+        (WebCore::WebGLRenderingContext::copyTexImage2D):
+        (WebCore::WebGLRenderingContext::copyTexSubImage2D):
+        (WebCore::WebGLRenderingContext::readPixels):
+
 2011-11-15  Eugene Nalimov  <e...@google.com>
 
         Event listener for active DOM object that is also DOM node can be garbage collected prematurely.

Modified: trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp (100307 => 100308)


--- trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp	2011-11-15 20:13:53 UTC (rev 100307)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp	2011-11-15 20:21:09 UTC (rev 100308)
@@ -82,6 +82,29 @@
 
 namespace {
 
+    class ScopedDrawingBufferBinder {
+    public:
+        ScopedDrawingBufferBinder(DrawingBuffer* drawingBuffer, WebGLFramebuffer* framebufferBinding)
+            : m_drawingBuffer(drawingBuffer)
+            , m_framebufferBinding(framebufferBinding)
+        {
+            // Commit DrawingBuffer if needed (e.g., for multisampling)
+            if (!m_framebufferBinding && m_drawingBuffer)
+                m_drawingBuffer->commit();
+        }
+
+        ~ScopedDrawingBufferBinder()
+        {
+            // Restore DrawingBuffer if needed
+            if (!m_framebufferBinding && m_drawingBuffer)
+                m_drawingBuffer->bind();
+        }
+
+    private:
+        DrawingBuffer* m_drawingBuffer;
+        WebGLFramebuffer* m_framebufferBinding;
+    };
+
     Platform3DObject objectOrZero(WebGLObject* object)
     {
         return object ? object->object() : 0;
@@ -1164,20 +1187,10 @@
     }
     clearIfComposited();
     if (isResourceSafe()) {
-        // Commit DrawingBuffer if needed (e.g., for multisampling)
-        if (!m_framebufferBinding && m_drawingBuffer)
-            m_drawingBuffer->commit();
-
+        ScopedDrawingBufferBinder(m_drawingBuffer.get(), m_framebufferBinding.get());
         m_context->copyTexImage2D(target, level, internalformat, x, y, width, height, border);
-
-        // Restore DrawingBuffer if needed
-        if (!m_framebufferBinding && m_drawingBuffer)
-            m_drawingBuffer->bind();
     } else {
-        // Commit DrawingBuffer if needed (e.g., for multisampling)
-        if (!m_framebufferBinding && m_drawingBuffer)
-            m_drawingBuffer->commit();
-
+        ScopedDrawingBufferBinder(m_drawingBuffer.get(), m_framebufferBinding.get());
         GC3Dint clippedX, clippedY;
         GC3Dsizei clippedWidth, clippedHeight;
         if (clip2D(x, y, width, height, getBoundFramebufferWidth(), getBoundFramebufferHeight(), &clippedX, &clippedY, &clippedWidth, &clippedHeight)) {
@@ -1189,10 +1202,6 @@
             }
         } else
             m_context->copyTexImage2D(target, level, internalformat, x, y, width, height, border);
-
-        // Restore DrawingBuffer if needed
-        if (!m_framebufferBinding && m_drawingBuffer)
-            m_drawingBuffer->bind();
     }
     // FIXME: if the framebuffer is not complete, none of the below should be executed.
     tex->setLevelInfo(target, level, internalformat, width, height, GraphicsContext3D::UNSIGNED_BYTE);
@@ -1223,17 +1232,10 @@
         return;
     }
     clearIfComposited();
-    if (isResourceSafe())
-        // Commit DrawingBuffer if needed (e.g., for multisampling)
-        if (!m_framebufferBinding && m_drawingBuffer)
-            m_drawingBuffer->commit();
-
+    if (isResourceSafe()) {
+        ScopedDrawingBufferBinder(m_drawingBuffer.get(), m_framebufferBinding.get());
         m_context->copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-
-        // Restore DrawingBuffer if needed
-        if (!m_framebufferBinding && m_drawingBuffer)
-            m_drawingBuffer->bind();
-    else {
+    } else {
         GC3Dint clippedX, clippedY;
         GC3Dsizei clippedWidth, clippedHeight;
         if (clip2D(x, y, width, height, getBoundFramebufferWidth(), getBoundFramebufferHeight(), &clippedX, &clippedY, &clippedWidth, &clippedHeight)) {
@@ -1256,27 +1258,13 @@
             }
             m_context->texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, zero.get());
             if (clippedWidth > 0 && clippedHeight > 0) {
-                // Commit DrawingBuffer if needed (e.g., for multisampling)
-                if (!m_framebufferBinding && m_drawingBuffer)
-                    m_drawingBuffer->commit();
-
+                ScopedDrawingBufferBinder(m_drawingBuffer.get(), m_framebufferBinding.get());
                 m_context->copyTexSubImage2D(target, level, xoffset + clippedX - x, yoffset + clippedY - y,
                                              clippedX, clippedY, clippedWidth, clippedHeight);
-
-               // Restore DrawingBuffer if needed
-               if (!m_framebufferBinding && m_drawingBuffer)
-                  m_drawingBuffer->bind();
             }
         } else {
-            // Commit DrawingBuffer if needed (e.g., for multisampling)
-            if (!m_framebufferBinding && m_drawingBuffer)
-                m_drawingBuffer->commit();
-
+            ScopedDrawingBufferBinder(m_drawingBuffer.get(), m_framebufferBinding.get());
             m_context->copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-
-            // Restore DrawingBuffer if needed
-            if (!m_framebufferBinding && m_drawingBuffer)
-                m_drawingBuffer->bind();
         }
     }
     cleanupAfterGraphicsCall(false);
@@ -3041,16 +3029,11 @@
     clearIfComposited();
     void* data = ""
 
-    // Commit DrawingBuffer if needed (e.g., for multisampling)
-    if (!m_framebufferBinding && m_drawingBuffer)
-        m_drawingBuffer->commit();
+    {
+        ScopedDrawingBufferBinder(m_drawingBuffer.get(), m_framebufferBinding.get());
+        m_context->readPixels(x, y, width, height, format, type, data);
+    }
 
-    m_context->readPixels(x, y, width, height, format, type, data);
-
-    // Restore DrawingBuffer if needed
-    if (!m_framebufferBinding && m_drawingBuffer)
-        m_drawingBuffer->bind();
-
 #if OS(DARWIN)
     // FIXME: remove this section when GL driver bug on Mac is fixed, i.e.,
     // when alpha is off, readPixels should set alpha to 255 instead of 0.
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to