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

450 lines
16 KiB
CMake

# Copyright 2020 Andreas Atteneder
# SPDX-License-Identifier: Apache-2.0
set(OPENGL_ES_EMULATOR "" CACHE PATH "Path to OpenGL ES emulation libraries")
if(NOT APPLE_LOCKED_OS)
find_package(OpenGL REQUIRED)
endif()
if(WIN32)
find_package(GLEW REQUIRED)
endif()
function( create_gl_target target version sources common_resources test_images
KTX_GL_CONTEXT_PROFILE
KTX_GL_CONTEXT_MAJOR_VERSION KTX_GL_CONTEXT_MINOR_VERSION
EMULATE_GLES)
set( resources ${common_resources};${test_images} )
add_executable( ${target}
${EXE_FLAG}
glloadtests.cmake
${sources}
${resources}
)
set_code_sign(${target})
# Nota Bene.
#
# 1. With the Visual Studio generator, at least, The SDL and GLEW
# includes coming from GLAppSDL are being converted to system
# includes. To see them in VS, view the whole command line in
# the compile section of the project properties and look at the
# Additional Options pane at the bottom.
# 2. GL_APP_SDL's INTERFACE_INCLUDE_DIRECTORIES includes the SYSTEM
# include from appfwSDL.
#
# I do not understand the reasons for either of these.
target_include_directories(
${target}
PRIVATE
$<TARGET_PROPERTY:GLAppSDL,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:ktx,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:objUtil,INTERFACE_INCLUDE_DIRECTORIES>
)
set_target_properties(${target} PROPERTIES
CXX_VISIBILITY_PRESET ${STATIC_APP_LIB_SYMBOL_VISIBILITY}
)
target_link_libraries(
${target}
objUtil
GLAppSDL
appfwSDL
ktx
)
if(NOT EMSCRIPTEN AND NOT EMULATE_GLES)
target_link_libraries(
${target}
${OPENGL_LIBRARIES}
)
endif()
if(APPLE)
if(IOS)
# This is location where CMake puts the configured Info.plist.
# I have not found a CMake variable for this.
set( launch_screen ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${target}.dir/LaunchScreen.storyboard )
configure_file( glloadtests/resources/ios/LaunchScreen.storyboard.in
${launch_screen}
)
set( INFO_PLIST_IN "${PROJECT_SOURCE_DIR}/tests/loadtests/glloadtests/resources/ios/Info.plist.in" )
set( icon_launch_assets
${PROJECT_SOURCE_DIR}/icons/ios/CommonIcons.xcassets
glloadtests/resources/ios/LaunchImages.xcassets
${launch_screen}
)
target_sources( ${target}
PRIVATE
${PROJECT_SOURCE_DIR}/icons/ios/CommonIcons.xcassets
glloadtests/resources/ios/LaunchImages.xcassets
glloadtests/resources/ios/LaunchScreen.storyboard.in
)
# Add to resources so they'll be copied to the bundle.
list( APPEND resources ${icon_launch_assets} )
target_link_libraries(
${target}
${AudioToolbox_LIBRARY}
${AVFoundation_LIBRARY}
${CoreAudio_LIBRARY}
${CoreBluetooth_LIBRARY}
${CoreGraphics_LIBRARY}
${CoreMotion_LIBRARY}
${CoreHaptics_LIBRARY}
${Foundation_LIBRARY}
${GameController_LIBRARY}
${Metal_LIBRARY}
${OpenGLES_LIBRARY}
${QuartzCore_LIBRARY}
${UIKit_LIBRARY}
)
else()
set( INFO_PLIST_IN "${PROJECT_SOURCE_DIR}/tests/loadtests/glloadtests/resources/mac/Info.plist.in" )
endif()
elseif(EMSCRIPTEN)
# Beware of de-duplication in list expansion for commands and options.
# SHELL: prevents it but if they are separate items in the list they
# be de-duplicated.
list( TRANSFORM test_images REPLACE
"(${PROJECT_SOURCE_DIR}/tests/testimages/([a-zA-Z0-9_].*$))"
"SHELL:--preload-file \\1@\\2"
OUTPUT_VARIABLE preloads
)
target_link_options(
${target}
PRIVATE
"SHELL:--source-map-base ./"
${preloads}
"SHELL:--exclude-file '${PROJECT_SOURCE_DIR}/tests/testimages/cubemap*'"
"SHELL:--use-port=sdl3"
"SHELL:-s ALLOW_MEMORY_GROWTH=1"
"SHELL:-s DISABLE_EXCEPTION_CATCHING=0"
"SHELL:-s USE_WEBGL2=1"
)
elseif(WIN32)
target_sources(
${target}
PRIVATE
glloadtests/resources/win/glloadtests.rc
glloadtests/resources/win/resource.h
)
if(EMULATE_GLES)
if (KTX_GL_CONTEXT_MAJOR_VERSION EQUAL 1)
target_link_libraries(
${target}
"${OPENGL_ES_EMULATOR}/libGLES_CM.lib"
"${OPENGL_ES_EMULATOR}/libEGL.lib"
)
else()
target_link_libraries(
${target}
"${OPENGL_ES_EMULATOR}/libGLESv2.lib"
"${OPENGL_ES_EMULATOR}/libEGL.lib"
)
endif()
else()
target_link_libraries(
${target}
${GLEW_LIBRARIES}
)
endif()
ensure_runtime_dependencies_windows(${target})
elseif(LINUX)
# The output file is configured at CMake config time.
configure_file(glloadtests/resources/linux/glloadtests.desktop.in
${CMAKE_CURRENT_BINARY_DIR}/${target}.desktop
)
target_sources(
${target}
PRIVATE
# Put the input file in sources as that is what must be edited.
glloadtests/resources/linux/glloadtests.desktop.in
#${CMAKE_CURRENT_BINARY_DIR}/${target}.desktop
)
endif()
target_link_libraries( ${target} ${LOAD_TEST_COMMON_LIBS} )
if(NOT EMULATE_GLES OR KTX_GL_CONTEXT_MAJOR_VERSION GREATER 1)
target_compile_definitions(
${target}
PRIVATE
$<TARGET_PROPERTY:ktx,INTERFACE_COMPILE_DEFINITIONS>
GL_CONTEXT_PROFILE=${KTX_GL_CONTEXT_PROFILE}
GL_CONTEXT_MAJOR_VERSION=${KTX_GL_CONTEXT_MAJOR_VERSION}
GL_CONTEXT_MINOR_VERSION=${KTX_GL_CONTEXT_MINOR_VERSION}
$<$<PLATFORM_ID:Windows>:NOMINMAX>
)
else()
target_compile_definitions(
${target}
PRIVATE
$<TARGET_PROPERTY:ktx,INTERFACE_COMPILE_DEFINITIONS>
$<$<PLATFORM_ID:Windows>:NOMINMAX>
)
endif()
set_target_properties( ${target} PROPERTIES RESOURCE "${resources}" )
if(APPLE)
set(product_name "${target}")
set( bundle_identifier org.khronos.ktx.${product_name} )
# This property must be set to avoid an Xcode warning.
set_target_properties(${target} PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "org.khronos.ktx.${product_name}")
# See important comment about MACOSX_BUNDLE_INFO_PLIST and these
# properties in ./vkloadtests.cmake.
set_target_properties( ${target} PROPERTIES
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 OpenGL."
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
)
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(NOT IOS)
set_target_properties( ${target} PROPERTIES
INSTALL_RPATH "@executable_path/../Frameworks"
)
if(BUILD_SHARED_LIBS)
add_custom_command( TARGET ${target} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:ktx> "$<TARGET_BUNDLE_CONTENT_DIR:${target}>/Frameworks/$<TARGET_FILE_NAME:ktx>"
COMMAND ${CMAKE_COMMAND} -E create_symlink $<TARGET_FILE_NAME:ktx> "$<TARGET_BUNDLE_CONTENT_DIR:${target}>/Frameworks/$<TARGET_SONAME_FILE_NAME:ktx>"
COMMENT "Copy KTX library to build destination"
)
endif()
# 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 ${target}
BUNDLE
DESTINATION /Applications
COMPONENT GlLoadTestApps
)
endif()
else()
if(EMSCRIPTEN)
set_target_properties(${target} PROPERTIES SUFFIX ".html")
endif()
# This copies the resources next to the executable for ease
# of use during debugging and testing.
add_custom_command( TARGET ${target} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory
$<TARGET_FILE_DIR:${target}>/../resources
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${resources}
$<TARGET_FILE_DIR:${target}>/../resources
)
# See important comment and TODO:s starting at line 365
# in ./vkloadtests.cmake regarding installation of these
# targets. Search for "keep the resources".
set_target_properties( ${target} 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:${target}>")
# NOTE: WHEN RUNNING MANUAL INSTALLS INSTALL library COMPONENT TOO.
# install(TARGETS ${target}
# RUNTIME
# DESTINATION ${destroot}/bin
# COMPONENT GlLoadTestApps
# LIBRARY
# DESTINATION ${CMAKE_INSTALL_LIBDIR}
# COMPONENT GlLoadTestApps
# RESOURCE
# DESTINATION ${destroot}/resources
# COMPONENT GlLoadTestApps
# )
# install(TARGETS ktx
# RUNTIME
# DESTINATION ${destroot}/bin
# COMPONENT GlLoadTestApps
# LIBRARY
# DESTINATION ${destroot}/lib
# COMPONENT GlLoadTestApps
# )
# 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:${target}> ${CMAKE_INSTALL_FULL_BINDIR}
# )"
# COMPONENT GlLoadTestApps
# )
# install(FILES
# ${CMAKE_CURRENT_BINARY_DIR}/${target}.desktop
# DESTINATION /usr/share/applications
# COMPONENT GlLoadTestApps
# )
# endif(LINUX)
endif()
endfunction( create_gl_target target )
set( ES1_TEST_IMAGES
no-npot.ktx
hi_mark.ktx
luminance-reference-metadata.ktx
orient-up-metadata.ktx
orient-down-metadata.ktx
etc1.ktx
etc2-rgb.ktx
etc2-rgba1.ktx
etc2-rgba8.ktx
rgba-reference.ktx
rgb-reference.ktx
rgb-amg-reference.ktx
rgb-mipmap-reference.ktx
hi_mark_sq.ktx
)
list( TRANSFORM ES1_TEST_IMAGES
PREPEND "${PROJECT_SOURCE_DIR}/tests/testimages/"
)
set( ES1_SOURCES
glloadtests/gles1/ES1LoadTests.cpp
glloadtests/gles1/DrawTexture.cpp
glloadtests/gles1/DrawTexture.h
glloadtests/gles1/TexturedCube.cpp
glloadtests/gles1/TexturedCube.h
)
set( GL3_TEST_IMAGES
etc1s_Iron_Bars_001_normal.ktx2
uastc_Iron_Bars_001_normal.ktx2
color_grid_uastc_zstd.ktx2
color_grid_zstd.ktx2
color_grid_uastc.ktx2
color_grid_basis.ktx2
kodim17_basis.ktx2
kodim17_basis.ktx2
FlightHelmet_baseColor_basis.ktx2
rgba-reference-u.ktx2
rgba-reference-u.ktx2
rgba-reference-u.ktx2
cubemap_goldengate_uastc_rdo4_zstd5_rd.ktx2
cubemap_yokohama_basis_rd.ktx2
orient-down-metadata-u.ktx2
orient-down-metadata-u.ktx2
texturearray_bc3_unorm.ktx2
texturearray_astc_8x8_unorm.ktx2
texturearray_etc2_unorm.ktx2
3dtex_7_reference_u.ktx2
rgb-mipmap-reference-u.ktx2
hi_mark.ktx
orient-up-metadata.ktx
orient-down-metadata.ktx
not4_rgb888_srgb.ktx
etc1.ktx
etc2-rgb.ktx
etc2-rgba1.ktx
etc2-rgba8.ktx
etc2-sRGB.ktx
etc2-sRGBa1.ktx
etc2-sRGBa8.ktx
rgba-reference.ktx
rgb-reference.ktx
conftestimage_R11_EAC.ktx
conftestimage_SIGNED_R11_EAC.ktx
conftestimage_RG11_EAC.ktx
conftestimage_SIGNED_RG11_EAC.ktx
texturearray_bc3_unorm.ktx
texturearray_astc_8x8_unorm.ktx
texturearray_etc2_unorm.ktx
rgb-amg-reference.ktx
rgb-mipmap-reference.ktx
hi_mark_sq.ktx
)
list( TRANSFORM GL3_TEST_IMAGES
PREPEND "${PROJECT_SOURCE_DIR}/tests/testimages/"
)
set( GL3_RESOURCE_FILES ${LOAD_TEST_COMMON_RESOURCE_FILES} ${GL3_TEST_IMAGES} )
set( GL3_SOURCES
common/TranscodeTargetStrToFmt.cpp
common/TranscodeTargetStrToFmt.h
common/disable_glm_warnings.h
common/reenable_warnings.h
glloadtests/shader-based/DrawTexture.cpp
glloadtests/shader-based/DrawTexture.h
glloadtests/shader-based/EncodeTexture.cpp
glloadtests/shader-based/EncodeTexture.h
glloadtests/shader-based/GL3LoadTests.cpp
glloadtests/shader-based/GL3LoadTestSample.cpp
glloadtests/shader-based/GL3LoadTestSample.h
glloadtests/shader-based/InstancedSampleBase.cpp
glloadtests/shader-based/InstancedSampleBase.h
glloadtests/shader-based/mygl.h
glloadtests/shader-based/shaders.cpp
glloadtests/shader-based/Texture3d.cpp
glloadtests/shader-based/Texture3d.h
glloadtests/shader-based/TextureArray.cpp
glloadtests/shader-based/TextureArray.h
glloadtests/shader-based/TextureMipmap.cpp
glloadtests/shader-based/TextureMipmap.h
glloadtests/shader-based/TextureCubemap.cpp
glloadtests/shader-based/TextureCubemap.h
glloadtests/shader-based/TexturedCube.cpp
glloadtests/shader-based/TexturedCube.h
glloadtests/utils/GLMeshLoader.hpp
glloadtests/utils/GLTextureTranscoder.hpp
)
if(WIN32)
if(NOT OPENGL_ES_EMULATOR)
message("OPENGL_ES_EMULATOR not set. Will not build OpenGL ES load tests applications.")
else()
set(EMULATE_GLES ON)
endif()
endif()
if(IOS OR EMULATE_GLES)
# OpenGL ES 1.0
create_gl_target( es1loadtests "ES1" "${ES1_SOURCES}" "${KTX_APP_ICON_PATH}" "${ES1_TEST_IMAGES}" SDL_GL_CONTEXT_PROFILE_ES 1 0 ON)
endif()
if(IOS OR EMSCRIPTEN OR EMULATE_GLES)
# OpenGL ES 3.0
create_gl_target( es3loadtests "ES3" "${GL3_SOURCES}" "${LOAD_TEST_COMMON_RESOURCE_FILES}" "${GL3_TEST_IMAGES}" SDL_GL_CONTEXT_PROFILE_ES 3 0 ON YES)
endif()
if( (APPLE AND NOT IOS) OR LINUX OR WIN32 )
# OpenGL 3.3
create_gl_target( gl3loadtests "GL3" "${GL3_SOURCES}" "${LOAD_TEST_COMMON_RESOURCE_FILES}" "${GL3_TEST_IMAGES}" SDL_GL_CONTEXT_PROFILE_CORE 3 3 OFF YES)
endif()