diff --git a/CMakeLists.txt b/CMakeLists.txt index aca57ad6..e97f064c 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 00000000..cde4f9f1 --- /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/Window.hpp b/include/SFML/Window/Window.hpp index c8a56176..7ff81e29 100644 --- a/include/SFML/Window/Window.hpp +++ b/include/SFML/Window/Window.hpp @@ -581,6 +581,14 @@ private: /// 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 c9144964..fefc1b7c 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[]); ////////////////////////////////////////////////////////////