177 lines
7.9 KiB
CMake
177 lines
7.9 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.
|
|
|
|
# Enables multithreading compilation
|
|
add_compile_options(/MP)
|
|
|
|
# General language options (require language standards specified)
|
|
set(CMAKE_CXX_STANDARD 11)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
|
|
# Get warnings for everything
|
|
if (CMAKE_COMPILER_IS_GNUCC)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
|
|
endif()
|
|
if (MSVC)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
|
|
endif()
|
|
|
|
# Define various roots
|
|
set(SAMPLE_ROOT ${CMAKE_HOME_DIRECTORY}/samples)
|
|
set(SDK_ROOT ${CMAKE_HOME_DIRECTORY}/sdk)
|
|
set(API_ROOT ${CMAKE_HOME_DIRECTORY}/ffx-api)
|
|
set(PREBUILT_SIGNED_DLL_ROOT ${CMAKE_HOME_DIRECTORY}/PrebuiltSignedDLL)
|
|
set(FRAMEWORK_ROOT ${CMAKE_HOME_DIRECTORY}/framework)
|
|
set(BIN_OUTPUT ${CMAKE_HOME_DIRECTORY}/bin)
|
|
set(CAULDRON_ROOT ${FRAMEWORK_ROOT}/cauldron)
|
|
set(RENDERMODULE_ROOT ${FRAMEWORK_ROOT}/rendermodules)
|
|
set(FFX_API_CAULDRON_ROOT ${SAMPLE_ROOT}/ffx_cauldron)
|
|
set(SHADER_OUTPUT ${BIN_OUTPUT}/shaders)
|
|
set(CONFIG_OUTPUT ${BIN_OUTPUT}/configs)
|
|
set(RENDERMODULE_MEDIA_OUTPUT ${BIN_OUTPUT}/media/rendermodule)
|
|
set(SUPPORT_RUNTIME_SHADER_RECOMPILE 0)
|
|
|
|
# Define common sdk variables
|
|
set(FFX_SC_EXECUTABLE ${SDK_ROOT}/tools/binary_store/FidelityFX_SC.exe)
|
|
set(FFX_INCLUDE_PATH ${SDK_ROOT}/include)
|
|
set(FFX_LIB_PATH ${SDK_ROOT}/libs)
|
|
set(FFX_BIN_PATH ${SDK_ROOT}/bin/ffx_sdk)
|
|
set(FFX_SHARED_PATH ${SDK_ROOT}/src/shared)
|
|
set(FFX_HOST_PATH ${SDK_ROOT}/include/FidelityFX/host)
|
|
set(FFX_GPU_PATH ${SDK_ROOT}/include/FidelityFX/gpu)
|
|
set(FFX_COMPONENTS_PATH ${SDK_ROOT}/src/components)
|
|
set(FFX_HOST_BACKENDS_PATH ${FFX_HOST_PATH}/backends)
|
|
set(FFX_SRC_BACKENDS_PATH ${SDK_ROOT}/src/backends)
|
|
|
|
#Setup pathing to FFX_API objects
|
|
if (FFX_DEV_API)
|
|
set(FFX_API_ROOTPATH ${API_ROOT}/bin)
|
|
set(FFX_API_PATHNAME_DX12D ${FFX_API_ROOTPATH}/amd_fidelityfx_dx12d)
|
|
set(FFX_API_PATHNAME_DX12DREL ${FFX_API_ROOTPATH}/amd_fidelityfx_dx12drel)
|
|
set(FFX_API_PATHNAME_DX12 ${FFX_API_ROOTPATH}/amd_fidelityfx_dx12)
|
|
set(FFX_API_PATHNAME_VKD ${FFX_API_ROOTPATH}/amd_fidelityfx_vkd)
|
|
set(FFX_API_PATHNAME_VKDREL ${FFX_API_ROOTPATH}/amd_fidelityfx_vkdrel)
|
|
set(FFX_API_PATHNAME_VK ${FFX_API_ROOTPATH}/amd_fidelityfx_vk)
|
|
else()
|
|
set(FFX_API_ROOTPATH ${PREBUILT_SIGNED_DLL_ROOT})
|
|
set(FFX_API_PATHNAME_DX12D ${FFX_API_ROOTPATH}/amd_fidelityfx_dx12)
|
|
set(FFX_API_PATHNAME_DX12DREL ${FFX_API_ROOTPATH}/amd_fidelityfx_dx12)
|
|
set(FFX_API_PATHNAME_DX12 ${FFX_API_ROOTPATH}/amd_fidelityfx_dx12)
|
|
set(FFX_API_PATHNAME_VKD ${FFX_API_ROOTPATH}/amd_fidelityfx_vk)
|
|
set(FFX_API_PATHNAME_VKDREL ${FFX_API_ROOTPATH}/amd_fidelityfx_vk)
|
|
set(FFX_API_PATHNAME_VK ${FFX_API_ROOTPATH}/amd_fidelityfx_vk)
|
|
endif()
|
|
|
|
# Set top level includes (all projects will need these to some extent)
|
|
include_directories(${CAULDRON_ROOT}/framework/inc)
|
|
include_directories(${CAULDRON_ROOT}/framework/libs)
|
|
include_directories(${CAULDRON_ROOT}/framework/src)
|
|
include_directories(${CAULDRON_ROOT}/framework/src/render/rendermodules)
|
|
include_directories(${RENDERMODULE_ROOT})
|
|
include_directories(${SAMPLE_ROOT})
|
|
include_directories(${SDK_ROOT}/include)
|
|
|
|
|
|
if (CMAKE_GENERATOR_PLATFORM STREQUAL x64 OR
|
|
CMAKE_GENERATOR_PLATFORM STREQUAL ARM64 OR
|
|
CMAKE_GENERATOR_PLATFORM STREQUAL ARM64EC)
|
|
#Set so taken by default when creating custom configs
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
|
|
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MD")
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
|
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<OR:$<CONFIG:DebugDX12>,$<CONFIG:DebugVK>>:Debug>DLL")
|
|
endif()
|
|
|
|
# ------------------------------------------
|
|
# Cauldron helper function definitions
|
|
# ------------------------------------------
|
|
|
|
# Creates a configuration from a base config (for flag inclusion)
|
|
# In the future, we will redefine custom compile/linker options
|
|
function(createConfig CONFIGNAME CONFIGSTRING BASECONFIG)
|
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
|
set(CMAKE_CXX_FLAGS_${BASECONFIG}${CONFIGNAME} "${CMAKE_CXX_FLAGS_${BASECONFIG}}"
|
|
CACHE STRING "Flags used by the C++ compiler during ${CONFIGSTRING} builds.")
|
|
set(CMAKE_C_FLAGS_${BASECONFIG}${CONFIGNAME} "${CMAKE_C_FLAGS_${BASECONFIG}}"
|
|
CACHE STRING "Flags used by the C compiler during ${CONFIGSTRING} builds.")
|
|
set(CMAKE_EXE_LINKER_FLAGS_${BASECONFIG}${CONFIGNAME} "${CMAKE_EXE_LINKER_FLAGS_${BASECONFIG}}"
|
|
CACHE STRING "Flags used for linking binaries during ${CONFIGSTRING} builds.")
|
|
set(CMAKE_SHARED_LINKER_FLAGS_${BASECONFIG}${CONFIGNAME} "${CMAKE_SHARED_LINKER_FLAGS_${BASECONFIG}}"
|
|
CACHE STRING "Flags used by the shared libraries linker during ${CONFIGSTRING} builds.")
|
|
|
|
MARK_AS_ADVANCED(CMAKE_CXX_FLAGS_${BASECONFIG}${CONFIGNAME}
|
|
CMAKE_C_FLAGS_${BASECONFIG}${CONFIGNAME}
|
|
CMAKE_EXE_LINKER_FLAGS_${BASECONFIG}${CONFIGNAME}
|
|
CMAKE_SHARED_LINKER_FLAGS_${BASECONFIG}${CONFIGNAME} )
|
|
endfunction()
|
|
|
|
# Copies a set of files to a directory (only if they already don't exist or are different)
|
|
# Usage example:
|
|
# set(media_src ${CMAKE_CURRENT_SOURCE_DIR}/../../media/brdfLut.dds )
|
|
# copyCommand("${media_src}" ${CMAKE_HOME_DIRECTORY}/bin)
|
|
function(copyCommand list dest)
|
|
foreach(fullFileName ${list})
|
|
get_filename_component(file ${fullFileName} NAME)
|
|
message("Generating custom command for ${fullFileName}")
|
|
add_custom_command(
|
|
OUTPUT ${dest}/${file}
|
|
PRE_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${dest}
|
|
COMMAND ${CMAKE_COMMAND} -E copy ${fullFileName} ${dest}
|
|
MAIN_DEPENDENCY ${fullFileName}
|
|
COMMENT "Updating ${file} into ${dest}"
|
|
)
|
|
endforeach()
|
|
endfunction()
|
|
|
|
#
|
|
# Same as copyCommand() but you can give a target name
|
|
# This custom target will depend on all those copied files
|
|
# Then the target can be properly set as a dependency of other executable or library
|
|
# Usage example:
|
|
# add_library(my_lib ...)
|
|
# set(media_src ${CMAKE_CURRENT_SOURCE_DIR}/../../media/brdfLut.dds )
|
|
# copyTargetCommand("${media_src}" ${CMAKE_HOME_DIRECTORY}/bin copied_media_src)
|
|
# add_dependencies(my_lib copied_media_src)
|
|
#
|
|
function(copyTargetCommand list dest returned_target_name)
|
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
|
|
|
foreach(fullFileName ${list})
|
|
get_filename_component(file ${fullFileName} NAME)
|
|
message("Generating custom command for ${fullFileName}")
|
|
add_custom_command(
|
|
OUTPUT ${dest}/${file}
|
|
PRE_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${dest}
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${fullFileName} ${dest}
|
|
MAIN_DEPENDENCY ${fullFileName}
|
|
COMMENT "Updating ${file} into ${dest}"
|
|
)
|
|
list(APPEND dest_list ${dest}/${file})
|
|
endforeach()
|
|
|
|
add_custom_target(${returned_target_name} DEPENDS "${dest_list}")
|
|
set_target_properties(${returned_target_name} PROPERTIES FOLDER CopyTargets)
|
|
endfunction()
|