Title: [199367] releases/WebKitGTK/webkit-2.12/Source/WebCore
Revision
199367
Author
[email protected]
Date
2016-04-12 09:46:37 -0700 (Tue, 12 Apr 2016)

Log Message

Merge r198205 - Leak: Accelerated ImageBufferCairo doesn't destroy the used textures
https://bugs.webkit.org/show_bug.cgi?id=155431

Patch by Miguel Gomez <[email protected]> on 2016-03-15
Reviewed by Žan Doberšek.

When using the Cairo backend, add a destructor to ImageBufferData and use it to destroy the
textures created if the buffer is being accelerated.

No new tests, already covered by existing ones.

* platform/graphics/cairo/ImageBufferCairo.cpp:
(WebCore::ImageBufferData::ImageBufferData):
Store the renderingMode flag.
(WebCore::ImageBufferData::~ImageBufferData):
Destroy gl resources if renderingMode is accelerated.
(WebCore::ImageBuffer::ImageBuffer):
Pass renderingMode to the data class and use it fro checks instead of the function parameter.
* platform/graphics/cairo/ImageBufferDataCairo.h:
Add destructor and a renderingMode flag.

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog (199366 => 199367)


--- releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog	2016-04-12 16:44:36 UTC (rev 199366)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog	2016-04-12 16:46:37 UTC (rev 199367)
@@ -1,3 +1,25 @@
+2016-03-15  Miguel Gomez  <[email protected]>
+
+        Leak: Accelerated ImageBufferCairo doesn't destroy the used textures
+        https://bugs.webkit.org/show_bug.cgi?id=155431
+
+        Reviewed by Žan Doberšek.
+
+        When using the Cairo backend, add a destructor to ImageBufferData and use it to destroy the
+        textures created if the buffer is being accelerated.
+
+        No new tests, already covered by existing ones.
+
+        * platform/graphics/cairo/ImageBufferCairo.cpp:
+        (WebCore::ImageBufferData::ImageBufferData):
+        Store the renderingMode flag.
+        (WebCore::ImageBufferData::~ImageBufferData):
+        Destroy gl resources if renderingMode is accelerated.
+        (WebCore::ImageBuffer::ImageBuffer):
+        Pass renderingMode to the data class and use it fro checks instead of the function parameter.
+        * platform/graphics/cairo/ImageBufferDataCairo.h:
+        Add destructor and a renderingMode flag.
+
 2016-03-10  Antonio Gomes  <[email protected]>
 
         Selecting with shift+drag results in unexpected drag-n-drop

Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/graphics/cairo/ImageBufferCairo.cpp (199366 => 199367)


--- releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/graphics/cairo/ImageBufferCairo.cpp	2016-04-12 16:44:36 UTC (rev 199366)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/graphics/cairo/ImageBufferCairo.cpp	2016-04-12 16:46:37 UTC (rev 199367)
@@ -68,9 +68,10 @@
 
 namespace WebCore {
 
-ImageBufferData::ImageBufferData(const IntSize& size)
+ImageBufferData::ImageBufferData(const IntSize& size, RenderingMode renderingMode)
     : m_platformContext(0)
     , m_size(size)
+    , m_renderingMode(renderingMode)
 #if ENABLE(ACCELERATED_2D_CANVAS)
 #if USE(COORDINATED_GRAPHICS_THREADED)
     , m_platformLayerProxy(adoptRef(new TextureMapperPlatformLayerProxy))
@@ -81,8 +82,30 @@
 {
 }
 
+ImageBufferData::~ImageBufferData()
+{
+    if (m_renderingMode != Accelerated)
+        return;
+
 #if ENABLE(ACCELERATED_2D_CANVAS)
+    GLContext* previousActiveContext = GLContext::getCurrent();
+    GLContext::sharingContext()->makeContextCurrent();
+
+    if (m_texture)
+        glDeleteTextures(1, &m_texture);
+
 #if USE(COORDINATED_GRAPHICS_THREADED)
+    if (m_compositorTexture)
+        glDeleteTextures(1, &m_compositorTexture);
+#endif
+
+    if (previousActiveContext)
+        previousActiveContext->makeContextCurrent();
+#endif
+}
+
+#if ENABLE(ACCELERATED_2D_CANVAS)
+#if USE(COORDINATED_GRAPHICS_THREADED)
 void ImageBufferData::createCompositorBuffer()
 {
     GLContext::sharingContext()->makeContextCurrent();
@@ -163,7 +186,7 @@
 #endif
 
 ImageBuffer::ImageBuffer(const FloatSize& size, float /* resolutionScale */, ColorSpace, RenderingMode renderingMode, bool& success)
-    : m_data(IntSize(size))
+    : m_data(IntSize(size), renderingMode)
     , m_size(size)
     , m_logicalSize(size)
 {
@@ -172,14 +195,14 @@
         return;
 
 #if ENABLE(ACCELERATED_2D_CANVAS)
-    if (renderingMode == Accelerated) {
+    if (m_data.m_renderingMode == Accelerated) {
         m_data.createCairoGLSurface();
         if (!m_data.m_surface || cairo_surface_status(m_data.m_surface.get()) != CAIRO_STATUS_SUCCESS)
-            renderingMode = Unaccelerated; // If allocation fails, fall back to non-accelerated path.
+            m_data.m_renderingMode = Unaccelerated; // If allocation fails, fall back to non-accelerated path.
     }
-    if (renderingMode == Unaccelerated)
+    if (m_data.m_renderingMode == Unaccelerated)
 #else
-    ASSERT_UNUSED(renderingMode, renderingMode != Accelerated);
+    ASSERT(m_data.m_renderingMode != Accelerated);
 #endif
         m_data.m_surface = adoptRef(cairo_image_surface_create(CAIRO_FORMAT_ARGB32, size.width(), size.height()));
 

Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/graphics/cairo/ImageBufferDataCairo.h (199366 => 199367)


--- releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/graphics/cairo/ImageBufferDataCairo.h	2016-04-12 16:44:36 UTC (rev 199366)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/graphics/cairo/ImageBufferDataCairo.h	2016-04-12 16:46:37 UTC (rev 199367)
@@ -54,12 +54,14 @@
 #endif
 {
 public:
-    ImageBufferData(const IntSize&);
+    ImageBufferData(const IntSize&, RenderingMode);
+    virtual ~ImageBufferData();
 
     RefPtr<cairo_surface_t> m_surface;
     PlatformContextCairo m_platformContext;
     std::unique_ptr<GraphicsContext> m_context;
     IntSize m_size;
+    RenderingMode m_renderingMode;
 
 #if ENABLE(ACCELERATED_2D_CANVAS)
     void createCairoGLSurface();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to