[Libreoffice-commits] core.git: Branch 'feature/skia' - external/skia include/vcl vcl/inc vcl/skia
Luboš Luňák (via logerrit)
logerrit at kemper.freedesktop.org
Wed Nov 13 12:35:52 UTC 2019
external/skia/share-grcontext.patch.1 | 2 +-
include/vcl/skia/SkiaHelper.hxx | 13 +++++++++++++
vcl/inc/skia/gdiimpl.hxx | 8 --------
vcl/skia/SkiaHelper.cxx | 33 +++++++++++++++++++++++++++++++--
vcl/skia/gdiimpl.cxx | 22 +++++-----------------
vcl/skia/win/gdiimpl.cxx | 25 +++++++++++++++++--------
vcl/skia/x11/gdiimpl.cxx | 22 ++++++++++++++++------
7 files changed, 83 insertions(+), 42 deletions(-)
New commits:
commit c764110b82f179feb8819f7c357bdf6c373f5c9f
Author: Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Wed Nov 13 13:27:57 2019 +0100
Commit: Luboš Luňák <l.lunak at collabora.com>
CommitDate: Wed Nov 13 13:35:08 2019 +0100
make Skia VCL backend fall back to raster if vulkan doesn't work
Change-Id: Ic446f6f85e5ebc2e50cb51a3ed1e732b8976a193
diff --git a/external/skia/share-grcontext.patch.1 b/external/skia/share-grcontext.patch.1
index 0492bd948240..357c3a885880 100644
--- a/external/skia/share-grcontext.patch.1
+++ b/external/skia/share-grcontext.patch.1
@@ -426,7 +426,7 @@ index 2db9e79ae6..7950dc159b 100644
void swapBuffers() override;
- bool isValid() override { return fDevice != VK_NULL_HANDLE; }
-+ bool isValid() override { return fShared->fDevice != VK_NULL_HANDLE; }
++ bool isValid() override { return fShared && fShared->fDevice != VK_NULL_HANDLE; }
void resize(int w, int h) override {
this->createSwapchain(w, h, fDisplayParams);
diff --git a/include/vcl/skia/SkiaHelper.hxx b/include/vcl/skia/SkiaHelper.hxx
index 77e9fab5797a..d27cffd650f3 100644
--- a/include/vcl/skia/SkiaHelper.hxx
+++ b/include/vcl/skia/SkiaHelper.hxx
@@ -12,6 +12,8 @@
#include <vcl/dllapi.h>
+#include <config_features.h>
+
// All member functions static and VCL_DLLPUBLIC. Basically a glorified namespace.
struct VCL_DLLPUBLIC SkiaHelper
{
@@ -19,6 +21,17 @@ struct VCL_DLLPUBLIC SkiaHelper
public:
static bool isVCLSkiaEnabled();
+
+#if HAVE_FEATURE_SKIA
+ // Which Skia backend to use.
+ enum RenderMethod
+ {
+ RenderRaster,
+ RenderVulkan
+ };
+ static RenderMethod renderMethodToUse();
+ static void disableRenderMethod(RenderMethod method);
+#endif
};
#endif
diff --git a/vcl/inc/skia/gdiimpl.hxx b/vcl/inc/skia/gdiimpl.hxx
index 195b5d877eed..7c41e98a91b5 100644
--- a/vcl/inc/skia/gdiimpl.hxx
+++ b/vcl/inc/skia/gdiimpl.hxx
@@ -241,14 +241,6 @@ protected:
SkScalar toSkX(long x) const { return mIsGPU ? x + 0.5 : x; }
SkScalar toSkY(long y) const { return mIsGPU ? y + 0.5 : y; }
- // Which Skia backend to use.
- enum RenderMethod
- {
- RenderRaster,
- RenderVulkan
- };
- static RenderMethod renderMethodToUse();
-
#ifdef DBG_UTIL
void prefillSurface();
#endif
diff --git a/vcl/skia/SkiaHelper.cxx b/vcl/skia/SkiaHelper.cxx
index bc643bd546b1..810e8f9b0b11 100644
--- a/vcl/skia/SkiaHelper.cxx
+++ b/vcl/skia/SkiaHelper.cxx
@@ -13,8 +13,6 @@
#include <desktop/crashreport.hxx>
#include <officecfg/Office/Common.hxx>
-#include <config_features.h>
-
#if !HAVE_FEATURE_SKIA
bool SkiaHelper::isVCLSkiaEnabled() { return false; }
@@ -86,6 +84,37 @@ bool SkiaHelper::isVCLSkiaEnabled()
return bRet;
}
+static SkiaHelper::RenderMethod methodToUse = SkiaHelper::RenderRaster;
+
+static bool initRenderMethodToUse()
+{
+ if (const char* env = getenv("SAL_SKIA"))
+ {
+ if (strcmp(env, "raster") == 0)
+ {
+ methodToUse = SkiaHelper::RenderRaster;
+ return true;
+ }
+ }
+ methodToUse = SkiaHelper::RenderVulkan;
+ return true;
+}
+
+SkiaHelper::RenderMethod SkiaHelper::renderMethodToUse()
+{
+ static bool methodToUseInited = initRenderMethodToUse();
+ (void)methodToUseInited; // Used just to ensure thread-safe one-time init.
+ return methodToUse;
+}
+
+void SkiaHelper::disableRenderMethod(RenderMethod method)
+{
+ if (renderMethodToUse() != method)
+ return;
+ // Choose a fallback, right now always raster.
+ methodToUse = RenderRaster;
+}
+
#endif // HAVE_FEATURE_SKIA
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx
index ac47d254cc03..cb2beb2667a0 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -24,6 +24,7 @@
#include <vcl/idle.hxx>
#include <vcl/svapp.hxx>
#include <vcl/lazydelete.hxx>
+#include <vcl/skia/SkiaHelper.hxx>
#include <SkCanvas.h>
#include <SkPath.h>
@@ -168,20 +169,6 @@ public:
}
};
-SkiaSalGraphicsImpl::RenderMethod SkiaSalGraphicsImpl::renderMethodToUse()
-{
- static RenderMethod method = [] {
- if (const char* env = getenv("SAL_SKIA"))
- {
- if (strcmp(env, "raster") == 0)
- return RenderRaster;
- }
- return RenderVulkan;
- }();
-
- return method;
-}
-
SkiaSalGraphicsImpl::SkiaSalGraphicsImpl(SalGraphics& rParent, SalGeometryProvider* pProvider)
: mParent(rParent)
, mProvider(pProvider)
@@ -226,9 +213,9 @@ void SkiaSalGraphicsImpl::createOffscreenSurface()
{
assert(isOffscreen());
destroySurface();
- switch (renderMethodToUse())
+ switch (SkiaHelper::renderMethodToUse())
{
- case RenderVulkan:
+ case SkiaHelper::RenderVulkan:
{
mOffscreenGrContext = sk_app::VulkanWindowContext::getSharedGrContext();
GrContext* grContext = mOffscreenGrContext.getGrContext();
@@ -260,7 +247,8 @@ void SkiaSalGraphicsImpl::createOffscreenSurface()
#endif
return;
}
- SAL_WARN("vcl.skia", "cannot create Vulkan GPU offscreen surface");
+ SAL_WARN("vcl.skia", "cannot create Vulkan offscreen GPU surface, disabling Vulkan");
+ SkiaHelper::disableRenderMethod(SkiaHelper::RenderVulkan);
break;
}
default:
diff --git a/vcl/skia/win/gdiimpl.cxx b/vcl/skia/win/gdiimpl.cxx
index 8f30c3486dac..cba8bed29355 100644
--- a/vcl/skia/win/gdiimpl.cxx
+++ b/vcl/skia/win/gdiimpl.cxx
@@ -9,12 +9,13 @@
#include <skia/win/gdiimpl.hxx>
-#include <tools/sk_app/win/WindowContextFactory_win.h>
-#include <tools/sk_app/WindowContext.h>
#include <win/saldata.hxx>
+#include <vcl/skia/SkiaHelper.hxx>
#include <SkColorFilter.h>
#include <SkPixelRef.h>
+#include <tools/sk_app/win/WindowContextFactory_win.h>
+#include <tools/sk_app/WindowContext.h>
WinSkiaSalGraphicsImpl::WinSkiaSalGraphicsImpl(WinSalGraphics& rGraphics,
SalGeometryProvider* mpProvider)
@@ -52,22 +53,30 @@ void WinSkiaSalGraphicsImpl::createSurface()
// valid here, but better check.
assert(GetWidth() != 0 && GetHeight() != 0);
sk_app::DisplayParams displayParams;
- switch (renderMethodToUse())
+ switch (SkiaHelper::renderMethodToUse())
{
- case RenderRaster:
+ case SkiaHelper::RenderRaster:
mWindowContext = sk_app::window_context_factory::MakeRasterForWin(mWinParent.gethWnd(),
displayParams);
+ assert(SkToBool(mWindowContext));
+ mSurface = mWindowContext->getBackbufferSurface();
+ assert(mSurface.get());
mIsGPU = false;
break;
- case RenderVulkan:
+ case SkiaHelper::RenderVulkan:
mWindowContext = sk_app::window_context_factory::MakeVulkanForWin(mWinParent.gethWnd(),
displayParams);
+ if (mWindowContext)
+ mSurface = mWindowContext->getBackbufferSurface();
+ if (!mSurface)
+ {
+ SAL_WARN("vcl.skia", "cannot create Vulkan GPU surface, disabling Vulkan");
+ SkiaHelper::disableRenderMethod(SkiaHelper::RenderVulkan);
+ return createSurface(); // try again
+ }
mIsGPU = true;
break;
}
- assert(SkToBool(mWindowContext)); // TODO
- mSurface = mWindowContext->getBackbufferSurface();
- assert(mSurface.get());
#ifdef DBG_UTIL
prefillSurface();
#endif
diff --git a/vcl/skia/x11/gdiimpl.cxx b/vcl/skia/x11/gdiimpl.cxx
index ef381c5e56d3..7eb02a51169e 100644
--- a/vcl/skia/x11/gdiimpl.cxx
+++ b/vcl/skia/x11/gdiimpl.cxx
@@ -21,6 +21,8 @@
#include <tools/sk_app/unix/WindowContextFactory_unix.h>
#include <tools/sk_app/WindowContext.h>
+#include <vcl/skia/SkiaHelper.hxx>
+
X11SkiaSalGraphicsImpl::X11SkiaSalGraphicsImpl(X11SalGraphics& rParent)
: SkiaSalGraphicsImpl(rParent, rParent.GetGeometryProvider())
, mX11Parent(rParent)
@@ -63,22 +65,30 @@ void X11SkiaSalGraphicsImpl::createSurface()
#endif
winInfo.fWidth = GetWidth();
winInfo.fHeight = GetHeight();
- switch (renderMethodToUse())
+ switch (SkiaHelper::renderMethodToUse())
{
- case RenderRaster:
+ case SkiaHelper::RenderRaster:
mWindowContext
= sk_app::window_context_factory::MakeRasterForXlib(winInfo, displayParams);
+ assert(SkToBool(mWindowContext));
+ mSurface = mWindowContext->getBackbufferSurface();
+ assert(mSurface.get());
mIsGPU = false;
break;
- case RenderVulkan:
+ case SkiaHelper::RenderVulkan:
mWindowContext
= sk_app::window_context_factory::MakeVulkanForXlib(winInfo, displayParams);
+ if (mWindowContext)
+ mSurface = mWindowContext->getBackbufferSurface();
+ if (!mSurface)
+ {
+ SAL_WARN("vcl.skia", "cannot create Vulkan GPU surface, disabling Vulkan");
+ SkiaHelper::disableRenderMethod(SkiaHelper::RenderVulkan);
+ return createSurface(); // try again
+ }
mIsGPU = true;
break;
}
- assert(SkToBool(mWindowContext)); // TODO
- mSurface = mWindowContext->getBackbufferSurface();
- assert(mSurface.get());
#ifdef DBG_UTIL
prefillSurface();
#endif
More information about the Libreoffice-commits
mailing list