[Libreoffice-commits] core.git: vcl/inc vcl/skia

Luboš Luňák (via logerrit) logerrit at kemper.freedesktop.org
Mon Sep 7 13:22:24 UTC 2020


 vcl/inc/skia/gdiimpl.hxx |    1 +
 vcl/skia/gdiimpl.cxx     |   12 ++++++++++++
 2 files changed, 13 insertions(+)

New commits:
commit acb47f7aaaec14baccc0f3233670044e72342d29
Author:     Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Sat Sep 5 10:59:25 2020 +0200
Commit:     Luboš Luňák <l.lunak at collabora.com>
CommitDate: Mon Sep 7 15:21:41 2020 +0200

    do not queue up too many Skia image drawing operations (tdf#136369)
    
    The document tries to draw a larger number of tiny bitmaps,
    which results in Skia trying to allocate many tiny GPU images,
    which slows it down (something quadratic there?) and it may
    eventually run out of memory. So force a flush if there are
    too many such operations unflushed.
    This is somewhat similar to what was done in the past by
    ad3580df085b3a3d66eb73cae997ea5ca178ccc1 .
    
    Change-Id: Ib0309ea9c7ac6c80d69ceed2922e885a2aa7f2d8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/102166
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <l.lunak at collabora.com>

diff --git a/vcl/inc/skia/gdiimpl.hxx b/vcl/inc/skia/gdiimpl.hxx
index 32beae036d5f..9405bc39ade2 100644
--- a/vcl/inc/skia/gdiimpl.hxx
+++ b/vcl/inc/skia/gdiimpl.hxx
@@ -325,6 +325,7 @@ protected:
         double transparency;
     };
     LastPolyPolygonInfo mLastPolyPolygonInfo;
+    int mPendingOperationsToFlush;
 };
 
 #endif
diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx
index cb0f9b47ecf8..17fcbf092335 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -255,6 +255,7 @@ SkiaSalGraphicsImpl::SkiaSalGraphicsImpl(SalGraphics& rParent, SalGeometryProvid
     , mFillColor(SALCOLOR_NONE)
     , mXorMode(false)
     , mFlush(new SkiaFlushIdle(this))
+    , mPendingOperationsToFlush(0)
 {
 }
 
@@ -389,6 +390,15 @@ void SkiaSalGraphicsImpl::preDraw()
 void SkiaSalGraphicsImpl::postDraw()
 {
     scheduleFlush();
+    // Skia (at least when using Vulkan) queues drawing commands and executes them only later.
+    // But tdf#136369 leads to creating and queueing many tiny bitmaps, which makes
+    // Skia slow, and may make it even run out of memory. So force a flush if such
+    // a problematic operation has been performed too many times without a flush.
+    if (mPendingOperationsToFlush > 1000)
+    {
+        mSurface->flushAndSubmit();
+        mPendingOperationsToFlush = 0;
+    }
     SkiaZone::leave(); // matched in preDraw()
 }
 
@@ -454,6 +464,7 @@ void SkiaSalGraphicsImpl::flushDrawing()
     if (mXorMode)
         applyXor();
     mSurface->flushAndSubmit();
+    mPendingOperationsToFlush = 0;
 }
 
 bool SkiaSalGraphicsImpl::setClipRegion(const vcl::Region& region)
@@ -1550,6 +1561,7 @@ void SkiaSalGraphicsImpl::drawImage(const SalTwoRect& rPosAry, const sk_sp<SkIma
              "drawimage(" << this << "): " << rPosAry << ":" << SkBlendMode_Name(eBlendMode));
     getDrawCanvas()->drawImageRect(aImage, aSourceRect, aDestinationRect, &aPaint);
     addXorRegion(aDestinationRect);
+    ++mPendingOperationsToFlush; // tdf#136369
     postDraw();
 }
 


More information about the Libreoffice-commits mailing list