169 lines
6.6 KiB
CMake

# This file is part of the FidelityFX SDK.
#
# Copyright (C) 2024 Advanced Micro Devices, Inc.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files(the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and /or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions :
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
mark_as_advanced(CMAKE_TOOLCHAIN_FILE)
message(STATUS "PULLING IN TOOLCHAIN_FILE")
if(_TOOLCHAIN_)
return()
endif()
# Set configuration options
set(CMAKE_CONFIGURATION_TYPES Debug Release RelWithDebInfo)
set(CMAKE_DEBUG_POSTFIX d)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# Get warnings for everything
if (CMAKE_COMPILER_IS_GNUCC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
endif()
if (MSVC)
# Recommended compiler switches:
# /fp:fast (Fast floating-point optimizations)
# /GR (RTTI): if not using typeid or dynamic_cast, we can disable RTTI to save binary size using /GR-
# /GS (buffer security check)
# /Gy (enable function-level linking)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /GR- /fp:fast /GS /Gy")
endif()
if (FFX_API_BACKEND STREQUAL DX12_X64 OR
FFX_API_BACKEND STREQUAL VK_X64)
set(CMAKE_RELWITHDEBINFO_POSTFIX drel)
set(CMAKE_SYSTEM_NAME WINDOWS)
set(CMAKE_SYSTEM_VERSION 10.0)
set(CMAKE_GENERATOR_PLATFORM "x64" CACHE STRING "" FORCE)
set(CMAKE_VS_PLATFORM_NAME "x64" CACHE STRING "" FORCE)
# Ensure our platform toolset is x64
set(CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE "x64" CACHE STRING "" FORCE)
elseif(FFX_API_BACKEND STREQUAL DX12_ARM64)
set(CMAKE_RELWITHDEBINFO_POSTFIX drel)
set(CMAKE_SYSTEM_NAME WINDOWS)
set(CMAKE_SYSTEM_VERSION 10.0)
set(CMAKE_GENERATOR_PLATFORM "arm64" CACHE STRING "" FORCE)
set(CMAKE_VS_PLATFORM_NAME "arm64" CACHE STRING "" FORCE)
# Ensure our platform toolset is arm64
set(CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE "arm64" CACHE STRING "" FORCE)
elseif(FFX_API_BACKEND STREQUAL DX12_ARM64EC)
set(CMAKE_RELWITHDEBINFO_POSTFIX drel)
set(CMAKE_SYSTEM_NAME WINDOWS)
set(CMAKE_SYSTEM_VERSION 10.0)
set(CMAKE_GENERATOR_PLATFORM "arm64ec" CACHE STRING "" FORCE)
set(CMAKE_VS_PLATFORM_NAME "arm64ec" CACHE STRING "" FORCE)
# Ensure our platform toolset is arm64
set(CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE "arm64ec" CACHE STRING "" FORCE)
elseif(FFX_API_BACKEND STREQUAL GDK_SCARLETT_X64)
# On GDK, RELWITHDEBINFO is Profile
set(CMAKE_RELWITHDEBINFO_POSTFIX _profile)
# Make sure GDK is installed
if(NOT DEFINED ENV{GXDKLatest})
message(FATAL_ERROR "Could not detect GameDK environment variable. Please install the latest Microsoft GDK.")
endif()
set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES XdkEditionTarget)
set(CMAKE_SYSTEM_NAME WINDOWS)
set(CMAKE_SYSTEM_VERSION 10.0)
# Parse the GDK edition to use from the environment variable
# We will always use the latest version found
file(TO_CMAKE_PATH "$ENV{GameDKLatest}" GDKLatestPath)
cmake_path(GET GDKLatestPath FILENAME XDKEDITION)
message(STATUS "Setting XdkEditionTarget to latest version found: ${XDKEDITION}")
# Set our GDK edition
set(XdkEditionTarget ${XDKEDITION} CACHE STRING "Microsoft GDK Edition")
set(CMAKE_GENERATOR_PLATFORM "Gaming.Xbox.Scarlett.x64" CACHE STRING "" FORCE)
set(CMAKE_VS_PLATFORM_NAME "Gaming.Xbox.Scarlett.x64" CACHE STRING "" FORCE)
# Ensure our platform toolset is x64
set(CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE "x64" CACHE STRING "" FORCE)
# Let the GDK MSBuild rules decide the WindowsTargetPlatformVersion
set(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION "" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_INIT "$ENV{CFLAGS} ${CMAKE_CXX_FLAGS_INIT} -D_GAMING_XBOX -D_GAMING_XBOX_SCARLETT -DWINAPI_FAMILY=WINAPI_FAMILY_GAMES -D_ATL_NO_DEFAULT_LIBS -D__WRL_NO_DEFAULT_LIB__ -D_CRT_USE_WINAPI_PARTITION_APP -D_UITHREADCTXT_SUPPORT=0 -D__WRL_CLASSIC_COM_STRICT__ /arch:AVX2 /favor:AMD64" CACHE STRING "" FORCE)
# Set platform libraries
set(CMAKE_CXX_STANDARD_LIBRARIES_INIT "xgameplatform.lib" CACHE STRING "" FORCE)
set(CMAKE_CXX_STANDARD_LIBRARIES ${CMAKE_CXX_STANDARD_LIBRARIES_INIT} CACHE STRING "" FORCE)
elseif(FFX_API_BACKEND STREQUAL GDK_XBOXONE_X64)
# On GDK, RELWITHDEBINFO is Profile
set(CMAKE_RELWITHDEBINFO_POSTFIX _profile)
# Make sure GDK is installed
if(NOT DEFINED ENV{GXDKLatest})
message(FATAL_ERROR "Could not detect GameDK environment variable. Please install the latest Microsoft GDK.")
endif()
set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES XdkEditionTarget)
set(CMAKE_SYSTEM_NAME WINDOWS)
set(CMAKE_SYSTEM_VERSION 10.0)
# Parse the GDK edition to use from the environment variable
# We will always use the latest version found
file(TO_CMAKE_PATH "$ENV{GameDKLatest}" GDKLatestPath)
cmake_path(GET GDKLatestPath FILENAME XDKEDITION)
message(STATUS "Setting XdkEditionTarget to latest version found: ${XDKEDITION}")
# Set our GDK edition
set(XdkEditionTarget ${XDKEDITION} CACHE STRING "Microsoft GDK Edition")
set(CMAKE_GENERATOR_PLATFORM "Gaming.Xbox.XboxOne.x64" CACHE STRING "" FORCE)
set(CMAKE_VS_PLATFORM_NAME "Gaming.Xbox.XboxOne.x64" CACHE STRING "" FORCE)
# Ensure our platform toolset is x64
set(CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE "x64" CACHE STRING "" FORCE)
# Let the GDK MSBuild rules decide the WindowsTargetPlatformVersion
set(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION "" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_INIT "$ENV{CFLAGS} ${CMAKE_CXX_FLAGS_INIT} -D_GAMING_XBOX -D_GAMING_XBOX_XBOX_ONE -DWINAPI_FAMILY=WINAPI_FAMILY_GAMES -D_ATL_NO_DEFAULT_LIBS -D__WRL_NO_DEFAULT_LIB__ -D_CRT_USE_WINAPI_PARTITION_APP -D_UITHREADCTXT_SUPPORT=0 -D__WRL_CLASSIC_COM_STRICT__ /arch:AVX2 /favor:AMD64" CACHE STRING "" FORCE)
# Set platform libraries
set(CMAKE_CXX_STANDARD_LIBRARIES_INIT "xgameplatform.lib" CACHE STRING "" FORCE)
set(CMAKE_CXX_STANDARD_LIBRARIES ${CMAKE_CXX_STANDARD_LIBRARIES_INIT} CACHE STRING "" FORCE)
else()
message(FATAL_ERROR "Backend toolchain \"${FFX_API_BACKEND}\" not yet implemented!")
endif()
set(_TOOLCHAIN_ ON)