Files
2026-06-14 19:09:18 +01:00

429 lines
16 KiB
CMake

# Copyright 2020 Andreas Atteneder
# SPDX-License-Identifier: Apache-2.0
# Find Vulkan package
if(APPLE)
# N.B. FindVulkan needs the VULKAN_SDK environment variable set to find
# the iOS frameworks and to set Vulkan_SDK_Base, used later in this
# file. Therefore ensure to make that env. var. available to CMake and
# Xcode. Special care is needed to ensure it is available to the CMake
# and Xcode GUIs.
# set(CMAKE_FIND_DEBUG_MODE TRUE)
find_package( Vulkan REQUIRED COMPONENTS MoltenVK )
# set(CMAKE_FIND_DEBUG_MODE FALSE)
# Derive some other useful variables from those provided by find_package
if(APPLE_LOCKED_OS)
set( Vulkan_SHARE_VULKAN ${Vulkan_SDK_Base}/${CMAKE_SYSTEM_NAME}/share/vulkan )
else()
# Vulkan_LIBRARIES points to "libvulkan.dylib".
# Find the name of the actual dylib which includes the version no.
# readlink -f requires macOS >= 12.3!
execute_process(COMMAND readlink -f ${Vulkan_LIBRARIES}
OUTPUT_VARIABLE Vulkan_LIBRARY_REAL_PATH_NAME
OUTPUT_STRIP_TRAILING_WHITESPACE
)
cmake_path(GET
Vulkan_LIBRARY_REAL_PATH_NAME
FILENAME
Vulkan_LIBRARY_REAL_FILE_NAME
)
# Find the name that includes only the major version number.
execute_process(COMMAND readlink ${Vulkan_LIBRARIES}
OUTPUT_VARIABLE Vulkan_LIBRARY_SONAME_FILE_NAME
OUTPUT_STRIP_TRAILING_WHITESPACE
)
set( Vulkan_SHARE_VULKAN appfwSDL/VulkanAppSDL/mac/vulkan )
endif()
else()
find_package(Vulkan REQUIRED)
endif()
#cmake_print_variables(
# Vulkan_LIBRARIES
# Vulkan_LIBRARY_REAL_PATH_NAME
# Vulkan_LIBRARY_REAL_FILE_NAME
# Vulkan_LIBRARY_SONAME_FILE_NAME
#)
include(compile_shader.cmake)
set(SHADER_SOURCES "")
compile_shader(shader_textoverlay textoverlay appfwSDL/VulkanAppSDL/shaders shaders )
compile_shader(shader_cube cube vkloadtests/shaders/cube shaders )
compile_shader(shader_cubemap_reflect reflect vkloadtests/shaders/cubemap shaders )
compile_shader(shader_cubemap_skybox skybox vkloadtests/shaders/cubemap shaders )
compile_shader_list(shader_texture vkloadtests/shaders/texture shaders texture.vert texture1d.frag texture2d.frag)
compile_shader(shader_texture3d instancing3d vkloadtests/shaders/texture3d shaders )
compile_shader(shader_texturearray instancing vkloadtests/shaders/texturearray shaders )
compile_shader(shader_texturemipmap instancinglod vkloadtests/shaders/texturemipmap shaders )
add_custom_target(
spirv_shaders
DEPENDS
shader_textoverlay
shader_cube
shader_cubemap_reflect
shader_cubemap_skybox
shader_texture
shader_texture3d
shader_texturearray
shader_texturemipmap
)
set( VK_TEST_IMAGES
etc1s_Iron_Bars_001_normal.ktx2
uastc_Iron_Bars_001_normal.ktx2
ktx_document_uastc_rdo4_zstd5.ktx2
color_grid_uastc_zstd.ktx2
color_grid_zstd.ktx2
color_grid_uastc.ktx2
color_grid_basis.ktx2
kodim17_basis.ktx2
pattern_02_bc2.ktx2
ktx_document_basis.ktx2
rgba-mipmap-reference-basis.ktx2
3dtex_7_reference_u.ktx2
arraytex_7_mipmap_reference_u.ktx2
cubemap_goldengate_uastc_rdo4_zstd5_rd.ktx2
cubemap_yokohama_basis_rd.ktx2
skybox_zstd.ktx2
orient-down-metadata.ktx
orient-up-metadata.ktx
rgba-reference.ktx
etc2-rgb.ktx
etc2-rgba8.ktx
etc2-sRGB.ktx
etc2-sRGBa8.ktx
pattern_02_bc2.ktx
rgb-amg-reference.ktx
metalplate-amg-rgba8.ktx
not4_rgb888_srgb.ktx
texturearray_bc3_unorm.ktx
texturearray_astc_8x8_unorm.ktx
texturearray_etc2_unorm.ktx
)
list( TRANSFORM VK_TEST_IMAGES
PREPEND "${PROJECT_SOURCE_DIR}/tests/testimages/"
)
set( KTX_RESOURCES ${LOAD_TEST_COMMON_RESOURCE_FILES} ${VK_TEST_IMAGES} )
if(APPLE)
# Adding this directory to KTX_RESOURCES and ultimately vkloadtests's
# RESOURCE property causes the install command (later in this file) to
# raise an error at configuration time: "RESOURCE given directory". Use
# this instead to cause the files to be added to Resources in the bundle.
set_source_files_properties( ${Vulkan_SHARE_VULKAN}
PROPERTIES
MACOSX_PACKAGE_LOCATION Resources
)
endif()
add_executable( vkloadtests
${EXE_FLAG}
appfwSDL/VulkanAppSDL/VulkanAppSDL.cpp
appfwSDL/VulkanAppSDL/VulkanAppSDL.h
appfwSDL/VulkanAppSDL/vulkancheckres.h
appfwSDL/VulkanAppSDL/VulkanContext.cpp
appfwSDL/VulkanAppSDL/VulkanContext.h
appfwSDL/VulkanAppSDL/vulkandebug.cpp
appfwSDL/VulkanAppSDL/vulkandebug.h
appfwSDL/VulkanAppSDL/VulkanSwapchain.cpp
appfwSDL/VulkanAppSDL/VulkanSwapchain.h
appfwSDL/VulkanAppSDL/vulkantextoverlay.hpp
appfwSDL/VulkanAppSDL/vulkantools.cpp
appfwSDL/VulkanAppSDL/vulkantools.h
common/disable_glm_warnings.h
common/reenable_warnings.h
vkloadtests/InstancedSampleBase.cpp
vkloadtests/InstancedSampleBase.h
vkloadtests/Texture.cpp
vkloadtests/Texture.h
vkloadtests/Texture3d.cpp
vkloadtests/Texture3d.h
vkloadtests/TextureArray.cpp
vkloadtests/TextureArray.h
vkloadtests/TextureCubemap.cpp
vkloadtests/TextureCubemap.h
vkloadtests/TexturedCube.cpp
vkloadtests/TexturedCube.h
vkloadtests/TextureMipmap.cpp
vkloadtests/TextureMipmap.h
vkloadtests/utils/VulkanMeshLoader.hpp
vkloadtests/utils/VulkanTextureTranscoder.hpp
vkloadtests/VulkanLoadTests.cpp
vkloadtests/VulkanLoadTests.h
vkloadtests/VulkanLoadTestSample.cpp
vkloadtests/VulkanLoadTestSample.h
${LOAD_TEST_COMMON_RESOURCE_FILES}
${Vulkan_SHARE_VULKAN}
${SHADER_SOURCES}
${VK_TEST_IMAGES}
vkloadtests.cmake
)
set_code_sign(vkloadtests)
# If VulkanAppSDL is ever made into its own target change the target here.
target_compile_features(vkloadtests
PRIVATE
cxx_std_14
)
target_include_directories(vkloadtests
PRIVATE
SDL3::Headers
$<TARGET_PROPERTY:appfwSDL,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:ktx,INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:objUtil,INTERFACE_INCLUDE_DIRECTORIES>
appfwSDL/VulkanAppSDL
vkloadtests
vkloadtests/utils
)
target_include_directories(vkloadtests
SYSTEM PRIVATE
${PROJECT_SOURCE_DIR}/other_include
)
target_link_libraries(vkloadtests
ktx
objUtil
appfwSDL
)
set_target_properties(vkloadtests PROPERTIES
CXX_VISIBILITY_PRESET ${STATIC_APP_LIB_SYMBOL_VISIBILITY}
)
target_link_libraries(
vkloadtests
Vulkan::Vulkan
)
if(APPLE)
if(IOS)
set( INFO_PLIST_IN "${PROJECT_SOURCE_DIR}/tests/loadtests/vkloadtests/resources/ios/Info.plist.in" )
set( icon_launch_assets
${PROJECT_SOURCE_DIR}/icons/ios/CommonIcons.xcassets
vkloadtests/resources/ios/LaunchImages.xcassets
vkloadtests/resources/ios/LaunchScreen.storyboard
)
target_sources( vkloadtests
PRIVATE
${icon_launch_assets}
)
# Add to resources so they'll be copied to the bundle.
list( APPEND KTX_RESOURCES ${icon_launch_assets} )
target_link_libraries(
vkloadtests
${AudioToolbox_LIBRARY}
${AVFoundation_LIBRARY}
${CoreAudio_LIBRARY}
${CoreBluetooth_LIBRARY}
${CoreGraphics_LIBRARY}
${CoreMotion_LIBRARY}
${CoreHaptics_LIBRARY}
${Foundation_LIBRARY}
${GameController_LIBRARY}
${IOSurface_LIBRARY}
${Metal_LIBRARY}
${MOLTENVK_FRAMEWORK}
${OpenGLES_LIBRARY}
${QuartzCore_LIBRARY}
${UIKit_LIBRARY}
)
else()
set( INFO_PLIST_IN "${PROJECT_SOURCE_DIR}/tests/loadtests/vkloadtests/resources/mac/Info.plist.in" )
endif()
elseif(WIN32)
ensure_runtime_dependencies_windows(vkloadtests)
elseif(LINUX)
target_sources(
vkloadtests
PRIVATE
vkloadtests/resources/linux/vkloadtests.desktop
)
endif()
target_link_libraries( vkloadtests ${LOAD_TEST_COMMON_LIBS} )
target_compile_definitions(
vkloadtests
PRIVATE
$<TARGET_PROPERTY:ktx,INTERFACE_COMPILE_DEFINITIONS>
$<$<PLATFORM_ID:Windows>:NOMINMAX>
)
set_target_properties( vkloadtests PROPERTIES RESOURCE "${KTX_RESOURCES};${SHADER_SOURCES}" )
if(APPLE)
set( product_name vkloadtests )
set( bundle_identifier org.khronos.ktx.${product_name} )
# This property must be set to avoid an Xcode warning.
set_target_properties( vkloadtests PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER ${bundle_identifier} )
# The file identified by MACOSX_BUNDLE_INFO_PLIST is subject to an
# implicit configure_file() step by CMake. Since this target has a custom
# Info.plist this is not strictly necessary but the writer does not know
# how to prevent it. Furthermore the BUNDLE_NAME, EXECUTABLE_NAME and
# GUI_IDENTIFIER properties could all be set from Xcode build settings
# but using those in the custom Info.plist would not be portable to other
# generators. Since configure_file() is happening use the standard
# property names for consistency with the standard Info.plist template.
set_target_properties( vkloadtests PROPERTIES
MACOSX_BUNDLE TRUE
MACOSX_BUNDLE_BUNDLE_NAME ${product_name}
MACOSX_BUNDLE_EXECUTABLE_NAME ${product_name}
MACOSX_BUNDLE_COPYRIGHT "© 2024 Khronos Group, Inc."
MACOSX_BUNDLE_GUI_IDENTIFIER ${bundle_identifier}
MACOSX_BUNDLE_INFO_PLIST ${INFO_PLIST_IN}
MACOSX_BUNDLE_INFO_STRING "View KTX textures; display via Vulkan."
MACOSX_BUNDLE_ICON_FILE ${KTX_APP_ICON}
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION}
# Because libassimp is built with bitcode disabled. It's not important
# unless submitting to the App Store and currently bitcode is optional.
XCODE_ATTRIBUTE_ENABLE_BITCODE NO
XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH YES
XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME ${KTX_APP_ICON_BASENAME}
XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2" # iPhone and iPad
# This is to silence a "not stripping because it is signed" warning
# from Xcode during copying by EMBED_FRAMEWORKS. It has no effect
# on the code because (a) all the Vulkan SDK dylibs and frameworks
# are Release config so have no symbols and (b) we need to keep the
# symbols in the Debug config of libktx.
XCODE_ATTRIBUTE_COPY_PHASE_STRIP NO
)
unset(product_name)
unset(bundle_identifier)
# The generated project code for building an Apple bundle automatically
# copies the executable and all files with the RESOURCE property to the
# bundle adjusting for the difference in bundle layout between iOS &
# macOS.
if(IOS)
set_target_properties( vkloadtests PROPERTIES
XCODE_EMBED_FRAMEWORKS "${Vulkan_MoltenVK_LIBRARY};${Vulkan_LIBRARIES};${Vulkan_Layer_VALIDATION}"
XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY "YES"
XCODE_EMBED_FRAMEWORKS_REMOVE_HEADERS_ON_COPY "YES"
# Set RPATH to find frameworks
INSTALL_RPATH @executable_path/Frameworks
)
else()
# Why is XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY not set here?
# Excellent question. The Vulkan, MoltenVk and VkLayer dylibs are
# all signed by LunarG, the ktx dylib by us so no need. On the other
# hand the Vulkan and MoltenVK frameworks in the iOS SDK are not
# signed. hence it is set there.
set_target_properties( vkloadtests PROPERTIES
XCODE_EMBED_FRAMEWORKS "${Vulkan_LIBRARY_REAL_PATH_NAME};${Vulkan_MoltenVK_LIBRARY};${Vulkan_Layer_VALIDATION}"
# Set RPATH to find frameworks and dylibs
INSTALL_RPATH @executable_path/../Frameworks
)
if(BUILD_SHARED_LIBS)
# XCODE_EMBED_FRAMEWORKS does not appear to support generator
# expressions hence this instead of a genex in the above.
set_property( TARGET vkloadtests
APPEND PROPERTY XCODE_EMBED_FRAMEWORKS
ktx
)
add_custom_command( TARGET vkloadtests POST_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink $<TARGET_FILE_NAME:ktx> "$<TARGET_BUNDLE_CONTENT_DIR:vkloadtests>/Frameworks/$<TARGET_SONAME_FILE_NAME:ktx>"
COMMENT "Create symlink for KTX library (ld name to real name"
)
endif()
add_custom_command( TARGET vkloadtests POST_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink "${Vulkan_LIBRARY_REAL_FILE_NAME}" "$<TARGET_BUNDLE_CONTENT_DIR:vkloadtests>/Frameworks/${Vulkan_LIBRARY_SONAME_FILE_NAME}"
COMMENT "Create symlink for Vulkan library (ld name to real name)"
)
# Re. SDL3 & assimp: no copy required.: vcpkg libs are static or else
# vcpkg arranges copy. Brew libs cannot be bundled.
# Specify destination for cmake --install.
install(TARGETS vkloadtests
BUNDLE
DESTINATION ${CMAKE_INSTALL_PREFIX}/Applications
COMPONENT VkLoadTestApp
)
## Uncomment for Bundle analysis
# install( CODE "
# include(BundleUtilities)
# verify_app($<TARGET_BUNDLE_DIR:vkloadtests>)
# #fixup_bundle($<TARGET_BUNDLE_DIR:vkloadtests> \"\" \"\")"
# )
endif()
else()
# This is for other platforms.
# This copies the resources next to the executable for ease
# of use during debugging and testing.
add_custom_command( TARGET vkloadtests POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory
$<TARGET_FILE_DIR:vkloadtests>/../resources
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${KTX_RESOURCES} ${SHADER_SOURCES}
$<TARGET_FILE_DIR:vkloadtests>/../resources
)
# To keep the resources (test images and models) close to the
# executable and to be compliant with the Filesystem Hierarchy
# Standard https://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html
# we have chosen to install the apps and data in /opt/<target>.
# Each target has a `bin` directory with the executable and a
# `resources` directory with the resources. We install a symbolic
# link to the executable in ${CMAKE_INSTALL_BINDIR}, usually
# /usr/local/bin, instead of adding /opt/<target>/bin to $PATH.
#
# TODO: Figure out how to handle libktx so installs of tools only,
# tools + loadtests and loadtests only are supported. Only put
# library in /usr/local/lib? Duplicate it in /opt/<provider>/lib
# from where it is shared by gl3loadtests and vkloadtests? Only
# put it in /opt/<provider>/lib with link from
# ${CMAKE_INSTALL_LIBDIR}? NOTE: if we put lib in /opt/<provider>
# then consider putting the executables in /opt/provider/<target>.
# TODO: Before adding this target to the release packages, ensure
# this RPATH will work for alternate install root.
set_target_properties( vkloadtests PROPERTIES
INSTALL_RPATH "\$ORIGIN;${CMAKE_INSTALL_FULL_LIBDIR}"
)
######### IMPORTANT ######
# When installing via `cmake --install` ALSO install the
# library component. There seems no way to make a dependency.
##########################
# set( destroot "${LOAD_TEST_DESTROOT}/$<TARGET_FILE_NAME:vkloadtests>")
# # NOTE: WHEN RUNNING MANUAL INSTALLS INSTALL library COMPONENT TOO.
# install(TARGETS vkloadtests
# RUNTIME
# DESTINATION ${destroot}/bin
# COMPONENT VkLoadTestApp
# RESOURCE
# DESTINATION ${destroot}/resources
# COMPONENT VkLoadTestApp
# )
# if(LINUX)
# # Add a link from the regular bin directory to put command
# # on PATH.
# install(CODE "
# EXECUTE_PROCESS(COMMAND ln -s ${destroot}/bin/$<TARGET_FILE_NAME:vkloadtests> ${CMAKE_INSTALL_FULL_BINDIR}
# )"
# COMPONENT VkLoadTestApp
# )
# install(FILES
# vkloadtests/resources/linux/vkloadtests.desktop
# DESTINATION /usr/share/applications
# COMPONENT VkLoadTestApp
# )
# endif()
endif()
add_dependencies(
vkloadtests
spirv_shaders
)