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 <t...@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 <t...@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: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits