[Libreoffice-commits] core.git: 2 commits - desktop/source desktop/unx desktop/win32 include/desktop vcl/opengl

Tor Lillqvist tml at collabora.com
Mon May 30 12:00:25 UTC 2016


 desktop/source/app/app.cxx                         |    2 
 desktop/source/inc/exithelper.h                    |   38 --------
 desktop/unx/source/start.c                         |    2 
 desktop/win32/source/officeloader/officeloader.cxx |    2 
 include/desktop/exithelper.h                       |   38 ++++++++
 vcl/opengl/win/gdiimpl.cxx                         |   99 +++++++++++++++++++++
 6 files changed, 140 insertions(+), 41 deletions(-)

New commits:
commit 933a9d9245fdeceefd92fba9a5cb4db6bca92984
Author: Tor Lillqvist <tml at collabora.com>
Date:   Mon May 30 14:20:11 2016 +0300

    On Windows, compile OpenGL shaders in advance and disable on failure
    
    If the shader compilation or loading of an already compiled shader
    fails, disable OpenGL in the registry and exit with the
    EXITHELPER_CRASH_WITH_RESTART status. The wrapper process will thus
    run soffice.bin once more, and this time OpenGL will not be used.
    
    Change-Id: I3cc4a615f00a8a1adb584493861e4956c83cec32

diff --git a/vcl/opengl/win/gdiimpl.cxx b/vcl/opengl/win/gdiimpl.cxx
index cf45a46..04ca857 100644
--- a/vcl/opengl/win/gdiimpl.cxx
+++ b/vcl/opengl/win/gdiimpl.cxx
@@ -8,6 +8,7 @@
  */
 
 #include "opengl/win/gdiimpl.hxx"
+#include <desktop/exithelper.h>
 #include <opengl/zone.hxx>
 #include <o3tl/lru_map.hxx>
 #include <win/wincomp.hxx>
@@ -349,6 +350,97 @@ bool InitMultisample(const PIXELFORMATDESCRIPTOR& pfd, int& rPixelFormat,
     return bArbMultisampleSupported;
 }
 
+namespace
+{
+
+bool tryShaders(const OUString& rVertexShader, const OUString& rFragmentShader, const OUString& rGeometryShader = "")
+{
+    GLint nId;
+
+    // Somewhat mysteriously, the OpenGLHelper::LoadShaders() API saves a compiled binary of the
+    // shader only if you give it the digest of the shaders. We have API to calculate the digest
+    // only of the combination of vertex and fragment (but not geometry) shader. So if we have a
+    // geometry shader, we should not save the binary.
+    if (rGeometryShader.isEmpty())
+        nId = OpenGLHelper::LoadShaders(rVertexShader, rFragmentShader, rGeometryShader, "", OpenGLHelper::GetDigest( rVertexShader, rFragmentShader, ""));
+    else
+        nId = OpenGLHelper::LoadShaders(rVertexShader, rFragmentShader, rGeometryShader);
+    if (!nId)
+        return false;
+    glDeleteProgram(nId);
+    return glGetError() == GL_NO_ERROR;
+}
+
+bool compiledShaderBinariesWork()
+{
+    static bool bBeenHere = false;
+    static bool bResult;
+
+    if (bBeenHere)
+        return bResult;
+
+    bBeenHere = true;
+
+    bResult =
+        (
+#if 0 // Only look at shaders used by vcl for now
+         // canvas
+         tryShaders("dummyVertexShader", "linearMultiColorGradientFragmentShader") &&
+         tryShaders("dummyVertexShader", "linearTwoColorGradientFragmentShader") &&
+         tryShaders("dummyVertexShader", "radialMultiColorGradientFragmentShader") &&
+         tryShaders("dummyVertexShader", "radialTwoColorGradientFragmentShader") &&
+         tryShaders("dummyVertexShader", "rectangularMultiColorGradientFragmentShader") &&
+         tryShaders("dummyVertexShader", "rectangularTwoColorGradientFragmentShader") &&
+         // chart2
+         (GLEW_VERSION_3_3 ?
+          (tryShaders("shape3DVertexShader", "shape3DFragmentShader") &&
+           tryShaders("shape3DVertexShaderBatchScroll", "shape3DFragmentShaderBatchScroll") &&
+           tryShaders("shape3DVertexShaderBatch", "shape3DFragmentShaderBatch") &&
+           tryShaders("textVertexShaderBatch", "textFragmentShaderBatch")) :
+          (tryShaders("shape3DVertexShaderV300", "shape3DFragmentShaderV300"))) &&
+         tryShaders("textVertexShader", "textFragmentShader") &&
+         tryShaders("screenTextVertexShader", "screenTextFragmentShader") &&
+         tryShaders("commonVertexShader", "commonFragmentShader") &&
+         tryShaders("pickingVertexShader", "pickingFragmentShader") &&
+         tryShaders("backgroundVertexShader", "backgroundFragmentShader") &&
+         tryShaders("symbolVertexShader", "symbolFragmentShader") &&
+         tryShaders("symbolVertexShader", "symbolFragmentShader") &&
+         // slideshow
+         tryShaders("reflectionVertexShader", "reflectionFragmentShader") &&
+         tryShaders("basicVertexShader", "basicFragmentShader") &&
+         tryShaders("vortexVertexShader", "vortexFragmentShader", "vortexGeometryShader") &&
+         tryShaders("basicVertexShader", "rippleFragmentShader") &&
+         tryShaders("glitterVertexShader", "glitterFragmentShader") &&
+         tryShaders("honeycombVertexShader", "honeycombFragmentShader", "honeycombGeometryShader") &&
+#endif
+         // vcl
+         tryShaders("combinedVertexShader", "combinedFragmentShader") &&
+         tryShaders("dumbVertexShader", "invert50FragmentShader") &&
+         tryShaders("combinedTextureVertexShader", "combinedTextureFragmentShader") &&
+         tryShaders("textureVertexShader", "areaScaleFragmentShader") &&
+         tryShaders("transformedTextureVertexShader", "maskedTextureFragmentShader") &&
+         tryShaders("transformedTextureVertexShader", "areaScaleFastFragmentShader") &&
+         tryShaders("transformedTextureVertexShader", "areaScaleFragmentShader") &&
+         tryShaders("transformedTextureVertexShader", "textureFragmentShader") &&
+         tryShaders("combinedTextureVertexShader", "combinedTextureFragmentShader") &&
+         tryShaders("textureVertexShader", "linearGradientFragmentShader") &&
+         tryShaders("textureVertexShader", "radialGradientFragmentShader") &&
+         tryShaders("textureVertexShader", "textureFragmentShader") &&
+         tryShaders("textureVertexShader", "convolutionFragmentShader") &&
+         tryShaders("textureVertexShader", "areaScaleFastFragmentShader") &&
+         tryShaders("textureVertexShader", "areaScaleFragmentShader"));
+
+    if (!bResult)
+    {
+        OpenGLZone::hardDisable();
+        TerminateProcess(GetCurrentProcess(), EXITHELPER_CRASH_WITH_RESTART);
+    }
+
+    return bResult;
+}
+
+} // unnamed namespace
+
 bool WinOpenGLContext::ImplInit()
 {
     OpenGLZone aZone;
@@ -464,6 +556,13 @@ bool WinOpenGLContext::ImplInit()
         return false;
     }
 
+    if (!compiledShaderBinariesWork())
+    {
+        wglMakeCurrent(NULL, NULL);
+        wglDeleteContext(hTempRC);
+        return false;
+    }
+
     wglMakeCurrent(NULL, NULL);
     wglDeleteContext(hTempRC);
 
commit 64061d8dd687efa1c78e5284ab01f2f16e5817c3
Author: Tor Lillqvist <tml at collabora.com>
Date:   Mon May 30 14:17:35 2016 +0300

    Move exithelper.h to include
    
    We will want to use EXITHELPER_CRASH_WITH_RESTART in vcl, too.
    
    Change-Id: If34244a361b157e0e9c7cca55fc34f0574f39984

diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
index 38101ef..05c3f9b 100644
--- a/desktop/source/app/app.cxx
+++ b/desktop/source/app/app.cxx
@@ -35,7 +35,6 @@
 #include "lockfile.hxx"
 #include "userinstall.hxx"
 #include "desktopcontext.hxx"
-#include "exithelper.h"
 #include "migration.hxx"
 
 #include <svl/languageoptions.hxx>
@@ -76,6 +75,7 @@
 #include <com/sun/star/frame/thePopupMenuControllerFactory.hpp>
 #include <com/sun/star/office/Quickstart.hpp>
 
+#include <desktop/exithelper.h>
 #include <sal/log.hxx>
 #include <toolkit/helper/vclunohelper.hxx>
 #include <comphelper/configuration.hxx>
diff --git a/desktop/unx/source/start.c b/desktop/unx/source/start.c
index 893c79c..b56477d 100644
--- a/desktop/unx/source/start.c
+++ b/desktop/unx/source/start.c
@@ -25,6 +25,7 @@
 #include <string.h>
 #include <errno.h>
 
+#include <desktop/exithelper.h>
 #include <osl/process.h>
 #include <osl/thread.h>
 #include <rtl/bootstrap.h>
@@ -34,7 +35,6 @@
 #include <sal/main.h>
 
 #include "args.h"
-#include "../../source/inc/exithelper.h"
 #include "pagein.h"
 #include "splashx.h"
 
diff --git a/desktop/win32/source/officeloader/officeloader.cxx b/desktop/win32/source/officeloader/officeloader.cxx
index 3f9760f..ea442bd 100644
--- a/desktop/win32/source/officeloader/officeloader.cxx
+++ b/desktop/win32/source/officeloader/officeloader.cxx
@@ -38,10 +38,10 @@
 #include <stdlib.h>
 #include <systools/win32/uwinapi.h>
 
+#include <desktop/exithelper.h>
 #include <rtl/string.h>
 #include <sal/macros.h>
 
-#include "../../../source/inc/exithelper.h"
 #include "../loader.hxx"
 
 #include <config_version.h>
diff --git a/desktop/source/inc/exithelper.h b/include/desktop/exithelper.h
similarity index 90%
rename from desktop/source/inc/exithelper.h
rename to include/desktop/exithelper.h
index b29af5b..d6e337c 100644
--- a/desktop/source/inc/exithelper.h
+++ b/include/desktop/exithelper.h
@@ -17,8 +17,8 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
-#ifndef INCLUDED_DESKTOP_SOURCE_INC_EXITHELPER_H
-#define INCLUDED_DESKTOP_SOURCE_INC_EXITHELPER_H
+#ifndef INCLUDED_DESKTOP_EXITHELPER_H
+#define INCLUDED_DESKTOP_EXITHELPER_H
 
 enum EExitCodes {
     /* e.g. used to force showing of the command line help */
@@ -33,6 +33,6 @@ enum EExitCodes {
     EXITHELPER_NORMAL_RESTART = 81
 };
 
-#endif // INCLUDED_DESKTOP_SOURCE_INC_EXITHELPER_H
+#endif // INCLUDED_DESKTOP_EXITHELPER_H
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list