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

Luboš Luňák (via logerrit) logerrit at kemper.freedesktop.org
Mon Jul 27 12:49:06 UTC 2020


 vcl/README.vars     |    1 +
 vcl/skia/salbmp.cxx |   18 +++++++++++++++++-
 2 files changed, 18 insertions(+), 1 deletion(-)

New commits:
commit a9f68d9d9ae8d7c8f79152055795044993b252ea
Author:     Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Mon Jul 27 12:18:55 2020 +0200
Commit:     Luboš Luňák <l.lunak at collabora.com>
CommitDate: Mon Jul 27 14:48:29 2020 +0200

    don't duplicate large memory usage in SkiaSalBitmap (tdf#134342)
    
    Since SkiaSalBitmap is required to support bitmap formats that
    Skia itself doesn't support (1bpp, 4bpp, 24bpp,etc.), it needs
    to store its own copy of the bitmap data and convert to SkImage
    for use. With huge images this can lead to large duplicated
    memory usage. Since the code can actually drop the buffer and
    create it if needed (which it normally is not), just drop large
    buffers after converting to SkImage.
    Ideally SalBitmap should be able to say which bitmap formats it
    supports and VCL code should oblige, which would allow reusing
    the same data.
    
    Change-Id: I98af62a51dde5d738cc8afcdd2fcdc25ff89952f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/99476
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <l.lunak at collabora.com>

diff --git a/vcl/README.vars b/vcl/README.vars
index 73c982ef7d3f..68361ce78d77 100644
--- a/vcl/README.vars
+++ b/vcl/README.vars
@@ -46,6 +46,7 @@ SAL_ENABLESKIA=1 - enable Skia, unless denylisted (and if the VCL backend suppor
 SAL_FORCESKIA=1 - force using Skia, even if denylisted
 SAL_SKIA=raster|vulkan - select Skia's drawing method, by default Vulkan is used
 SAL_DISABLE_SKIA_CACHE=1 - disable caching of complex images
+SAL_SKIA_KEEP_BITMAP_BUFFER=1 - SkiaSalBitmap will keep its bitmap buffer even after storing in SkImage
 
 OpenGL,Skia
 -----------
diff --git a/vcl/skia/salbmp.cxx b/vcl/skia/salbmp.cxx
index 6373eeea405a..dda47b46fa25 100644
--- a/vcl/skia/salbmp.cxx
+++ b/vcl/skia/salbmp.cxx
@@ -586,7 +586,23 @@ const sk_sp<SkImage>& SkiaSalBitmap::GetSkImage() const
     SkiaZone zone;
     sk_sp<SkImage> image = SkiaHelper::createSkImage(GetAsSkBitmap());
     assert(image);
-    const_cast<sk_sp<SkImage>&>(mImage) = image;
+    SkiaSalBitmap* thisPtr = const_cast<SkiaSalBitmap*>(this);
+    thisPtr->mImage = image;
+    // The data is now stored both in the SkImage and in our mBuffer, which with large
+    // images can waste quite a lot of memory. Ideally we should store the data in Skia's
+    // SkBitmap, but LO wants us to support data formats that Skia doesn't support.
+    // So just drop our buffer, it usually won't be needed anyway, and it'll be converted
+    // back by EnsureBitmapData() if yes. Do this only with raster, to avoid GPU->CPU
+    // transfer in GPU mode. Also don't do this with paletted bitmaps, where EnsureBitmapData()
+    // would be expensive.
+    // Ideally SalBitmap should be able to say which bitmap formats it supports
+    // and VCL code should oblige, which would allow reusing the same data.
+    static bool keepBitmapBuffer = getenv("SAL_SKIA_KEEP_BITMAP_BUFFER") != nullptr;
+    constexpr long maxBufferSize = 2000 * 2000 * 4;
+    if (!keepBitmapBuffer && SkiaHelper::renderMethodToUse() == SkiaHelper::RenderRaster
+        && mPixelsSize.Height() * mScanlineSize > maxBufferSize
+        && (mBitCount > 8 || (mBitCount == 8 && mPalette.IsGreyPalette8Bit())))
+        thisPtr->ResetToSkImage(mImage);
     SAL_INFO("vcl.skia.trace", "getskimage(" << this << ")");
     return mImage;
 }


More information about the Libreoffice-commits mailing list