diff options
27 files changed, 12 insertions, 863 deletions
diff --git a/canvas/Executable_canvasdemo.mk b/canvas/Executable_canvasdemo.mk index e47ae11dd13f..b213293e4780 100644 --- a/canvas/Executable_canvasdemo.mk +++ b/canvas/Executable_canvasdemo.mk @@ -31,6 +31,7 @@ $(eval $(call gb_Executable_use_libraries,canvasdemo,\ tl \ sal \ salhelper \ + vcl \ )) $(eval $(call gb_Executable_add_exception_objects,canvasdemo,\ diff --git a/compilerplugins/clang/reservedid.cxx b/compilerplugins/clang/reservedid.cxx index 69f5da564eec..2ef713916569 100644 --- a/compilerplugins/clang/reservedid.cxx +++ b/compilerplugins/clang/reservedid.cxx @@ -169,8 +169,6 @@ bool ReservedId::VisitNamedDecl(NamedDecl const * decl) { // vcl/source/window/cairo_cairo.cxx -> include/vcl/sysdata.hxx && s != "__CxxDetectRethrow" // bridges/source/cpp_uno/msvc_win32_x86-64/mscx.hxx - && s != "__GLXcontextRec" // vcl/unx/glxtest.cxx - && s != "__GLXFBConfigRec" // vcl/unx/glxtest.cxx && s != "__PK11_GetKeyData" // xmlsecurity/source/xmlsec/nss/nssrenam.h && s != "__current_exception" // bridges/inc/except.hxx, Windows diff --git a/desktop/CppunitTest_desktop_app.mk b/desktop/CppunitTest_desktop_app.mk index ee5c1247cc91..d6159e28136f 100644 --- a/desktop/CppunitTest_desktop_app.mk +++ b/desktop/CppunitTest_desktop_app.mk @@ -47,10 +47,9 @@ $(eval $(call gb_CppunitTest_use_libraries,desktop_app, \ tl \ ucbhelper \ utl \ + vcl \ )) -$(eval $(call gb_CppunitTest_use_glxtest,desktop_app,-lm)) - ifeq ($(OS),WNT) $(eval $(call gb_CppunitTest_use_static_libraries,desktop_app,\ $(if $(ENABLE_ONLINE_UPDATE_MAR),\ diff --git a/desktop/Library_sofficeapp.mk b/desktop/Library_sofficeapp.mk index d10c4f3c3403..70f4b07ea045 100644 --- a/desktop/Library_sofficeapp.mk +++ b/desktop/Library_sofficeapp.mk @@ -73,10 +73,9 @@ $(eval $(call gb_Library_use_libraries,sofficeapp,\ tl \ ucbhelper \ utl \ + vcl \ )) -$(eval $(call gb_Library_use_glxtest,sofficeapp,-lm)) - ifeq ($(OS),WNT) $(eval $(call gb_Library_use_static_libraries,sofficeapp,\ $(if $(ENABLE_ONLINE_UPDATE_MAR),\ diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx index caf9358683cf..a45ce9f82a51 100644 --- a/desktop/source/app/app.cxx +++ b/desktop/source/app/app.cxx @@ -105,7 +105,6 @@ #endif #include <rtl/bootstrap.hxx> #include <vcl/test/GraphicsRenderTests.hxx> -#include <vcl/glxtestprocess.hxx> #include <vcl/help.hxx> #include <vcl/weld.hxx> #include <vcl/settings.hxx> @@ -1574,9 +1573,6 @@ int Desktop::Main() //Running the VCL graphics rendering tests runGraphicsRenderTests(); - // Reap the process started by fire_glxtest_process(). - reap_glxtest_process(); - // Post user event to startup first application component window // We have to send this OpenClients message short before execute() to // minimize the risk that this message overtakes type detection construction!! diff --git a/desktop/source/app/sofficemain.cxx b/desktop/source/app/sofficemain.cxx index d95356fd255d..0b02155f59fb 100644 --- a/desktop/source/app/sofficemain.cxx +++ b/desktop/source/app/sofficemain.cxx @@ -33,7 +33,6 @@ #include <sal/log.hxx> #include <sal/main.h> #include <tools/extendapplicationenvironment.hxx> -#include <vcl/glxtestprocess.hxx> #include <vcl/svmain.hxx> #if HAVE_FEATURE_BREAKPAD @@ -59,9 +58,6 @@ extern "C" int DESKTOP_DLLPUBLIC soffice_main() CrashReporter::installExceptionHandler(); #endif - bool bSuccess = fire_glxtest_process(); - SAL_WARN_IF(!bSuccess, "desktop.opengl", "problems with glxtest"); - #if defined ANDROID try { rtl::Bootstrap::setIniFilename("file:///assets/program/lofficerc"); diff --git a/include/sal/log-areas.dox b/include/sal/log-areas.dox index 7d61cfd3d3cd..edb93fea244b 100644 --- a/include/sal/log-areas.dox +++ b/include/sal/log-areas.dox @@ -171,7 +171,6 @@ certain functionality. @li @c desktop.lib @li @c desktop.migration @li @c desktop.offacc -@li @c desktop.opengl @li @c desktop.splash @li @c desktop.test @li @c desktop.updater diff --git a/include/vcl/glxtestprocess.hxx b/include/vcl/glxtestprocess.hxx deleted file mode 100644 index c8668a69d50f..000000000000 --- a/include/vcl/glxtestprocess.hxx +++ /dev/null @@ -1,34 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#pragma once - -#include <sal/config.h> -#include <config_features.h> - -#if defined(UNX) && !defined MACOSX && !defined IOS && !defined ANDROID && HAVE_FEATURE_UI \ - && HAVE_FEATURE_OPENGL -/* Run test for OpenGL support in own process to avoid crash with broken - * OpenGL drivers. Start process as early as possible. - * The process will be reaped late in Desktop::Main (desktop/source/app/app.cxx). - */ - -bool fire_glxtest_process(); - -void reap_glxtest_process(); - -#else - -inline bool fire_glxtest_process() { return true; } - -inline void reap_glxtest_process() {} - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/solenv/clang-format/excludelist b/solenv/clang-format/excludelist index d2adcf0b54c8..2749c694b9a5 100644 --- a/solenv/clang-format/excludelist +++ b/solenv/clang-format/excludelist @@ -14382,7 +14382,6 @@ vcl/inc/jobdata.hxx vcl/inc/jobset.h vcl/inc/listbox.hxx vcl/inc/opengl/win/WinDeviceInfo.hxx -vcl/inc/opengl/x11/X11DeviceInfo.hxx vcl/inc/osx/a11yfactory.h vcl/inc/osx/a11yfocustracker.hxx vcl/inc/osx/a11ywrapper.h @@ -14936,7 +14935,6 @@ vcl/source/opengl/OpenGLContext.cxx vcl/source/opengl/OpenGLHelper.cxx vcl/source/opengl/win/WinDeviceInfo.cxx vcl/source/opengl/win/context.cxx -vcl/source/opengl/x11/X11DeviceInfo.cxx vcl/source/opengl/x11/context.cxx vcl/source/outdev/background.cxx vcl/source/outdev/bitmap.cxx @@ -15123,7 +15121,6 @@ vcl/unx/generic/printer/printerinfomanager.cxx vcl/unx/generic/window/salframe.cxx vcl/unx/generic/window/salobj.cxx vcl/unx/generic/window/screensaverinhibitor.cxx -vcl/unx/glxtest.cxx vcl/unx/gtk3/a11y/atklistener.hxx vcl/unx/gtk3/a11y/atkwrapper.hxx vcl/unx/gtk3/a11y/atkaction.cxx diff --git a/solenv/gbuild/CppunitTest.mk b/solenv/gbuild/CppunitTest.mk index 7fc1cd79c12d..995910cfbd0c 100644 --- a/solenv/gbuild/CppunitTest.mk +++ b/solenv/gbuild/CppunitTest.mk @@ -489,7 +489,6 @@ gb_CppunitTest_set_external_code = $(call gb_CppunitTest__forward_to_Linktarget, gb_CppunitTest_set_generated_cxx_suffix = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_CppunitTest_use_clang = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_CppunitTest_set_clang_precompiled_header = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3)) -gb_CppunitTest_use_glxtest = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_CppunitTest_use_vclmain = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_CppunitTest_add_prejs = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3)) diff --git a/solenv/gbuild/Executable.mk b/solenv/gbuild/Executable.mk index 89a3d140783f..7c8cf199496d 100644 --- a/solenv/gbuild/Executable.mk +++ b/solenv/gbuild/Executable.mk @@ -157,7 +157,6 @@ gb_Executable_set_external_code = $(call gb_Executable__forward_to_Linktarget,$( gb_Executable_set_generated_cxx_suffix = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Executable_use_clang = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Executable_set_clang_precompiled_header = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3)) -gb_Executable_use_glxtest = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Executable_use_vclmain = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Executable_add_prejs = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3)) diff --git a/solenv/gbuild/Library.mk b/solenv/gbuild/Library.mk index 792348d99577..d82a261e002b 100644 --- a/solenv/gbuild/Library.mk +++ b/solenv/gbuild/Library.mk @@ -290,7 +290,6 @@ gb_Library_set_external_code = $(call gb_Library__forward_to_Linktarget,$(0),$(1 gb_Library_set_generated_cxx_suffix = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Library_use_clang = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Library_set_clang_precompiled_header = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3)) -gb_Library_use_glxtest = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Library_use_vclmain = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3)) gb_Library_set_is_ure_library_or_dependency = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3)) diff --git a/solenv/gbuild/LinkTarget.mk b/solenv/gbuild/LinkTarget.mk index 86533ab3f60f..37524f9b59eb 100644 --- a/solenv/gbuild/LinkTarget.mk +++ b/solenv/gbuild/LinkTarget.mk @@ -2206,26 +2206,8 @@ $(call gb_LinkTarget_get_target,$(1)) : T_USE_LD := $(or $(CLANG_USE_LD),$(USE_L $(call gb_LinkTarget_get_target,$(1)) : T_LTOFLAGS := $(or $(gb_CLANG_LTOFLAGS),$(gb_LTOFLAGS)) endef -# call gb_LinkTarget_use_glxtest,linktarget,add_libs -define gb_LinkTarget_use_glxtest -$(call gb_LinkTarget_use_libraries,$(1),vcl,,$(4)) - -ifeq (,$(DISABLE_DYNLOADING)) -$(call gb_LinkTarget_add_libs,$(1),$(UNIX_DLAPI_LIBS)) -endif - -ifeq (,$(DISABLE_GUI)) -ifeq ($(USING_X11),TRUE) -$(call gb_LinkTarget_add_libs,$(1),-lX11 $(2)) -$(call gb_LinkTarget_use_static_libraries,$(1),glxtest) -endif -endif - -endef # gb_LinkTarget_use_glxtest - -# call gb_LinkTarget_use_vclmain,linktarget,add_libs +# call gb_LinkTarget_use_vclmain,linktarget define gb_LinkTarget_use_vclmain -$(call gb_LinkTarget_use_glxtest,$(1),$(2)) $(call gb_LinkTarget_use_static_libraries,$(1),vclmain) endef # gb_LinkTarget_use_vclmain diff --git a/svx/Executable_gengal.mk b/svx/Executable_gengal.mk index fdf3eb3843bc..2b16d8f74da9 100644 --- a/svx/Executable_gengal.mk +++ b/svx/Executable_gengal.mk @@ -45,6 +45,7 @@ $(eval $(call gb_Executable_use_libraries,gengal,\ cppuhelper \ utl \ svxcore \ + vcl \ )) $(eval $(call gb_Executable_use_vclmain,gengal)) diff --git a/vcl/Executable_icontest.mk b/vcl/Executable_icontest.mk index 630198237907..60a69bc7a156 100644 --- a/vcl/Executable_icontest.mk +++ b/vcl/Executable_icontest.mk @@ -37,6 +37,7 @@ $(eval $(call gb_Executable_use_libraries,icontest,\ sal \ tl \ ucbhelper \ + vcl \ )) $(eval $(call gb_Executable_use_vclmain,icontest)) diff --git a/vcl/Executable_mtfdemo.mk b/vcl/Executable_mtfdemo.mk index 4b192c14533a..31e017f08d18 100644 --- a/vcl/Executable_mtfdemo.mk +++ b/vcl/Executable_mtfdemo.mk @@ -31,6 +31,7 @@ $(eval $(call gb_Executable_use_libraries,mtfdemo,\ drawinglayer \ emfio \ i18nlangtag \ + vcl \ )) $(eval $(call gb_Executable_use_vclmain,mtfdemo)) diff --git a/vcl/Executable_vcldemo.mk b/vcl/Executable_vcldemo.mk index e4076ac08231..beb8809bd7a4 100644 --- a/vcl/Executable_vcldemo.mk +++ b/vcl/Executable_vcldemo.mk @@ -40,6 +40,7 @@ $(eval $(call gb_Executable_use_libraries,vcldemo,\ salhelper \ fwk \ i18nlangtag \ + vcl \ )) $(eval $(call gb_Executable_use_vclmain,vcldemo)) diff --git a/vcl/Executable_visualbackendtest.mk b/vcl/Executable_visualbackendtest.mk index c1db9ce874ec..567399464e0c 100644 --- a/vcl/Executable_visualbackendtest.mk +++ b/vcl/Executable_visualbackendtest.mk @@ -28,9 +28,10 @@ $(eval $(call gb_Executable_use_libraries,visualbackendtest,\ tl \ sal \ salhelper \ + vcl \ )) -$(eval $(call gb_Executable_use_vclmain,visualbackendtest,-lm)) +$(eval $(call gb_Executable_use_vclmain,visualbackendtest)) $(eval $(call gb_Executable_add_exception_objects,visualbackendtest,\ vcl/backendtest/VisualBackendTest \ diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index a0f61992b74b..a141e22348dd 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -584,15 +584,6 @@ $(eval $(call gb_Library_add_libs,vcl,\ -lX11 \ -lXext \ )) - -ifneq (,$(filter LINUX %BSD SOLARIS,$(OS))) -$(eval $(call gb_Library_use_static_libraries,vcl,\ - glxtest \ -)) -$(eval $(call gb_Library_add_exception_objects,vcl,\ - vcl/source/opengl/x11/X11DeviceInfo \ -)) -endif endif # USING_X11 diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk index 090e517b0d0a..33485fefa52a 100644 --- a/vcl/Module_vcl.mk +++ b/vcl/Module_vcl.mk @@ -70,7 +70,6 @@ ifeq ($(USING_X11),TRUE) $(eval $(call gb_Module_add_targets,vcl,\ $(if $(ENABLE_GEN),Library_vclplug_gen) \ Library_desktop_detector \ - StaticLibrary_glxtest \ Package_fontunxppds \ Package_fontunxpsprint \ )) diff --git a/vcl/StaticLibrary_glxtest.mk b/vcl/StaticLibrary_glxtest.mk deleted file mode 100644 index b082e47e2882..000000000000 --- a/vcl/StaticLibrary_glxtest.mk +++ /dev/null @@ -1,41 +0,0 @@ -# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- -# -# This file is part of the LibreOffice project. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# This file incorporates work covered by the following license notice: -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed -# with this work for additional information regarding copyright -# ownership. The ASF licenses this file to you under the Apache -# License, Version 2.0 (the "License"); you may not use this file -# except in compliance with the License. You may obtain a copy of -# the License at http://www.apache.org/licenses/LICENSE-2.0 . -# - -$(eval $(call gb_StaticLibrary_StaticLibrary,glxtest)) - -$(eval $(call gb_StaticLibrary_set_include,glxtest,\ - $$(INCLUDE) \ - -I$(SRCDIR)/vcl/inc \ -)) - -$(eval $(call gb_StaticLibrary_use_api,glxtest,\ - offapi \ - udkapi \ -)) - -$(eval $(call gb_StaticLibrary_add_libs,glxtest,\ - -lm $(UNIX_DLAPI_LIBS) \ - -lX11 \ -)) - -$(eval $(call gb_StaticLibrary_add_exception_objects,glxtest,\ - vcl/unx/glxtest \ -)) - -# vim: set noet sw=4 ts=4: diff --git a/vcl/inc/opengl/x11/X11DeviceInfo.hxx b/vcl/inc/opengl/x11/X11DeviceInfo.hxx deleted file mode 100644 index 91a97d1c150e..000000000000 --- a/vcl/inc/opengl/x11/X11DeviceInfo.hxx +++ /dev/null @@ -1,48 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#ifndef INCLUDED_VCL_INC_OPENGL_X11_X11DEVICEINFO_HXX -#define INCLUDED_VCL_INC_OPENGL_X11_X11DEVICEINFO_HXX - -#include <rtl/string.hxx> - -class X11OpenGLDeviceInfo final -{ -private: - bool mbIsMesa; - bool mbIsNVIDIA; - bool mbIsFGLRX; - bool mbIsNouveau; - bool mbIsIntel; - bool mbIsOldSwrast; - bool mbIsLlvmpipe; - - OString maVendor; - OString maRenderer; - OString maVersion; - OString maOS; - OString maOSRelease; - - size_t mnGLMajorVersion; - size_t mnMajorVersion; - size_t mnMinorVersion; - size_t mnRevisionVersion; - - void GetData(); - -public: - X11OpenGLDeviceInfo(); - - bool isDeviceBlocked(); - -}; - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/opengl/x11/glxtest.hxx b/vcl/inc/opengl/x11/glxtest.hxx deleted file mode 100644 index 5715a6d9fb19..000000000000 --- a/vcl/inc/opengl/x11/glxtest.hxx +++ /dev/null @@ -1,21 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#ifndef INCLUDED_VCL_INC_OPENGL_X11_GLXTEST_HXX -#define INCLUDED_VCL_INC_OPENGL_X11_GLXTEST_HXX - -#include <vcl/dllapi.h> - -VCL_DLLPUBLIC int* getGlxPipe(); - -VCL_DLLPUBLIC pid_t* getGlxPid(); - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/opengl/OpenGLHelper.cxx b/vcl/source/opengl/OpenGLHelper.cxx index 5bd10ebf353d..a0dff4a5f567 100644 --- a/vcl/source/opengl/OpenGLHelper.cxx +++ b/vcl/source/opengl/OpenGLHelper.cxx @@ -37,13 +37,10 @@ #include <bitmap/BitmapWriteAccess.hxx> #include <watchdog.hxx> #include <vcl/skia/SkiaHelper.hxx> -#include <vcl/glxtestprocess.hxx> #include <salinst.hxx> #include <svdata.hxx> -#if USING_X11 -#include <opengl/x11/X11DeviceInfo.hxx> -#elif defined (_WIN32) +#if defined (_WIN32) #include <opengl/win/WinDeviceInfo.hxx> #endif @@ -756,11 +753,7 @@ bool OpenGLHelper::isDeviceDenylisted() { OpenGLZone aZone; -#if USING_X11 - X11OpenGLDeviceInfo aInfo; - bDenylisted = aInfo.isDeviceBlocked(); - SAL_INFO("vcl.opengl", "denylisted: " << bDenylisted); -#elif defined( _WIN32 ) +#if defined( _WIN32 ) WinOpenGLDeviceInfo aInfo; bDenylisted = aInfo.isDeviceBlocked(); diff --git a/vcl/source/opengl/x11/X11DeviceInfo.cxx b/vcl/source/opengl/x11/X11DeviceInfo.cxx deleted file mode 100644 index f7c979ef77e6..000000000000 --- a/vcl/source/opengl/x11/X11DeviceInfo.cxx +++ /dev/null @@ -1,363 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#include <opengl/x11/X11DeviceInfo.hxx> -#include <opengl/x11/glxtest.hxx> - -#include <config_features.h> - -#include <rtl/ustring.hxx> -#include <sal/log.hxx> - -#include <unistd.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <errno.h> -#include <sys/utsname.h> - -#include <desktop/crashreport.hxx> - -namespace glx { - -static int glxtest_pipe = 0; - -static pid_t glxtest_pid = 0; - -} - -pid_t* getGlxPid() -{ - return &glx::glxtest_pid; -} - -int* getGlxPipe() -{ - return &glx::glxtest_pipe; -} - -namespace { - -const char* -strspnp_wrapper(const char* aDelims, const char* aStr) -{ - const char* d; - do - { - for (d = aDelims; *d != '\0'; ++d) - { - if (*aStr == *d) - { - ++aStr; - break; - } - } - } while (*d); - - return aStr; -} - -char* strtok_wrapper(const char* aDelims, char** aStr) -{ - if (!*aStr) - { - return nullptr; - } - - char* ret = const_cast<char*>(strspnp_wrapper(aDelims, *aStr)); - - if (!*ret) - { - *aStr = ret; - return nullptr; - } - - char* i = ret; - do - { - for (const char* d = aDelims; *d != '\0'; ++d) - { - if (*i == *d) { - *i = '\0'; - *aStr = ++i; - return ret; - } - } - ++i; - } while (*i); - - *aStr = nullptr; - return ret; -} - -uint64_t version(uint32_t major, uint32_t minor, uint32_t revision = 0) -{ - return (uint64_t(major) << 32) + (uint64_t(minor) << 16) + uint64_t(revision); -} - -} - -X11OpenGLDeviceInfo::X11OpenGLDeviceInfo(): - mbIsMesa(false), - mbIsNVIDIA(false), - mbIsFGLRX(false), - mbIsNouveau(false), - mbIsIntel(false), - mbIsOldSwrast(false), - mbIsLlvmpipe(false), - mnGLMajorVersion(0), - mnMajorVersion(0), - mnMinorVersion(0), - mnRevisionVersion(0) -{ - GetData(); -} - -void X11OpenGLDeviceInfo::GetData() -{ - if (!glx::glxtest_pipe) - return; - - // to understand this function, see bug moz#639842. We retrieve the OpenGL driver information in a - // separate process to protect against bad drivers. - enum { buf_size = 1024 }; - char buf[buf_size]; - ssize_t bytesread = read(glx::glxtest_pipe, - &buf, - buf_size-1); // -1 because we'll append a zero - close(glx::glxtest_pipe); - glx::glxtest_pipe = 0; - - // bytesread < 0 would mean that the above read() call failed. - // This should never happen. If it did, the outcome would be to denylist anyway. - if (bytesread < 0) - bytesread = 0; - - // let buf be a zero-terminated string - buf[bytesread] = 0; - - // Wait for the glxtest process to finish. This serves 2 purposes: - // * avoid having a zombie glxtest process laying around - // * get the glxtest process status info. - int glxtest_status = 0; - bool wait_for_glxtest_process = true; - bool waiting_for_glxtest_process_failed = false; - int waitpid_errno = 0; - while(wait_for_glxtest_process) - { - wait_for_glxtest_process = false; - if (waitpid(glx::glxtest_pid, &glxtest_status, 0) == -1) - { - waitpid_errno = errno; - if (waitpid_errno == EINTR) - { - wait_for_glxtest_process = true; - } - else - { - // Bug moz#718629 - // ECHILD happens when the glxtest process got reaped got reaped after a PR_CreateProcess - // as per bug moz#227246. This shouldn't matter, as we still seem to get the data - // from the pipe, and if we didn't, the outcome would be to denylist anyway. - waiting_for_glxtest_process_failed = (waitpid_errno != ECHILD); - } - } - } - - bool exited_with_error_code = !waiting_for_glxtest_process_failed && - WIFEXITED(glxtest_status) && - WEXITSTATUS(glxtest_status) != EXIT_SUCCESS; - bool received_signal = !waiting_for_glxtest_process_failed && - WIFSIGNALED(glxtest_status); - - bool error = waiting_for_glxtest_process_failed || exited_with_error_code || received_signal; - - OString textureFromPixmap; - OString *stringToFill = nullptr; - char *bufptr = buf; - if (!error) - { - while(true) - { - char *line = strtok_wrapper("\n", &bufptr); - if (!line) - break; - if (stringToFill) { - *stringToFill = OString(line); - stringToFill = nullptr; - } - else if(!strcmp(line, "VENDOR")) - stringToFill = &maVendor; - else if(!strcmp(line, "RENDERER")) - stringToFill = &maRenderer; - else if(!strcmp(line, "VERSION")) - stringToFill = &maVersion; - else if(!strcmp(line, "TFP")) - stringToFill = &textureFromPixmap; - } - } - - // only useful for Linux kernel version check for FGLRX driver. - // assumes X client == X server, which is sad. - struct utsname unameobj; - if (!uname(&unameobj)) - { - maOS = OString(unameobj.sysname); - maOSRelease = OString(unameobj.release); - } - - // determine the major OpenGL version. That's the first integer in the version string. - mnGLMajorVersion = strtol(maVersion.getStr(), nullptr, 10); - - // determine driver type (vendor) and where in the version string - // the actual driver version numbers should be expected to be found (whereToReadVersionNumbers) - const char *whereToReadVersionNumbers = nullptr; - const char *Mesa_in_version_string = strstr(maVersion.getStr(), "Mesa"); - if (Mesa_in_version_string) - { - mbIsMesa = true; - // with Mesa, the version string contains "Mesa major.minor" and that's all the version information we get: - // there is no actual driver version info. - whereToReadVersionNumbers = Mesa_in_version_string + strlen("Mesa"); - if (strcasestr(maVendor.getStr(), "nouveau")) - mbIsNouveau = true; - if (strcasestr(maRenderer.getStr(), "intel")) // yes, intel is in the renderer string - mbIsIntel = true; - if (strcasestr(maRenderer.getStr(), "llvmpipe")) - mbIsLlvmpipe = true; - if (strcasestr(maRenderer.getStr(), "software rasterizer")) - mbIsOldSwrast = true; - } - else if (strstr(maVendor.getStr(), "NVIDIA Corporation")) - { - mbIsNVIDIA = true; - // with the NVIDIA driver, the version string contains "NVIDIA major.minor" - // note that here the vendor and version strings behave differently, that's why we don't put this above - // alongside Mesa_in_version_string. - const char *NVIDIA_in_version_string = strstr(maVersion.getStr(), "NVIDIA"); - if (NVIDIA_in_version_string) - whereToReadVersionNumbers = NVIDIA_in_version_string + strlen("NVIDIA"); - } - else if (strstr(maVendor.getStr(), "ATI Technologies Inc")) - { - mbIsFGLRX = true; - // with the FGLRX driver, the version string only gives an OpenGL version: so let's return that. - // that can at least give a rough idea of how old the driver is. - whereToReadVersionNumbers = maVersion.getStr(); - } - - // read major.minor version numbers of the driver (not to be confused with the OpenGL version) - if (!whereToReadVersionNumbers) - return; - - // copy into writable buffer, for tokenization - strncpy(buf, whereToReadVersionNumbers, buf_size-1); - buf[buf_size-1] = 0; - bufptr = buf; - - // now try to read major.minor version numbers. In case of failure, gracefully exit: these numbers have - // been initialized as 0 anyways - char *token = strtok_wrapper(".", &bufptr); - if (token) - { - mnMajorVersion = strtol(token, nullptr, 10); - token = strtok_wrapper(".", &bufptr); - if (token) - { - mnMinorVersion = strtol(token, nullptr, 10); - token = strtok_wrapper(".", &bufptr); - if (token) - mnRevisionVersion = strtol(token, nullptr, 10); - } - } -} - -bool X11OpenGLDeviceInfo::isDeviceBlocked() -{ - // don't even try to use OpenGL 1.x - if (mnGLMajorVersion == 1) - return true; - - CrashReporter::addKeyValue("AdapterVendorId", OStringToOUString(maVendor, RTL_TEXTENCODING_UTF8), CrashReporter::AddItem); - CrashReporter::addKeyValue("AdapterDeviceId", OStringToOUString(maRenderer, RTL_TEXTENCODING_UTF8), CrashReporter::Write); - - SAL_INFO("vcl.opengl", "Vendor: " << maVendor); - SAL_INFO("vcl.opengl", "Renderer: " << maRenderer); - SAL_INFO("vcl.opengl", "Version: " << maVersion); - SAL_INFO("vcl.opengl", "OS: " << maOS); - SAL_INFO("vcl.opengl", "OSRelease: " << maOSRelease); - - if (mbIsMesa) - { - if (mbIsNouveau && version(mnMajorVersion, mnMinorVersion) < version(8,0)) - { - SAL_WARN("vcl.opengl", "blocked driver version: old nouveau driver (requires mesa 8.0+)"); - return true; - } - else if (version(mnMajorVersion, mnMinorVersion, mnRevisionVersion) < version(7,10,3)) - { - SAL_WARN("vcl.opengl", "blocked driver version: requires at least mesa 7.10.3"); - return true; - } - else if (mbIsIntel && version(mnMajorVersion, mnMinorVersion, mnRevisionVersion) == version(9,0,2)) - { - SAL_WARN("vcl.opengl", "blocked driver version: my broken intel driver Mesa 9.0.2"); - return true; - } - else if (mbIsOldSwrast) - { - SAL_WARN("vcl.opengl", "blocked driver version: software rasterizer"); - return true; - } - else if (mbIsLlvmpipe && version(mnMajorVersion, mnMinorVersion) < version(9, 1)) - { - // bug moz#791905, Mesa bug 57733, fixed in Mesa 9.1 according to - // https://bugs.freedesktop.org/show_bug.cgi?id=57733#c3 - SAL_WARN("vcl.opengl", "blocked driver version: fdo#57733"); - return true; - } - } - else if (mbIsNVIDIA) - { - if (version(mnMajorVersion, mnMinorVersion, mnRevisionVersion) < version(257,21)) - { - SAL_WARN("vcl.opengl", "blocked driver version: nvidia requires at least 257.21"); - return true; - } - } - else if (mbIsFGLRX) - { - // FGLRX does not report a driver version number, so we have the OpenGL version instead. - // by requiring OpenGL 3, we effectively require recent drivers. - if (version(mnMajorVersion, mnMinorVersion, mnRevisionVersion) < version(3, 0)) - { - SAL_WARN("vcl.opengl", "blocked driver version: require at least OpenGL 3 for fglrx"); - return true; - } - // Bug moz#724640: FGLRX + Linux 2.6.32 is a crashy combo - bool unknownOS = maOS.isEmpty() || maOSRelease.isEmpty(); - bool badOS = maOS.indexOf("Linux") != -1 && - maOSRelease.indexOf("2.6.32") != -1; - if (unknownOS || badOS) - { - SAL_WARN("vcl.opengl", "blocked OS version with fglrx"); - return true; - } - } - else - { - // like on windows, let's block unknown vendors. Think of virtual machines. - // Also, this case is hit whenever the GLXtest probe failed to get driver info or crashed. - SAL_WARN("vcl.opengl", "unknown vendor => blocked"); - return true; - } - - return false; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/salmain/salmain.cxx b/vcl/source/salmain/salmain.cxx index 06349efac5dd..721ae910f10a 100644 --- a/vcl/source/salmain/salmain.cxx +++ b/vcl/source/salmain/salmain.cxx @@ -22,13 +22,11 @@ #include <sal/main.h> #include <tools/extendapplicationenvironment.hxx> -#include <vcl/glxtestprocess.hxx> #include <vcl/vclmain.hxx> #include <vcl/svmain.hxx> SAL_IMPLEMENT_MAIN() { - fire_glxtest_process(); tools::extendApplicationEnvironment(); vclmain::createApplication(); return SVMain(); diff --git a/vcl/unx/glxtest.cxx b/vcl/unx/glxtest.cxx deleted file mode 100644 index b3c6a7521de7..000000000000 --- a/vcl/unx/glxtest.cxx +++ /dev/null @@ -1,294 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * vim: sw=2 ts=8 et : - */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -////////////////////////////////////////////////////////////////////////////// -// -// Explanation: See bug 639842. Safely getting GL driver info on X11 is hard, because the only way to do -// that is to create a GL context and call glGetString(), but with bad drivers, -// just creating a GL context may crash. -// -// This file implements the idea to do that in a separate process. -// -// The only non-static function here is fire_glxtest_process(). It creates a pipe, publishes its 'read' end as the -// mozilla::widget::glxtest_pipe global variable, forks, and runs that GLX probe in the child process, -// which runs the glxtest() static function. This creates a X connection, a GLX context, calls glGetString, and writes that -// to the 'write' end of the pipe. - -#include <cstdio> -#include <cstdlib> -#include <unistd.h> -#include <dlfcn.h> -#include <fcntl.h> -#include <stdint.h> -#include <string.h> -#include <signal.h> - -#include <sys/wait.h> - -#include <opengl/x11/glxtest.hxx> - -#ifdef __SUNPRO_CC -#include <stdio.h> -#endif - -#include <X11/Xlib.h> -#include <X11/Xutil.h> - -#include <sal/log.hxx> -#include <vcl/glxtestprocess.hxx> - -// stuff from glx.h -typedef struct __GLXcontextRec *GLXContext; -typedef XID GLXPixmap; -typedef XID GLXDrawable; -/* GLX 1.3 and later */ -typedef struct __GLXFBConfigRec *GLXFBConfig; -#define GLX_RGBA 4 -#define GLX_RED_SIZE 8 -#define GLX_GREEN_SIZE 9 -#define GLX_BLUE_SIZE 10 - -// stuff from gl.h -typedef uint8_t GLubyte; -typedef uint32_t GLenum; -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 - -// the write end of the pipe, which we're going to write to -static int write_end_of_the_pipe = -1; - -// C++ standard collides with C standard in that it doesn't allow casting void* to function pointer types. -// So the work-around is to convert first to size_t. -// http://www.trilithium.com/johan/2004/12/problem-with-dlsym/ -template<typename func_ptr_type> -static func_ptr_type cast(void *ptr) -{ - return reinterpret_cast<func_ptr_type>( - reinterpret_cast<size_t>(ptr) - ); -} - -static void fatal_error(const char *str) -{ - int length = strlen(str); - if (write(write_end_of_the_pipe, str, length) != length - || write(write_end_of_the_pipe, "\n", 1) != 1) - { - /* Cannot write to pipe. Fall through to call _exit */ - } - _exit(EXIT_FAILURE); -} - -static int -x_error_handler(Display *, XErrorEvent *ev) -{ - enum { bufsize = 1024 }; - char buf[bufsize]; - int length = snprintf(buf, bufsize, - "X error occurred in GLX probe, error_code=%d, request_code=%d, minor_code=%d\n", - ev->error_code, - ev->request_code, - ev->minor_code); - if (write(write_end_of_the_pipe, buf, length) != length) - { - /* Cannot write to pipe. Fall through to call _exit */ - } - _exit(EXIT_FAILURE); - return 0; -} - -static void glxtest() -{ - signal(SIGPIPE, SIG_IGN); - // we want to redirect to /dev/null stdout, stderr, and while we're at it, - // any PR logging file descriptors. To that effect, we redirect all positive - // file descriptors up to what open() returns here. In particular, 1 is stdout and 2 is stderr. - int fd = open("/dev/null", O_WRONLY); - if (fd == -1) - fatal_error("could not redirect stdout+stderr"); - for (int i = 1; i < fd; i++) - dup2(fd, i); - close(fd); - - ///// Open libGL and load needed symbols ///// -#ifdef __OpenBSD__ - #define LIBGL_FILENAME "libGL.so" -#else - #define LIBGL_FILENAME "libGL.so.1" -#endif - void *libgl = dlopen(LIBGL_FILENAME, RTLD_LAZY); - if (!libgl) - fatal_error("Unable to load " LIBGL_FILENAME); - - typedef void* (* PFNGLXGETPROCADDRESS) (const char *); - PFNGLXGETPROCADDRESS glXGetProcAddress = cast<PFNGLXGETPROCADDRESS>(dlsym(libgl, "glXGetProcAddress")); - - if (!glXGetProcAddress) - fatal_error("Unable to find glXGetProcAddress in " LIBGL_FILENAME); - - typedef GLXFBConfig* (* PFNGLXQUERYEXTENSION) (Display *, int *, int *); - PFNGLXQUERYEXTENSION glXQueryExtension = cast<PFNGLXQUERYEXTENSION>(glXGetProcAddress("glXQueryExtension")); - - typedef GLXFBConfig* (* PFNGLXQUERYVERSION) (Display *, int *, int *); - PFNGLXQUERYVERSION glXQueryVersion = cast<PFNGLXQUERYVERSION>(dlsym(libgl, "glXQueryVersion")); - - typedef XVisualInfo* (* PFNGLXCHOOSEVISUAL) (Display *, int, int *); - PFNGLXCHOOSEVISUAL glXChooseVisual = cast<PFNGLXCHOOSEVISUAL>(glXGetProcAddress("glXChooseVisual")); - - typedef GLXContext (* PFNGLXCREATECONTEXT) (Display *, XVisualInfo *, GLXContext, Bool); - PFNGLXCREATECONTEXT glXCreateContext = cast<PFNGLXCREATECONTEXT>(glXGetProcAddress("glXCreateContext")); - - typedef Bool (* PFNGLXMAKECURRENT) (Display*, GLXDrawable, GLXContext); - PFNGLXMAKECURRENT glXMakeCurrent = cast<PFNGLXMAKECURRENT>(glXGetProcAddress("glXMakeCurrent")); - - typedef void (* PFNGLXDESTROYCONTEXT) (Display*, GLXContext); - PFNGLXDESTROYCONTEXT glXDestroyContext = cast<PFNGLXDESTROYCONTEXT>(glXGetProcAddress("glXDestroyContext")); - - typedef GLubyte* (* PFNGLGETSTRING) (GLenum); - PFNGLGETSTRING glGetString = cast<PFNGLGETSTRING>(glXGetProcAddress("glGetString")); - - if (!glXQueryExtension || - !glXQueryVersion || - !glXChooseVisual || - !glXCreateContext || - !glXMakeCurrent || - !glXDestroyContext || - !glGetString) - { - fatal_error("glXGetProcAddress couldn't find required functions"); - } - ///// Open a connection to the X server ///// - Display *dpy = XOpenDisplay(nullptr); - if (!dpy) - fatal_error("Unable to open a connection to the X server"); - - ///// Check that the GLX extension is present ///// - if (!glXQueryExtension(dpy, nullptr, nullptr)) - fatal_error("GLX extension missing"); - - XSetErrorHandler(x_error_handler); - - ///// Get a visual ///// - int attribs[] = { - GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - None }; - XVisualInfo *vInfo = glXChooseVisual(dpy, DefaultScreen(dpy), attribs); - if (!vInfo) - fatal_error("No visuals found"); - - // using a X11 Window instead of a GLXPixmap does not crash - // fglrx in indirect rendering. bug 680644 - Window window; - XSetWindowAttributes swa; - swa.colormap = XCreateColormap(dpy, RootWindow(dpy, vInfo->screen), - vInfo->visual, AllocNone); - - swa.border_pixel = 0; - window = XCreateWindow(dpy, RootWindow(dpy, vInfo->screen), - 0, 0, 16, 16, - 0, vInfo->depth, InputOutput, vInfo->visual, - CWBorderPixel | CWColormap, &swa); - - ///// Get a GL context and make it current ////// - GLXContext context = glXCreateContext(dpy, vInfo, nullptr, True); - glXMakeCurrent(dpy, window, context); - - ///// Look for this symbol to determine texture_from_pixmap support ///// - void* glXBindTexImageEXT = glXGetProcAddress("glXBindTexImageEXT"); - - ///// Get GL vendor/renderer/versions strings ///// - enum { bufsize = 1024 }; - char buf[bufsize]; - const GLubyte *vendorString = glGetString(GL_VENDOR); - const GLubyte *rendererString = glGetString(GL_RENDERER); - const GLubyte *versionString = glGetString(GL_VERSION); - - if (!vendorString || !rendererString || !versionString) - fatal_error("glGetString returned null"); - - int length = snprintf(buf, bufsize, - "VENDOR\n%s\nRENDERER\n%s\nVERSION\n%s\nTFP\n%s\n", - vendorString, - rendererString, - versionString, - glXBindTexImageEXT ? "TRUE" : "FALSE"); - if (length >= bufsize) - fatal_error("GL strings length too large for buffer size"); - - ///// Clean up. Indeed, the parent process might fail to kill us (e.g. if it doesn't need to check GL info) - ///// so we might be staying alive for longer than expected, so it's important to consume as little memory as - ///// possible. Also we want to check that we're able to do that too without generating X errors. - glXMakeCurrent(dpy, None, nullptr); // must release the GL context before destroying it - glXDestroyContext(dpy, context); - XDestroyWindow(dpy, window); - XFreeColormap(dpy, swa.colormap); - XFree(vInfo); - -#ifdef NS_FREE_PERMANENT_DATA // conditionally defined in nscore.h, don't forget to #include it above - XCloseDisplay(dpy); -#else - // This XSync call wanted to be instead: - // XCloseDisplay(dpy); - // but this can cause 1-minute stalls on certain setups using Nouveau, see bug 973192 - XSync(dpy, False); -#endif - - dlclose(libgl); - - ///// Finally write data to the pipe - if (write(write_end_of_the_pipe, buf, length) != length) - fatal_error("Could not write to pipe"); -} - -/** \returns true in the child glxtest process, false in the parent process */ -bool fire_glxtest_process() -{ - int pfd[2]; - if (pipe(pfd) == -1) { - perror("pipe"); - return false; - } - pid_t pid = fork(); - if (pid < 0) { - perror("fork"); - close(pfd[0]); - close(pfd[1]); - return false; - } - // The child exits early to avoid running the full shutdown sequence and avoid conflicting with threads - // we have already spawned (like the profiler). - if (pid == 0) { - close(pfd[0]); - write_end_of_the_pipe = pfd[1]; - glxtest(); - close(pfd[1]); - _exit(0); - } - - close(pfd[1]); - int* glxtest_pipe = getGlxPipe(); - *glxtest_pipe = pfd[0]; - pid_t* glxtest_pid = getGlxPid(); - *glxtest_pid = pid; - return true; -} - -void reap_glxtest_process() { - pid_t * pid = getGlxPid(); - if (*pid != 0) { - // Use WNOHANG, as it is probably better to have a (rather harmless) zombie child process - // hanging around for the duration of the calling process, than to potentially block the - // calling process here: - pid_t e = waitpid(*pid, nullptr, WNOHANG); - SAL_INFO_IF( - e <= 0, "vcl.opengl", "waiting for glxtest process " << *pid << " failed with " << e); - } -} |