From f7c4e22e6083c328ac542941b88a12fdb69c4442 Mon Sep 17 00:00:00 2001 From: binary1248 Date: Sat, 7 Apr 2018 02:17:05 +0200 Subject: [PATCH] Moved NvOptimusEnablement and AmdPowerXpressRequestHighPerformance out of sfml-main and into a macro the user can place in their own translation unit when they need it. Fixes #1192 --- CMakeLists.txt | 1 + include/SFML/GpuPreference.hpp | 74 ++++++++++++++++++++++++++++++++++ include/SFML/Window.hpp | 1 + include/SFML/Window/Window.hpp | 8 ++++ src/SFML/Main/MainWin32.cpp | 8 ---- 5 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 include/SFML/GpuPreference.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8daaac8bcc..1fb3a5f26b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -366,6 +366,7 @@ else() add_custom_command(TARGET SFML POST_BUILD COMMAND cp -r ${PROJECT_SOURCE_DIR}/include/SFML/Config.hpp ${PROJECT_SOURCE_DIR}/include/SFML/OpenGL.hpp + ${PROJECT_SOURCE_DIR}/include/SFML/GpuPreference.hpp ${PROJECT_SOURCE_DIR}/include/SFML/System.hpp ${PROJECT_SOURCE_DIR}/include/SFML/Main.hpp ${PROJECT_SOURCE_DIR}/include/SFML/System diff --git a/include/SFML/GpuPreference.hpp b/include/SFML/GpuPreference.hpp new file mode 100644 index 0000000000..cde4f9f1ee --- /dev/null +++ b/include/SFML/GpuPreference.hpp @@ -0,0 +1,74 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef SFML_GPUPREFERENCE_HPP +#define SFML_GPUPREFERENCE_HPP + + +//////////////////////////////////////////////////////////// +/// Headers +//////////////////////////////////////////////////////////// +#include + + +//////////////////////////////////////////////////////////// +/// \file +/// +/// \brief File containing SFML_DEFINE_DISCRETE_GPU_PREFERENCE +/// +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// \def SFML_DEFINE_DISCRETE_GPU_PREFERENCE +/// +/// \brief A macro to encourage usage of the discrete GPU +/// +/// In order to inform the Nvidia/AMD driver that an SFML +/// application could benefit from using the more powerful +/// discrete GPU, special symbols have to be publicly +/// exported from the final executable. +/// +/// SFML defines a helper macro to easily do this. +/// +/// Place SFML_DEFINE_DISCRETE_GPU_PREFERENCE in the +/// global scope of a source file that will be linked into +/// the final executable. Typically it is best to place it +/// where the main function is also defined. +/// +//////////////////////////////////////////////////////////// +#if defined(SFML_SYSTEM_WINDOWS) + + #define SFML_DEFINE_DISCRETE_GPU_PREFERENCE \ + extern "C" __declspec(dllexport) unsigned long NvOptimusEnablement = 1; \ + extern "C" __declspec(dllexport) unsigned long AmdPowerXpressRequestHighPerformance = 1; + +#else + + #define SFML_DEFINE_DISCRETE_GPU_PREFERENCE + +#endif + + +#endif // SFML_GPUPREFERENCE_HPP diff --git a/include/SFML/Window.hpp b/include/SFML/Window.hpp index 836f13a5c2..3d82429a14 100644 --- a/include/SFML/Window.hpp +++ b/include/SFML/Window.hpp @@ -30,6 +30,7 @@ //////////////////////////////////////////////////////////// #include +#include #include #include #include diff --git a/include/SFML/Window/Window.hpp b/include/SFML/Window/Window.hpp index c8a5617694..7ff81e2947 100644 --- a/include/SFML/Window/Window.hpp +++ b/include/SFML/Window/Window.hpp @@ -581,6 +581,14 @@ class SFML_WINDOW_API Window : GlResource, NonCopyable /// structure which is passed as an optional argument when creating the /// window. /// +/// On dual-graphics systems consisting of a low-power integrated GPU +/// and a powerful discrete GPU, the driver picks which GPU will run an +/// SFML application. In order to inform the driver that an SFML application +/// can benefit from being run on the more powerful discrete GPU, +/// #SFML_DEFINE_DISCRETE_GPU_PREFERENCE can be placed in a source file +/// that is compiled and linked into the final application. The macro +/// should be placed outside of any scopes in the global namespace. +/// /// Usage example: /// \code /// // Declare and create a new window diff --git a/src/SFML/Main/MainWin32.cpp b/src/SFML/Main/MainWin32.cpp index c914496444..fefc1b7ce5 100644 --- a/src/SFML/Main/MainWin32.cpp +++ b/src/SFML/Main/MainWin32.cpp @@ -41,14 +41,6 @@ #include -// Inform the Nvidia/AMD driver that this SFML application could -// benefit from using the more powerful discrete GPU -extern "C" -{ -__declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001; -__declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1; -} - extern int main(int argc, char* argv[]); ////////////////////////////////////////////////////////////