From 14334819c60a415427e6cc805fc8c70a498cf26c Mon Sep 17 00:00:00 2001 From: Andreas Atteneder Date: Wed, 30 Sep 2020 23:25:15 +0200 Subject: [PATCH 1/7] feat: ktx_read, an experimental read-only library --- CMakeLists.txt | 398 ++++++++++++++++++++++++++----------------------- lib/texture1.c | 8 + lib/texture2.c | 8 + 3 files changed, 225 insertions(+), 189 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2cd16a0c73..c838ba56f9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,9 +93,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,126 +144,228 @@ 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) +# Main library +add_library( ktx ${LIB_TYPE} + ${KTX_MAIN_SRC} + ) -create_version_header(lib ktx) +# Read-only library +add_library( ktx_read ${LIB_TYPE} + ${KTX_MAIN_SRC} + ) -target_compile_definitions( - ktx -PUBLIC - "$<$:_DEBUG;DEBUG>" -PRIVATE - LIBKTX -) +macro(commom_lib_settings lib ) -# C/C++ Standard -target_compile_features(ktx PUBLIC c_std_99 cxx_std_11) + 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" + ) + set_xcode_code_sign(${lib}) -# Compiler Warning Flags -if(EMSCRIPTEN) - target_compile_options(ktx PRIVATE - -Wno-nested-anon-types - -Wno-gnu-anonymous-struct + target_compile_definitions( + ${lib} + PUBLIC + "$<$:_DEBUG;DEBUG>" + PRIVATE + LIBKTX ) -else() - target_compile_options(ktx PRIVATE - # clang options - $<$: + + # C/C++ Standard + target_compile_features(${lib} PUBLIC c_std_99 cxx_std_11) + + # Compiler Warning Flags + if(EMSCRIPTEN) + target_compile_options(${lib} PRIVATE -Wno-nested-anon-types -Wno-gnu-anonymous-struct - > - # not clang options - $<$>: - -Wno-pedantic - > + ) + else() + target_compile_options(${lib} PRIVATE + # clang options + $<$: + -Wno-nested-anon-types + -Wno-gnu-anonymous-struct + > + # not clang options + $<$>: + -Wno-pedantic + > + ) + endif() + + target_include_directories( + ${lib} + PUBLIC + $ + $ + + $ + $ + + $ + $ ) -endif() -target_include_directories( - ktx -PUBLIC - $ - $ + if( LIB_TYPE STREQUAL STATIC ) + target_compile_definitions(${lib} PUBLIC KHRONOS_STATIC) + endif() - $ - $ - $ - $ -) + # 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() -if( LIB_TYPE STREQUAL STATIC ) - target_compile_definitions(ktx PUBLIC KHRONOS_STATIC) -endif() + 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() -# 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 - ) -endif() + if(WIN32) + target_link_libraries( + ${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}/$>) -if(KTX_FEATURE_KTX1) - target_compile_definitions(ktx PUBLIC KTX_FEATURE_KTX1) - target_sources( - ktx - PRIVATE - lib/texture1.c - lib/texture1.h - ) -endif() + 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( + ${lib} + libzstd_static + ) + endif() -if(KTX_FEATURE_KTX2) - target_compile_definitions(ktx PUBLIC KTX_FEATURE_KTX2) -endif() + 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 ${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) if(KTX_FEATURE_WRITE) @@ -322,92 +422,12 @@ if(KTX_FEATURE_WRITE) $ $ ) - -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}/$>) - -elseif(APPLE) - if(IOS) - 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. - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $<1:${KTX_BUILD_DIR}/$>) - target_link_libraries( - ktx - ${CMAKE_CURRENT_SOURCE_DIR}/other_lib/mac/Release/libzstd.a - ) - 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( + target_compile_definitions( ktx PUBLIC - $ - $ + KTX_FEATURE_WRITE ) - 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() if(EMSCRIPTEN) diff --git a/lib/texture1.c b/lib/texture1.c index 95e1550a52..bd7e1139f9 100644 --- a/lib/texture1.c +++ b/lib/texture1.c @@ -1323,11 +1323,19 @@ struct ktxTexture_vtbl ktxTexture1_vtbl = { (PFNKTEXITERATELOADLEVELFACES)ktxTexture1_IterateLoadLevelFaces, (PFNKTEXNEEDSTRANSCODING)ktxTexture1_NeedsTranscoding, (PFNKTEXLOADIMAGEDATA)ktxTexture1_LoadImageData, +#if KTX_FEATURE_WRITE (PFNKTEXSETIMAGEFROMMEMORY)ktxTexture1_SetImageFromMemory, (PFNKTEXSETIMAGEFROMSTDIOSTREAM)ktxTexture1_SetImageFromStdioStream, (PFNKTEXWRITETOSTDIOSTREAM)ktxTexture1_WriteToStdioStream, (PFNKTEXWRITETONAMEDFILE)ktxTexture1_WriteToNamedFile, (PFNKTEXWRITETOMEMORY)ktxTexture1_WriteToMemory, +#else + (PFNKTEXSETIMAGEFROMMEMORY)NULL, + (PFNKTEXSETIMAGEFROMSTDIOSTREAM)NULL, + (PFNKTEXWRITETOSTDIOSTREAM)NULL, + (PFNKTEXWRITETONAMEDFILE)NULL, + (PFNKTEXWRITETOMEMORY)NULL, +#endif }; /** @} */ diff --git a/lib/texture2.c b/lib/texture2.c index a7b3149a19..a87cc3acef 100644 --- a/lib/texture2.c +++ b/lib/texture2.c @@ -2069,11 +2069,19 @@ struct ktxTexture_vtbl ktxTexture2_vtbl = { (PFNKTEXITERATELOADLEVELFACES)ktxTexture2_IterateLoadLevelFaces, (PFNKTEXNEEDSTRANSCODING)ktxTexture2_NeedsTranscoding, (PFNKTEXLOADIMAGEDATA)ktxTexture2_LoadImageData, +#if KTX_FEATURE_WRITE (PFNKTEXSETIMAGEFROMMEMORY)ktxTexture2_SetImageFromMemory, (PFNKTEXSETIMAGEFROMSTDIOSTREAM)ktxTexture2_SetImageFromStdioStream, (PFNKTEXWRITETOSTDIOSTREAM)ktxTexture2_WriteToStdioStream, (PFNKTEXWRITETONAMEDFILE)ktxTexture2_WriteToNamedFile, (PFNKTEXWRITETOMEMORY)ktxTexture2_WriteToMemory, +#else + (PFNKTEXSETIMAGEFROMMEMORY)NULL, + (PFNKTEXSETIMAGEFROMSTDIOSTREAM)NULL, + (PFNKTEXWRITETOSTDIOSTREAM)NULL, + (PFNKTEXWRITETONAMEDFILE)NULL, + (PFNKTEXWRITETOMEMORY)NULL, +#endif }; /** @} */ From c5deab00f982bc49011e04434ca1c33f67433b73 Mon Sep 17 00:00:00 2001 From: Andreas Atteneder Date: Wed, 7 Oct 2020 16:57:22 +0200 Subject: [PATCH 2/7] feat: Allow forcing libraries to be static. Useful for flexible integration. --- BUILDING.md | 2 ++ CMakeLists.txt | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/BUILDING.md b/BUILDING.md index 6ddd16ef3a..30eff7ae9a 100755 --- a/BUILDING.md +++ b/BUILDING.md @@ -44,6 +44,8 @@ This creates the `libktx` library and the command line tools. To create the comp cmake . -B build -DKTX_FEATURE_LOADTEST_APPS=ON -DKTX_FEATURE_DOC=ON ``` +If you need the library to be static, enable the `KTX_FEATURE_FORCE_STATIC` setting. + Building -------- diff --git a/CMakeLists.txt b/CMakeLists.txt index c838ba56f9..d25c9ca202 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,7 @@ include(cmake/xcode.cmake) 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_FORCE_STATIC "Always create static libraries" OFF ) set(VULKAN_INSTALL_DIR "" CACHE PATH "Path to installation of Vulkan SDK (obtainable from https://vulkan.lunarg.com/sdk/home )") @@ -76,7 +77,7 @@ if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8 OR FORCE32) set(bitness 32) endif() -if(EMSCRIPTEN OR IOS) +if(KTX_FEATURE_FORCE_STATIC OR EMSCRIPTEN OR IOS) set(LIB_TYPE STATIC) else() set(LIB_TYPE SHARED) From e7b37afc34db256aea79640c5ae8c6814eec928a Mon Sep 17 00:00:00 2001 From: Andreas Atteneder Date: Sun, 11 Oct 2020 00:26:58 +0200 Subject: [PATCH 3/7] fix: Return proper error code KTX_INVALID_OPERATION when invoking writing functions in read-only library ktx_read. --- lib/texture1.c | 51 ++++++++++++++++++++++++++++++++++++++++++-------- lib/texture2.c | 51 ++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 86 insertions(+), 16 deletions(-) diff --git a/lib/texture1.c b/lib/texture1.c index bd7e1139f9..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. @@ -1323,19 +1366,11 @@ struct ktxTexture_vtbl ktxTexture1_vtbl = { (PFNKTEXITERATELOADLEVELFACES)ktxTexture1_IterateLoadLevelFaces, (PFNKTEXNEEDSTRANSCODING)ktxTexture1_NeedsTranscoding, (PFNKTEXLOADIMAGEDATA)ktxTexture1_LoadImageData, -#if KTX_FEATURE_WRITE (PFNKTEXSETIMAGEFROMMEMORY)ktxTexture1_SetImageFromMemory, (PFNKTEXSETIMAGEFROMSTDIOSTREAM)ktxTexture1_SetImageFromStdioStream, (PFNKTEXWRITETOSTDIOSTREAM)ktxTexture1_WriteToStdioStream, (PFNKTEXWRITETONAMEDFILE)ktxTexture1_WriteToNamedFile, (PFNKTEXWRITETOMEMORY)ktxTexture1_WriteToMemory, -#else - (PFNKTEXSETIMAGEFROMMEMORY)NULL, - (PFNKTEXSETIMAGEFROMSTDIOSTREAM)NULL, - (PFNKTEXWRITETOSTDIOSTREAM)NULL, - (PFNKTEXWRITETONAMEDFILE)NULL, - (PFNKTEXWRITETOMEMORY)NULL, -#endif }; /** @} */ diff --git a/lib/texture2.c b/lib/texture2.c index a87cc3acef..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. @@ -2069,19 +2112,11 @@ struct ktxTexture_vtbl ktxTexture2_vtbl = { (PFNKTEXITERATELOADLEVELFACES)ktxTexture2_IterateLoadLevelFaces, (PFNKTEXNEEDSTRANSCODING)ktxTexture2_NeedsTranscoding, (PFNKTEXLOADIMAGEDATA)ktxTexture2_LoadImageData, -#if KTX_FEATURE_WRITE (PFNKTEXSETIMAGEFROMMEMORY)ktxTexture2_SetImageFromMemory, (PFNKTEXSETIMAGEFROMSTDIOSTREAM)ktxTexture2_SetImageFromStdioStream, (PFNKTEXWRITETOSTDIOSTREAM)ktxTexture2_WriteToStdioStream, (PFNKTEXWRITETONAMEDFILE)ktxTexture2_WriteToNamedFile, (PFNKTEXWRITETOMEMORY)ktxTexture2_WriteToMemory, -#else - (PFNKTEXSETIMAGEFROMMEMORY)NULL, - (PFNKTEXSETIMAGEFROMSTDIOSTREAM)NULL, - (PFNKTEXWRITETOSTDIOSTREAM)NULL, - (PFNKTEXWRITETONAMEDFILE)NULL, - (PFNKTEXWRITETOMEMORY)NULL, -#endif }; /** @} */ From 7a4a99bbb6357e5fd914c259446fc1c6b7ef9190 Mon Sep 17 00:00:00 2001 From: Andreas Atteneder Date: Sun, 11 Oct 2020 00:53:16 +0200 Subject: [PATCH 4/7] fix: Made KTX_FEATURE_STATIC_LIBRARY a platform dependent option (always ON on iOS and emscripten). --- BUILDING.md | 2 +- CMakeLists.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index 30eff7ae9a..4697fbf909 100755 --- a/BUILDING.md +++ b/BUILDING.md @@ -44,7 +44,7 @@ This creates the `libktx` library and the command line tools. To create the comp cmake . -B build -DKTX_FEATURE_LOADTEST_APPS=ON -DKTX_FEATURE_DOC=ON ``` -If you need the library to be static, enable the `KTX_FEATURE_FORCE_STATIC` setting. +If you need the library to be static, enable the `KTX_FEATURE_STATIC_LIBRARY` setting (always enabled on iOS and Emscripten). Building -------- diff --git a/CMakeLists.txt b/CMakeLists.txt index d25c9ca202..2e1846dcb9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,7 +27,7 @@ include(cmake/xcode.cmake) 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_FORCE_STATIC "Always create static libraries" OFF ) +CMAKE_DEPENDENT_OPTION(KTX_FEATURE_STATIC_LIBRARY "Create static libraries (shared otherwise)" OFF "NOT IOS;NOT EMSCRIPTEN" ON) set(VULKAN_INSTALL_DIR "" CACHE PATH "Path to installation of Vulkan SDK (obtainable from https://vulkan.lunarg.com/sdk/home )") @@ -77,7 +77,7 @@ if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8 OR FORCE32) set(bitness 32) endif() -if(KTX_FEATURE_FORCE_STATIC OR EMSCRIPTEN OR IOS) +if(KTX_FEATURE_STATIC_LIBRARY) set(LIB_TYPE STATIC) else() set(LIB_TYPE SHARED) From 609f75f55eee8bb054bff512cdb1d44bea507aeb Mon Sep 17 00:00:00 2001 From: Andreas Atteneder Date: Mon, 12 Oct 2020 21:45:34 +0200 Subject: [PATCH 5/7] fix: Option KTX_FEATURE_STATIC_LIBRARY is now always visible, but configuration yields error if type is invalid for current platform --- CMakeLists.txt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2e1846dcb9..b37129b9fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,10 +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 ) -CMAKE_DEPENDENT_OPTION(KTX_FEATURE_STATIC_LIBRARY "Create static libraries (shared otherwise)" OFF "NOT IOS;NOT EMSCRIPTEN" ON) +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 )") @@ -80,6 +86,9 @@ endif() 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() From 1430dd37456cf36a0d0e6fd5017902b567e50414 Mon Sep 17 00:00:00 2001 From: Andreas Atteneder Date: Tue, 13 Oct 2020 00:15:46 +0200 Subject: [PATCH 6/7] fix: Removed CMake var KTX_FEATURE_WRITE (always true for target `ktx`) --- CMakeLists.txt | 121 +++++++++++++++++++++---------------------- tools/CMakeLists.txt | 5 -- 2 files changed, 59 insertions(+), 67 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b37129b9fe..be86e4ecd1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,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 ) @@ -377,68 +375,67 @@ commom_lib_settings(ktx_read) create_version_header(lib ktx) -if(KTX_FEATURE_WRITE) - 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 - ) +# 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 + $ + $ -endif() + $ + $ +) +target_compile_definitions( + ktx +PUBLIC + KTX_FEATURE_WRITE +) if(EMSCRIPTEN) diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 21cbaacf1f..02e83fb5cc 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -11,11 +11,6 @@ if(NOT KTX_FEATURE_KTX2) return() endif() -if(NOT KTX_FEATURE_WRITE) - message(WARNING "KTX_FEATURE_WRITE is not set -> disabling tools") - return() -endif() - function(set_tool_properties tool_target) if(APPLE) set_target_properties(${tool_target} PROPERTIES From 99bf4af84fab206debd539a555043449fd2052ed Mon Sep 17 00:00:00 2001 From: Andreas Atteneder Date: Tue, 13 Oct 2020 00:22:21 +0200 Subject: [PATCH 7/7] fix: Link both `ktx_js` and `msc_basis_transcoder_js` against `ktx_read` (instead of `ktx`). Those are read-only and this ensures it. If creating KTX is required, we'd need to make additional targets and link against `ktx` again. --- CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index be86e4ecd1..47bd2b4a58 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -451,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 @@ -482,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 @@ -492,7 +492,7 @@ if(EMSCRIPTEN) # Re-use ktx's compile options target_compile_options(msc_basis_transcoder_js PRIVATE - $ + $ ) target_link_options( @@ -501,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")