diff --git a/CMakeLists.txt b/CMakeLists.txt index 2cd16a0c73..47bd2b4a58 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,9 +24,16 @@ include(cmake/xcode.cmake) # OPTIONS +if( IOS OR EMSCRIPTEN ) + set( LIB_TYPE_DEFAULT ON ) +else() + set( LIB_TYPE_DEFAULT OFF ) +endif() + CMAKE_DEPENDENT_OPTION(KTX_FEATURE_TOOLS "Create KTX tools" ON "NOT IOS;NOT ANDROID;NOT EMSCRIPTEN" OFF) option( KTX_FEATURE_DOC "Create KTX documentation" OFF ) option( KTX_FEATURE_LOADTEST_APPS "Create load tests apps that load and display various KTX textures" OFF ) +option( KTX_FEATURE_STATIC_LIBRARY "Create static libraries (shared otherwise)" ${LIB_TYPE_DEFAULT} ) set(VULKAN_INSTALL_DIR "" CACHE PATH "Path to installation of Vulkan SDK (obtainable from https://vulkan.lunarg.com/sdk/home )") @@ -45,9 +52,7 @@ endif() # option( KTX_FEATURE_KTX1 "KTX version 1" ON ) # option( KTX_FEATURE_KTX2 "KTX version 2" ON ) -# option( KTX_FEATURE_WRITE "Create KTX files" ON ) -set( KTX_FEATURE_WRITE ON ) set( KTX_FEATURE_KTX1 ON ) set( KTX_FEATURE_KTX2 ON ) set( KTX_FEATURE_VULKAN ON ) @@ -76,9 +81,12 @@ if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8 OR FORCE32) set(bitness 32) endif() -if(EMSCRIPTEN OR IOS) +if(KTX_FEATURE_STATIC_LIBRARY) set(LIB_TYPE STATIC) else() + if(IOS OR EMSCRIPTEN) + message(SEND_ERROR "Library type cannot be shared for the current platform. Set KTX_FEATURE_STATIC_LIBRARY to ON!") + endif() set(LIB_TYPE SHARED) endif() @@ -93,9 +101,7 @@ else() add_link_options( $,-g,-O3> ) endif() - -# Main library -add_library( ktx ${LIB_TYPE} +set(KTX_MAIN_SRC include/ktx.h lib/basis_sgd.h lib/basis_transcode.cpp @@ -146,269 +152,290 @@ add_library( ktx ${LIB_TYPE} lib/vkformat_str.c ) -set_target_properties(ktx PROPERTIES - PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/ktx.h - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION_MAJOR} - XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME "YES" -) -set_xcode_code_sign(ktx) - -## Creating vulkan headers is only required when Vulkan SDK updates. -# add_dependencies(ktx mkvk) - -create_version_header(lib ktx) - -target_compile_definitions( - ktx -PUBLIC - "$<$:_DEBUG;DEBUG>" -PRIVATE - LIBKTX -) - -# C/C++ Standard -target_compile_features(ktx PUBLIC c_std_99 cxx_std_11) - -# Compiler Warning Flags -if(EMSCRIPTEN) - target_compile_options(ktx PRIVATE - -Wno-nested-anon-types - -Wno-gnu-anonymous-struct - ) -else() - target_compile_options(ktx PRIVATE - # clang options - $<$: - -Wno-nested-anon-types - -Wno-gnu-anonymous-struct - > - # not clang options - $<$>: - -Wno-pedantic - > +# Main library +add_library( ktx ${LIB_TYPE} + ${KTX_MAIN_SRC} ) -endif() -target_include_directories( - ktx -PUBLIC - $ - $ - - $ - $ - - $ - $ -) - -if( LIB_TYPE STREQUAL STATIC ) - target_compile_definitions(ktx PUBLIC KHRONOS_STATIC) -endif() +# Read-only library +add_library( ktx_read ${LIB_TYPE} + ${KTX_MAIN_SRC} + ) +macro(commom_lib_settings lib ) -# To reduce size, don't support transcoding to ancient formats. -target_compile_definitions(ktx PRIVATE BASISD_SUPPORT_FXT1=0) - -# TODO: make options for all formats and good per-platform defaults -# - BASISD_SUPPORT_UASTC -# - BASISD_SUPPORT_DXT1 (BC1) -# - BASISD_SUPPORT_DXT5A (BC3/4/5) -# - BASISD_SUPPORT_BC7 -# - BASISD_SUPPORT_BC7_MODE5 -# - BASISD_SUPPORT_PVRTC1 -# - BASISD_SUPPORT_ETC2_EAC_A8 -# - BASISD_SUPPORT_ASTC -# - BASISD_SUPPORT_ATC -# - BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY -# - BASISD_SUPPORT_ETC2_EAC_RG11 -# - BASISD_SUPPORT_FXT1 -# - BASISD_SUPPORT_PVRTC2 - -if(WIN32) - target_compile_definitions( - ktx - PRIVATE - "KTX_API=__declspec(dllexport)" - PUBLIC # only for basisu_c_binding. - BASISU_NO_ITERATOR_DEBUG_LEVEL - ) - target_sources( - ktx - PRIVATE - # The msvs generator automatically sets the needed VCLinker - # option when a .def file is seen in sources. - lib/internalexport.def - ) -elseif(EMSCRIPTEN) - target_compile_definitions(ktx PRIVATE - # To reduce size, don't support transcoding to formats not - # supported # by WebGL. - BASISD_SUPPORT_ATC=0 - BASISD_SUPPORT_PVRTC2=0 - # Don't support higher quality mode to avoid 64k table. - BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY=0 - KTX_OMIT_VULKAN=1 + set_target_properties(${lib} PROPERTIES + PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/ktx.h + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME "YES" ) -endif() + set_xcode_code_sign(${lib}) -if(KTX_FEATURE_KTX1) - target_compile_definitions(ktx PUBLIC KTX_FEATURE_KTX1) - target_sources( - ktx + target_compile_definitions( + ${lib} + PUBLIC + "$<$:_DEBUG;DEBUG>" PRIVATE - lib/texture1.c - lib/texture1.h + LIBKTX ) -endif() -if(KTX_FEATURE_KTX2) - target_compile_definitions(ktx PUBLIC KTX_FEATURE_KTX2) -endif() + # C/C++ Standard + target_compile_features(${lib} PUBLIC c_std_99 cxx_std_11) -if(KTX_FEATURE_WRITE) + # Compiler Warning Flags + if(EMSCRIPTEN) + target_compile_options(${lib} PRIVATE + -Wno-nested-anon-types + -Wno-gnu-anonymous-struct + ) + else() + target_compile_options(${lib} PRIVATE + # clang options + $<$: + -Wno-nested-anon-types + -Wno-gnu-anonymous-struct + > + # not clang options + $<$>: + -Wno-pedantic + > + ) + endif() - target_sources( - ktx - PRIVATE - lib/basis_encode.cpp - lib/basisu/apg_bmp.c - lib/basisu/apg_bmp.h - lib/basisu/basisu_astc_decomp.cpp - lib/basisu/basisu_astc_decomp.h - lib/basisu/basisu_backend.cpp - lib/basisu/basisu_backend.h - lib/basisu/basisu_basis_file.cpp - lib/basisu/basisu_basis_file.h - lib/basisu/basisu_bc7enc.cpp - lib/basisu/basisu_bc7enc.h - lib/basisu/basisu_comp.cpp - lib/basisu/basisu_comp.h - lib/basisu/basisu_enc.cpp - lib/basisu/basisu_enc.h - lib/basisu/basisu_etc.cpp - lib/basisu/basisu_etc.h - lib/basisu/basisu_frontend.cpp - lib/basisu/basisu_frontend.h - lib/basisu/basisu_global_selector_palette_helpers.cpp - lib/basisu/basisu_global_selector_palette_helpers.h - lib/basisu/basisu_gpu_texture.cpp - lib/basisu/basisu_gpu_texture.h - lib/basisu/basisu_miniz.h - lib/basisu/basisu_pvrtc1_4.cpp - lib/basisu/basisu_pvrtc1_4.h - lib/basisu/basisu_resample_filters.cpp - lib/basisu/basisu_resampler_filters.h - lib/basisu/basisu_resampler.cpp - lib/basisu/basisu_resampler.h - lib/basisu/basisu_ssim.cpp - lib/basisu/basisu_ssim.h - lib/basisu/basisu_uastc_enc.cpp - lib/basisu/basisu_uastc_enc.h - lib/basisu/jpgd.cpp - lib/basisu/jpgd.h - lib/basisu/lodepng.cpp - lib/basisu/lodepng.h - lib/writer1.c - lib/writer2.c - ) target_include_directories( - ktx + ${lib} PUBLIC - $ - $ + $ + $ - $ - $ + $ + $ + + $ + $ ) -endif() + if( LIB_TYPE STREQUAL STATIC ) + target_compile_definitions(${lib} PUBLIC KHRONOS_STATIC) + endif() -set(KTX_BUILD_DIR "${CMAKE_BINARY_DIR}") -if(WIN32) - target_link_libraries( - ktx - ${CMAKE_CURRENT_SOURCE_DIR}/other_lib/win/Release-x64/zstd_static.lib - ) - # By wrapping in generator expression we force multi configuration generators (like Visual Studio) - # to take the exact path and not change it. - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $<1:${KTX_BUILD_DIR}/$>) + # To reduce size, don't support transcoding to ancient formats. + target_compile_definitions(${lib} PRIVATE BASISD_SUPPORT_FXT1=0) + + # TODO: make options for all formats and good per-platform defaults + # - BASISD_SUPPORT_UASTC + # - BASISD_SUPPORT_DXT1 (BC1) + # - BASISD_SUPPORT_DXT5A (BC3/4/5) + # - BASISD_SUPPORT_BC7 + # - BASISD_SUPPORT_BC7_MODE5 + # - BASISD_SUPPORT_PVRTC1 + # - BASISD_SUPPORT_ETC2_EAC_A8 + # - BASISD_SUPPORT_ASTC + # - BASISD_SUPPORT_ATC + # - BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY + # - BASISD_SUPPORT_ETC2_EAC_RG11 + # - BASISD_SUPPORT_FXT1 + # - BASISD_SUPPORT_PVRTC2 + + if(WIN32) + target_compile_definitions( + ${lib} + PRIVATE + "KTX_API=__declspec(dllexport)" + PUBLIC # only for basisu_c_binding. + BASISU_NO_ITERATOR_DEBUG_LEVEL + ) + target_sources( + ${lib} + PRIVATE + # The msvs generator automatically sets the needed VCLinker + # option when a .def file is seen in sources. + lib/internalexport.def + ) + elseif(EMSCRIPTEN) + target_compile_definitions(${lib} PRIVATE + # To reduce size, don't support transcoding to formats not + # supported # by WebGL. + BASISD_SUPPORT_ATC=0 + BASISD_SUPPORT_PVRTC2=0 + # Don't support higher quality mode to avoid 64k table. + BASISD_SUPPORT_ASTC_HIGHER_OPAQUE_QUALITY=0 + KTX_OMIT_VULKAN=1 + ) + endif() -elseif(APPLE) - if(IOS) + if(KTX_FEATURE_KTX1) + target_compile_definitions(${lib} PUBLIC KTX_FEATURE_KTX1) + target_sources( + ${lib} + PRIVATE + lib/texture1.c + lib/texture1.h + ) + endif() + + if(KTX_FEATURE_KTX2) + target_compile_definitions(${lib} PUBLIC KTX_FEATURE_KTX2) + endif() + + if(WIN32) target_link_libraries( - ktx - ${CMAKE_CURRENT_SOURCE_DIR}/other_lib/ios/Release-iphoneos/libzstd.a - ) - else() - # Set a common RUNTIME_OUTPUT_DIR for all target, so that INSTALL RPATH - # is functional in build directory as well. BUILD_WITH_INSTALL_RPATH is necessary - # for working code signing. + ${lib} + ${CMAKE_CURRENT_SOURCE_DIR}/other_lib/win/Release-x64/zstd_static.lib + ) + # By wrapping in generator expression we force multi configuration generators (like Visual Studio) + # to take the exact path and not change it. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $<1:${KTX_BUILD_DIR}/$>) + + elseif(APPLE) + if(IOS) + target_link_libraries( + ${lib} + ${CMAKE_CURRENT_SOURCE_DIR}/other_lib/ios/Release-iphoneos/libzstd.a + ) + else() + # Set a common RUNTIME_OUTPUT_DIR for all target, so that INSTALL RPATH + # is functional in build directory as well. BUILD_WITH_INSTALL_RPATH is necessary + # for working code signing. + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $<1:${KTX_BUILD_DIR}/$>) + target_link_libraries( + ${lib} + ${CMAKE_CURRENT_SOURCE_DIR}/other_lib/mac/Release/libzstd.a + ) + endif() + elseif(EMSCRIPTEN) + target_sources( + ${lib} + PRIVATE + lib/zstddeclib.c + ) + elseif(LINUX) + find_package(zstd REQUIRED) + find_package(Threads REQUIRED) + target_link_libraries( + ${lib} + dl + Threads::Threads + zstd::zstd + ) + elseif(ANDROID) + # add_library(zstd STATIC IMPORTED) + # set_target_properties(zstd PROPERTIES + # IMPORTED_LOCATION /Users/Shared/SDK/zstd/build/cmake/install-android/lib/libzstd.a + # ) + # target_link_libraries( + # ktx + # zstd + # ) + set(ZSTD_BUILD_PROGRAMS OFF) + set(ZSTD_BUILD_TESTS OFF) + add_subdirectory(/Users/Shared/SDK/zstd/build/cmake zstd) target_link_libraries( - ktx - ${CMAKE_CURRENT_SOURCE_DIR}/other_lib/mac/Release/libzstd.a - ) + ${lib} + libzstd_static + ) endif() -elseif(EMSCRIPTEN) - target_sources( - ktx - PRIVATE - lib/zstddeclib.c - ) -elseif(LINUX) - find_package(zstd REQUIRED) - find_package(Threads REQUIRED) - target_link_libraries( - ktx - dl - Threads::Threads - zstd::zstd - ) -elseif(ANDROID) - # add_library(zstd STATIC IMPORTED) - # set_target_properties(zstd PROPERTIES - # IMPORTED_LOCATION /Users/Shared/SDK/zstd/build/cmake/install-android/lib/libzstd.a - # ) - # target_link_libraries( - # ktx - # zstd - # ) - set(ZSTD_BUILD_PROGRAMS OFF) - set(ZSTD_BUILD_TESTS OFF) - add_subdirectory(/Users/Shared/SDK/zstd/build/cmake zstd) - target_link_libraries( - ktx - libzstd_static - ) -endif() -if(KTX_FEATURE_VULKAN) - target_sources( - ktx - PRIVATE - include/ktxvulkan.h - lib/vk_funcs.c - lib/vk_funcs.h - lib/vkloader.c - ) - target_include_directories( - ktx - PUBLIC - $ - $ - ) + if(KTX_FEATURE_VULKAN) + target_sources( + ${lib} + PRIVATE + include/ktxvulkan.h + lib/vk_funcs.c + lib/vk_funcs.h + lib/vkloader.c + ) + target_include_directories( + ${lib} + PUBLIC + $ + $ + ) - get_target_property( KTX_PUBLIC_HEADER ktx PUBLIC_HEADER ) - list(APPEND KTX_PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/ktxvulkan.h) - set_target_properties(ktx PROPERTIES - PUBLIC_HEADER "${KTX_PUBLIC_HEADER}" - ) -else() - target_compile_definitions( ktx PRIVATE KTX_OMIT_VULKAN=1 ) -endif() + get_target_property( KTX_PUBLIC_HEADER ${lib} PUBLIC_HEADER ) + list(APPEND KTX_PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/ktxvulkan.h) + set_target_properties(${lib} PROPERTIES + PUBLIC_HEADER "${KTX_PUBLIC_HEADER}" + ) + else() + target_compile_definitions( ${lib} PRIVATE KTX_OMIT_VULKAN=1 ) + endif() + +endmacro(commom_lib_settings) + +set(KTX_BUILD_DIR "${CMAKE_BINARY_DIR}") + +commom_lib_settings(ktx) +commom_lib_settings(ktx_read) + +## Creating vulkan headers is only required when Vulkan SDK updates. +# add_dependencies(ktx mkvk) + +create_version_header(lib ktx) + + +# Adding write capability to target ktx + +target_sources( + ktx +PRIVATE + lib/basis_encode.cpp + lib/basisu/apg_bmp.c + lib/basisu/apg_bmp.h + lib/basisu/basisu_astc_decomp.cpp + lib/basisu/basisu_astc_decomp.h + lib/basisu/basisu_backend.cpp + lib/basisu/basisu_backend.h + lib/basisu/basisu_basis_file.cpp + lib/basisu/basisu_basis_file.h + lib/basisu/basisu_bc7enc.cpp + lib/basisu/basisu_bc7enc.h + lib/basisu/basisu_comp.cpp + lib/basisu/basisu_comp.h + lib/basisu/basisu_enc.cpp + lib/basisu/basisu_enc.h + lib/basisu/basisu_etc.cpp + lib/basisu/basisu_etc.h + lib/basisu/basisu_frontend.cpp + lib/basisu/basisu_frontend.h + lib/basisu/basisu_global_selector_palette_helpers.cpp + lib/basisu/basisu_global_selector_palette_helpers.h + lib/basisu/basisu_gpu_texture.cpp + lib/basisu/basisu_gpu_texture.h + lib/basisu/basisu_miniz.h + lib/basisu/basisu_pvrtc1_4.cpp + lib/basisu/basisu_pvrtc1_4.h + lib/basisu/basisu_resample_filters.cpp + lib/basisu/basisu_resampler_filters.h + lib/basisu/basisu_resampler.cpp + lib/basisu/basisu_resampler.h + lib/basisu/basisu_ssim.cpp + lib/basisu/basisu_ssim.h + lib/basisu/basisu_uastc_enc.cpp + lib/basisu/basisu_uastc_enc.h + lib/basisu/jpgd.cpp + lib/basisu/jpgd.h + lib/basisu/lodepng.cpp + lib/basisu/lodepng.h + lib/writer1.c + lib/writer2.c +) +target_include_directories( + ktx +PUBLIC + $ + $ + + $ + $ +) +target_compile_definitions( + ktx +PUBLIC + KTX_FEATURE_WRITE +) if(EMSCRIPTEN) @@ -424,8 +451,8 @@ if(EMSCRIPTEN) ) add_executable( ktx_js interface/js_binding/ktx_wrapper.cpp ) - target_link_libraries( ktx_js ktx ) - target_include_directories( ktx_js PRIVATE $ ) + target_link_libraries( ktx_js ktx_read ) + target_include_directories( ktx_js PRIVATE $ ) target_link_options( ktx_js PUBLIC @@ -455,7 +482,7 @@ if(EMSCRIPTEN) ) add_executable( msc_basis_transcoder_js interface/js_binding/transcoder_wrapper.cpp ) - target_link_libraries( msc_basis_transcoder_js ktx ) + target_link_libraries( msc_basis_transcoder_js ktx_read ) target_include_directories( msc_basis_transcoder_js PRIVATE lib @@ -465,7 +492,7 @@ if(EMSCRIPTEN) # Re-use ktx's compile options target_compile_options(msc_basis_transcoder_js PRIVATE - $ + $ ) target_link_options( @@ -474,7 +501,7 @@ if(EMSCRIPTEN) ${KTX_EMC_LINK_FLAGS} "SHELL:-s EXPORT_NAME=MSC_TRANSCODER" # Re-use ktx's link options - $ + $ ) set_target_properties( msc_basis_transcoder_js PROPERTIES OUTPUT_NAME "msc_basis_transcoder") diff --git a/lib/texture1.c b/lib/texture1.c index 95e1550a52..dffbe9a224 100644 --- a/lib/texture1.c +++ b/lib/texture1.c @@ -1303,6 +1303,49 @@ ktxTexture1_NeedsTranscoding(ktxTexture1* This) return KTX_FALSE; } +#if !KTX_FEATURE_WRITE + +/* + * Stubs for writer functions that return a proper error code + */ + +KTX_error_code +ktxTexture1_SetImageFromMemory(ktxTexture1* This, ktx_uint32_t level, + ktx_uint32_t layer, ktx_uint32_t faceSlice, + const ktx_uint8_t* src, ktx_size_t srcSize) +{ + return KTX_INVALID_OPERATION; +} + +KTX_error_code +ktxTexture1_SetImageFromStdioStream(ktxTexture1* This, ktx_uint32_t level, + ktx_uint32_t layer, ktx_uint32_t faceSlice, + FILE* src, ktx_size_t srcSize) +{ + return KTX_INVALID_OPERATION; +} + +KTX_error_code +ktxTexture1_WriteToStdioStream(ktxTexture1* This, FILE* dstsstr) +{ + return KTX_INVALID_OPERATION; +} + +KTX_error_code +ktxTexture1_WriteToNamedFile(ktxTexture1* This, const char* const dstname) +{ + return KTX_INVALID_OPERATION; +} + +KTX_error_code +ktxTexture1_WriteToMemory(ktxTexture1* This, + ktx_uint8_t** ppDstBytes, ktx_size_t* pSize) +{ + return KTX_INVALID_OPERATION; +} + +#endif + /* * Initialized here at the end to avoid the need for multiple declarations of * these functions. diff --git a/lib/texture2.c b/lib/texture2.c index a7b3149a19..8a9a853477 100644 --- a/lib/texture2.c +++ b/lib/texture2.c @@ -2049,6 +2049,49 @@ ktxTexture2_inflateZstdInt(ktxTexture2* This, ktx_uint8_t* pDeflatedData, return KTX_SUCCESS; } +#if !KTX_FEATURE_WRITE + +/* + * Stubs for writer functions that return a proper error code + */ + +KTX_error_code +ktxTexture2_SetImageFromMemory(ktxTexture2* This, ktx_uint32_t level, + ktx_uint32_t layer, ktx_uint32_t faceSlice, + const ktx_uint8_t* src, ktx_size_t srcSize) +{ + return KTX_INVALID_OPERATION; +} + +KTX_error_code +ktxTexture2_SetImageFromStdioStream(ktxTexture2* This, ktx_uint32_t level, + ktx_uint32_t layer, ktx_uint32_t faceSlice, + FILE* src, ktx_size_t srcSize) +{ + return KTX_INVALID_OPERATION; +} + +KTX_error_code +ktxTexture2_WriteToStdioStream(ktxTexture2* This, FILE* dstsstr) +{ + return KTX_INVALID_OPERATION; +} + +KTX_error_code +ktxTexture2_WriteToNamedFile(ktxTexture2* This, const char* const dstname) +{ + return KTX_INVALID_OPERATION; +} + +KTX_error_code +ktxTexture2_WriteToMemory(ktxTexture2* This, + ktx_uint8_t** ppDstBytes, ktx_size_t* pSize) +{ + return KTX_INVALID_OPERATION; +} + +#endif + /* * Initialized here at the end to avoid the need for multiple declarations of * the virtual functions.