From b60518caa5355e9f7fb690dc70de922b406d319e Mon Sep 17 00:00:00 2001 From: Philip Rideout Date: Mon, 4 Apr 2022 15:45:00 -0700 Subject: [PATCH] Add libs/ktxreader, rename some things to prep for KTX2. Changes: - Remove the strange header-only variant of libs/image - Rename KtxBundle => Ktx1Bundle - Move image/KtxUtility => ktxreader/Ktx1Reader - Add unit test for Ktx1Reader and test stub for KTX2. Notes: - Ktx1Bundle does not depend on Filament and is used by cmgen and mipgen to generate KTX files. - Ktx1Reader has a dependency on Filament and should therefore live in a separate library, which it now does. --- CMakeLists.txt | 1 + android/filament-utils-android/CMakeLists.txt | 5 + .../src/main/cpp/Utils.cpp | 23 +- build/common/test_list.txt | 1 + .../gltf-viewer/FILViewController.mm | 13 +- .../hello-ar/FilamentArView/FilamentApp.cpp | 7 +- .../hello-gltf/FilamentView/App.cpp | 12 +- .../hello-pbr/hello-pbr/FilamentApp.cpp | 12 +- libs/filamentapp/CMakeLists.txt | 17 +- libs/filamentapp/src/IBL.cpp | 15 +- libs/image/CMakeLists.txt | 11 +- .../image/{KtxBundle.h => Ktx1Bundle.h} | 16 +- libs/image/include/image/KtxUtility.h | 367 ------------------ .../src/{KtxBundle.cpp => Ktx1Bundle.cpp} | 28 +- libs/image/tests/test_image.cpp | 10 +- libs/ktxreader/CMakeLists.txt | 65 ++++ libs/ktxreader/include/ktxreader/Ktx1Reader.h | 90 +++++ libs/ktxreader/src/Ktx1Reader.cpp | 316 +++++++++++++++ .../tests/color_grid_uastc_zstd.ktx2 | Bin 0 -> 170512 bytes libs/ktxreader/tests/lightroom_ibl.ktx | Bin 0 -> 129368 bytes libs/ktxreader/tests/test_ktxreader.cpp | 80 ++++ samples/suzanne.cpp | 21 +- tools/cmgen/src/cmgen.cpp | 34 +- tools/mipgen/src/main.cpp | 20 +- tools/roughness-prefilter/src/main.cpp | 14 +- web/docs/tutorial_redball.md | 4 +- web/filament-js/CMakeLists.txt | 2 +- web/filament-js/extensions.js | 4 +- web/filament-js/jsbindings.cpp | 54 +-- web/filament-js/utilities.js | 4 +- 30 files changed, 718 insertions(+), 528 deletions(-) rename libs/image/include/image/{KtxBundle.h => Ktx1Bundle.h} (96%) delete mode 100644 libs/image/include/image/KtxUtility.h rename libs/image/src/{KtxBundle.cpp => Ktx1Bundle.cpp} (92%) create mode 100644 libs/ktxreader/CMakeLists.txt create mode 100644 libs/ktxreader/include/ktxreader/Ktx1Reader.h create mode 100644 libs/ktxreader/src/Ktx1Reader.cpp create mode 100644 libs/ktxreader/tests/color_grid_uastc_zstd.ktx2 create mode 100644 libs/ktxreader/tests/lightroom_ibl.ktx create mode 100644 libs/ktxreader/tests/test_ktxreader.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 78da71f3cf..7320cdf8d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -647,6 +647,7 @@ add_subdirectory(${LIBRARIES}/gltfio) add_subdirectory(${LIBRARIES}/ibl) add_subdirectory(${LIBRARIES}/iblprefilter) add_subdirectory(${LIBRARIES}/image) +add_subdirectory(${LIBRARIES}/ktxreader) add_subdirectory(${LIBRARIES}/math) add_subdirectory(${LIBRARIES}/mathio) add_subdirectory(${LIBRARIES}/utils) diff --git a/android/filament-utils-android/CMakeLists.txt b/android/filament-utils-android/CMakeLists.txt index c5c214e216..92c4a319b3 100644 --- a/android/filament-utils-android/CMakeLists.txt +++ b/android/filament-utils-android/CMakeLists.txt @@ -14,6 +14,10 @@ add_library(image STATIC IMPORTED) set_target_properties(image PROPERTIES IMPORTED_LOCATION ${FILAMENT_DIR}/lib/${ANDROID_ABI}/libimage.a) +add_library(ktxreader STATIC IMPORTED) +set_target_properties(ktxreader PROPERTIES IMPORTED_LOCATION + ${FILAMENT_DIR}/lib/${ANDROID_ABI}/libktxreader.a) + add_library(viewer STATIC IMPORTED) set_target_properties(viewer PROPERTIES IMPORTED_LOCATION ${FILAMENT_DIR}/lib/${ANDROID_ABI}/libviewer.a) @@ -64,5 +68,6 @@ target_link_libraries(filament-utils-jni camutils iblprefilter image + ktxreader viewer ) diff --git a/android/filament-utils-android/src/main/cpp/Utils.cpp b/android/filament-utils-android/src/main/cpp/Utils.cpp index 445b6891b1..2af710846e 100644 --- a/android/filament-utils-android/src/main/cpp/Utils.cpp +++ b/android/filament-utils-android/src/main/cpp/Utils.cpp @@ -20,13 +20,14 @@ #include #include -#include +#include #include "common/NioUtils.h" using namespace filament; using namespace filament::math; using namespace image; +using namespace ktxreader; jlong nCreateHDRTexture(JNIEnv* env, jclass, jlong nativeEngine, jobject javaBuffer, jint remaining, jint internalFormat); @@ -35,9 +36,9 @@ static jlong nCreateKTXTexture(JNIEnv* env, jclass, jlong nativeEngine, jobject javaBuffer, jint remaining, jboolean srgb) { Engine* engine = (Engine*) nativeEngine; AutoBuffer buffer(env, javaBuffer, remaining); - KtxBundle* bundle = new KtxBundle((const uint8_t*) buffer.getData(), buffer.getSize()); - return (jlong) ktx::createTexture(engine, *bundle, srgb, [](void* userdata) { - KtxBundle* bundle = (KtxBundle*) userdata; + Ktx1Bundle* bundle = new Ktx1Bundle((const uint8_t*) buffer.getData(), buffer.getSize()); + return (jlong) Ktx1Reader::createTexture(engine, *bundle, srgb, [](void* userdata) { + Ktx1Bundle* bundle = (Ktx1Bundle*) userdata; delete bundle; }, bundle); } @@ -46,9 +47,9 @@ static jlong nCreateIndirectLight(JNIEnv* env, jclass, jlong nativeEngine, jobject javaBuffer, jint remaining, jboolean srgb) { Engine* engine = (Engine*) nativeEngine; AutoBuffer buffer(env, javaBuffer, remaining); - KtxBundle* bundle = new KtxBundle((const uint8_t*) buffer.getData(), buffer.getSize()); - Texture* cubemap = ktx::createTexture(engine, *bundle, srgb, [](void* userdata) { - KtxBundle* bundle = (KtxBundle*) userdata; + Ktx1Bundle* bundle = new Ktx1Bundle((const uint8_t*) buffer.getData(), buffer.getSize()); + Texture* cubemap = Ktx1Reader::createTexture(engine, *bundle, srgb, [](void* userdata) { + Ktx1Bundle* bundle = (Ktx1Bundle*) userdata; delete bundle; }, bundle); @@ -68,9 +69,9 @@ static jlong nCreateSkybox(JNIEnv* env, jclass, jlong nativeEngine, jobject javaBuffer, jint remaining, jboolean srgb) { Engine* engine = (Engine*) nativeEngine; AutoBuffer buffer(env, javaBuffer, remaining); - KtxBundle* bundle = new KtxBundle((const uint8_t*) buffer.getData(), buffer.getSize()); - Texture* cubemap = ktx::createTexture(engine, *bundle, srgb, [](void* userdata) { - KtxBundle* bundle = (KtxBundle*) userdata; + Ktx1Bundle* bundle = new Ktx1Bundle((const uint8_t*) buffer.getData(), buffer.getSize()); + Texture* cubemap = Ktx1Reader::createTexture(engine, *bundle, srgb, [](void* userdata) { + Ktx1Bundle* bundle = (Ktx1Bundle*) userdata; delete bundle; }, bundle); return (jlong) Skybox::Builder().environment(cubemap).showSun(true).build(*engine); @@ -79,7 +80,7 @@ static jlong nCreateSkybox(JNIEnv* env, jclass, static jboolean nGetSphericalHarmonics(JNIEnv* env, jclass, jobject javaBuffer, jint remaining, jfloatArray outSphericalHarmonics_) { AutoBuffer buffer(env, javaBuffer, remaining); - KtxBundle bundle((const uint8_t*) buffer.getData(), buffer.getSize()); + Ktx1Bundle bundle((const uint8_t*) buffer.getData(), buffer.getSize()); jfloat* outSphericalHarmonics = env->GetFloatArrayElements(outSphericalHarmonics_, nullptr); const auto success = bundle.getSphericalHarmonics( diff --git a/build/common/test_list.txt b/build/common/test_list.txt index 382927d75d..39a71c5f4f 100644 --- a/build/common/test_list.txt +++ b/build/common/test_list.txt @@ -11,3 +11,4 @@ tools/cmgen/test_cmgen compare tools/glslminifier/test_glslminifier libs/filameshio/test_filameshio libs/camutils/test_camutils +libs/ktxreader/test_ktxreader diff --git a/ios/samples/gltf-viewer/gltf-viewer/FILViewController.mm b/ios/samples/gltf-viewer/gltf-viewer/FILViewController.mm index 5ae108d847..0da5c269e8 100644 --- a/ios/samples/gltf-viewer/gltf-viewer/FILViewController.mm +++ b/ios/samples/gltf-viewer/gltf-viewer/FILViewController.mm @@ -25,13 +25,14 @@ #include -#include +#include #include #include using namespace filament; using namespace utils; +using namespace ktxreader; @interface FILViewController () @@ -169,10 +170,10 @@ using namespace utils; assert(skyboxPath.length > 0); NSData* skyboxBuffer = [NSData dataWithContentsOfFile:skyboxPath]; - image::KtxBundle* skyboxBundle = - new image::KtxBundle(static_cast(skyboxBuffer.bytes), + image::Ktx1Bundle* skyboxBundle = + new image::Ktx1Bundle(static_cast(skyboxBuffer.bytes), static_cast(skyboxBuffer.length)); - _skyboxTexture = image::ktx::createTexture(self.modelView.engine, skyboxBundle, false); + _skyboxTexture = Ktx1Reader::createTexture(self.modelView.engine, skyboxBundle, false); _skybox = filament::Skybox::Builder().environment(_skyboxTexture).build(*self.modelView.engine); self.modelView.scene->setSkybox(_skybox); @@ -181,11 +182,11 @@ using namespace utils; assert(iblPath.length > 0); NSData* iblBuffer = [NSData dataWithContentsOfFile:iblPath]; - image::KtxBundle* iblBundle = new image::KtxBundle( + image::Ktx1Bundle* iblBundle = new image::Ktx1Bundle( static_cast(iblBuffer.bytes), static_cast(iblBuffer.length)); math::float3 harmonics[9]; iblBundle->getSphericalHarmonics(harmonics); - _iblTexture = image::ktx::createTexture(self.modelView.engine, iblBundle, false); + _iblTexture = Ktx1Reader::createTexture(self.modelView.engine, iblBundle, false); _indirectLight = IndirectLight::Builder() .reflections(_iblTexture) .irradiance(3, harmonics) diff --git a/ios/samples/hello-ar/hello-ar/FilamentArView/FilamentApp.cpp b/ios/samples/hello-ar/hello-ar/FilamentArView/FilamentApp.cpp index 12d687b4c5..aa8038d965 100644 --- a/ios/samples/hello-ar/hello-ar/FilamentArView/FilamentApp.cpp +++ b/ios/samples/hello-ar/hello-ar/FilamentArView/FilamentApp.cpp @@ -26,7 +26,7 @@ #include #include -#include +#include #include @@ -35,6 +35,7 @@ #include "resources.h" using namespace filamesh; +using namespace ktxreader; static constexpr float OBJECT_SCALE = 0.02f; @@ -205,11 +206,11 @@ void FilamentApp::setupFilament() { } void FilamentApp::setupIbl() { - image::KtxBundle* iblBundle = new image::KtxBundle(RESOURCES_VENETIAN_CROSSROADS_2K_IBL_DATA, + image::Ktx1Bundle* iblBundle = new image::Ktx1Bundle(RESOURCES_VENETIAN_CROSSROADS_2K_IBL_DATA, RESOURCES_VENETIAN_CROSSROADS_2K_IBL_SIZE); float3 harmonics[9]; iblBundle->getSphericalHarmonics(harmonics); - app.iblTexture = image::ktx::createTexture(engine, iblBundle, false); + app.iblTexture = Ktx1Reader::createTexture(engine, iblBundle, false); app.indirectLight = IndirectLight::Builder() .reflections(app.iblTexture) diff --git a/ios/samples/hello-gltf/hello-gltf/FilamentView/App.cpp b/ios/samples/hello-gltf/hello-gltf/FilamentView/App.cpp index 5a636934fd..c28a068824 100644 --- a/ios/samples/hello-gltf/hello-gltf/FilamentView/App.cpp +++ b/ios/samples/hello-gltf/hello-gltf/FilamentView/App.cpp @@ -20,7 +20,7 @@ #include #include -#include +#include #include #include @@ -32,6 +32,8 @@ // textures this app uses. #include "resources.h" +using namespace ktxreader; + App::App(void* nativeLayer, uint32_t width, uint32_t height, const utils::Path& resourcePath) : nativeLayer(nativeLayer), width(width), height(height), resourcePath(resourcePath) { setupFilament(); @@ -89,15 +91,15 @@ void App::setupFilament() { } void App::setupIbl() { - image::KtxBundle* iblBundle = new image::KtxBundle(RESOURCES_VENETIAN_CROSSROADS_2K_IBL_DATA, + image::Ktx1Bundle* iblBundle = new image::Ktx1Bundle(RESOURCES_VENETIAN_CROSSROADS_2K_IBL_DATA, RESOURCES_VENETIAN_CROSSROADS_2K_IBL_SIZE); float3 harmonics[9]; iblBundle->getSphericalHarmonics(harmonics); - app.iblTexture = image::ktx::createTexture(engine, iblBundle, false); + app.iblTexture = Ktx1Reader::createTexture(engine, iblBundle, false); - image::KtxBundle* skyboxBundle = new image::KtxBundle(RESOURCES_VENETIAN_CROSSROADS_2K_SKYBOX_DATA, + image::Ktx1Bundle* skyboxBundle = new image::Ktx1Bundle(RESOURCES_VENETIAN_CROSSROADS_2K_SKYBOX_DATA, RESOURCES_VENETIAN_CROSSROADS_2K_SKYBOX_SIZE); - app.skyboxTexture = image::ktx::createTexture(engine, skyboxBundle, false); + app.skyboxTexture = Ktx1Reader::createTexture(engine, skyboxBundle, false); app.skybox = Skybox::Builder() .environment(app.skyboxTexture) diff --git a/ios/samples/hello-pbr/hello-pbr/FilamentApp.cpp b/ios/samples/hello-pbr/hello-pbr/FilamentApp.cpp index 56ed748716..0801065534 100644 --- a/ios/samples/hello-pbr/hello-pbr/FilamentApp.cpp +++ b/ios/samples/hello-pbr/hello-pbr/FilamentApp.cpp @@ -21,7 +21,7 @@ #include -#include +#include #include @@ -29,6 +29,8 @@ // textures this app uses. #include "resources.h" +using namespace ktxreader; + using namespace filament; using namespace filamesh; @@ -46,15 +48,15 @@ void FilamentApp::initialize() { filaView = engine->createView(); - image::KtxBundle* iblBundle = new image::KtxBundle(RESOURCES_VENETIAN_CROSSROADS_2K_IBL_DATA, + image::Ktx1Bundle* iblBundle = new image::Ktx1Bundle(RESOURCES_VENETIAN_CROSSROADS_2K_IBL_DATA, RESOURCES_VENETIAN_CROSSROADS_2K_IBL_SIZE); filament::math::float3 harmonics[9]; iblBundle->getSphericalHarmonics(harmonics); - app.iblTexture = image::ktx::createTexture(engine, iblBundle, false); + app.iblTexture = Ktx1Reader::createTexture(engine, iblBundle, false); - image::KtxBundle* skyboxBundle = new image::KtxBundle(RESOURCES_VENETIAN_CROSSROADS_2K_SKYBOX_DATA, + image::Ktx1Bundle* skyboxBundle = new image::Ktx1Bundle(RESOURCES_VENETIAN_CROSSROADS_2K_SKYBOX_DATA, RESOURCES_VENETIAN_CROSSROADS_2K_SKYBOX_SIZE); - app.skyboxTexture = image::ktx::createTexture(engine, skyboxBundle, false); + app.skyboxTexture = Ktx1Reader::createTexture(engine, skyboxBundle, false); app.skybox = Skybox::Builder() .environment(app.skyboxTexture) diff --git a/libs/filamentapp/CMakeLists.txt b/libs/filamentapp/CMakeLists.txt index 0c2266328a..7414278ce9 100644 --- a/libs/filamentapp/CMakeLists.txt +++ b/libs/filamentapp/CMakeLists.txt @@ -40,19 +40,20 @@ set(SRCS set(LIBS assimp + camutils + filagui + filamat filament filament-iblprefilter + geometry + getopt + image + imgui + ktxreader + math sdl2 stb - math - filamat utils - getopt - imgui - filagui - image - camutils - geometry ) set(MATERIAL_SRCS diff --git a/libs/filamentapp/src/IBL.cpp b/libs/filamentapp/src/IBL.cpp index 8b90ed6951..0b413c5af6 100644 --- a/libs/filamentapp/src/IBL.cpp +++ b/libs/filamentapp/src/IBL.cpp @@ -23,8 +23,7 @@ #include #include -#include -#include +#include #include @@ -39,8 +38,8 @@ #include using namespace filament; -using namespace image; using namespace filament::math; +using namespace ktxreader; using namespace utils; static constexpr float IBL_INTENSITY = 30000.0f; @@ -128,14 +127,14 @@ bool IBL::loadFromKtx(const std::string& prefix) { using namespace std; ifstream file(path.getPath(), ios::binary); vector contents((istreambuf_iterator(file)), {}); - return new image::KtxBundle(contents.data(), contents.size()); + return new image::Ktx1Bundle(contents.data(), contents.size()); }; - KtxBundle* iblKtx = createKtx(iblPath); - KtxBundle* skyKtx = createKtx(skyPath); + Ktx1Bundle* iblKtx = createKtx(iblPath); + Ktx1Bundle* skyKtx = createKtx(skyPath); - mSkyboxTexture = ktx::createTexture(&mEngine, skyKtx, false); - mTexture = ktx::createTexture(&mEngine, iblKtx, false); + mSkyboxTexture = Ktx1Reader::createTexture(&mEngine, skyKtx, false); + mTexture = Ktx1Reader::createTexture(&mEngine, iblKtx, false); if (!iblKtx->getSphericalHarmonics(mBands)) { return false; diff --git a/libs/image/CMakeLists.txt b/libs/image/CMakeLists.txt index 98394e36b9..e4bf2882c4 100644 --- a/libs/image/CMakeLists.txt +++ b/libs/image/CMakeLists.txt @@ -11,15 +11,14 @@ set(PUBLIC_HDRS include/image/ColorTransform.h include/image/ImageOps.h include/image/ImageSampler.h - include/image/KtxBundle.h - include/image/KtxUtility.h + include/image/Ktx1Bundle.h include/image/LinearImage.h ) set(SRCS src/ImageOps.cpp src/ImageSampler.cpp - src/KtxBundle.cpp + src/Ktx1Bundle.cpp src/LinearImage.cpp ) @@ -44,12 +43,6 @@ else() target_compile_options(${TARGET} PRIVATE -Wno-deprecated-register) endif() -# ================================================================================================== -# Expose header-only utilities to lean-and-mean client projects. -# ================================================================================================== -add_library(image_headers INTERFACE) -target_include_directories(image_headers INTERFACE ${PUBLIC_HDR_DIR}) - # ================================================================================================== # Installation # ================================================================================================== diff --git a/libs/image/include/image/KtxBundle.h b/libs/image/include/image/Ktx1Bundle.h similarity index 96% rename from libs/image/include/image/KtxBundle.h rename to libs/image/include/image/Ktx1Bundle.h index 3975a6441d..d408dc7c24 100644 --- a/libs/image/include/image/KtxBundle.h +++ b/libs/image/include/image/Ktx1Bundle.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef IMAGE_KTXBUNDLE_H -#define IMAGE_KTXBUNDLE_H +#ifndef IMAGE_KTX1BUNDLE_H +#define IMAGE_KTX1BUNDLE_H #include @@ -48,7 +48,7 @@ struct KtxBlobList; struct KtxMetadata; /** - * KtxBundle is a structured set of opaque data blobs that can be passed straight to the GPU, such + * Ktx1Bundle is a structured set of opaque data blobs that can be passed straight to the GPU, such * that a single bundle corresponds to a single texture object. It is well suited for storing * block-compressed texture data. * @@ -63,22 +63,22 @@ struct KtxMetadata; * * https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/ */ -class UTILS_PUBLIC KtxBundle { +class UTILS_PUBLIC Ktx1Bundle { public: - ~KtxBundle(); + ~Ktx1Bundle(); /** * Creates a hierarchy of empty texture blobs, to be filled later via setBlob(). */ - KtxBundle(uint32_t numMipLevels, uint32_t arrayLength, bool isCubemap); + Ktx1Bundle(uint32_t numMipLevels, uint32_t arrayLength, bool isCubemap); /** * Creates a new bundle by deserializing the given data. * * Typically, this constructor is used to consume the contents of a KTX file. */ - KtxBundle(uint8_t const* bytes, uint32_t nbytes); + Ktx1Bundle(uint8_t const* bytes, uint32_t nbytes); /** * Serializes the bundle into the given target memory. Returns false if there's not enough @@ -276,4 +276,4 @@ private: } // namespace image -#endif /* IMAGE_KTXBUNDLE_H */ +#endif /* IMAGE_Ktx1Bundle_H */ diff --git a/libs/image/include/image/KtxUtility.h b/libs/image/include/image/KtxUtility.h deleted file mode 100644 index 7ff4d89f81..0000000000 --- a/libs/image/include/image/KtxUtility.h +++ /dev/null @@ -1,367 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef IMAGE_KTXUTILITY_H -#define IMAGE_KTXUTILITY_H - -#include -#include - -#include - -namespace image { - -/** - * Allows clients to create Filament textures from KtxBundle objects. - * - * Note that libimage does not have a dependency on libfilament, so for simplicity this is a - * header-only library with inlined functions. - */ -namespace ktx { - - using Texture = filament::Texture; - using Engine = filament::Engine; - - using TextureFormat = Texture::InternalFormat; - using CompressedPixelDataType = Texture::CompressedType; - using PixelDataType = Texture::Type; - using PixelDataFormat = Texture::Format; - using PixelBufferDescriptor = Texture::PixelBufferDescriptor; - - using Callback = void(*)(void* userdata); - - CompressedPixelDataType toCompressedPixelDataType(const KtxInfo& info); - PixelDataType toPixelDataType(const KtxInfo& info); - PixelDataFormat toPixelDataFormat(const KtxInfo& info); - bool isCompressed(const KtxInfo& info); - TextureFormat toTextureFormat(const KtxInfo& info); - TextureFormat toSrgbTextureFormat(TextureFormat tex); - - /** - * Creates a Texture object from a KTX file and populates all of its faces and miplevels. - * - * @param engine Used to create the Filament Texture - * @param ktx In-memory representation of a KTX file - * @param srgb Forces the KTX-specified format into an SRGB format if possible - * @param callback Gets called after all texture data has been uploaded to the GPU - * @param userdata Passed into the callback - */ - inline Texture* createTexture(Engine* engine, const KtxBundle& ktx, bool srgb, - Callback callback, void* userdata) { - using Sampler = Texture::Sampler; - const auto& ktxinfo = ktx.getInfo(); - const uint32_t nmips = ktx.getNumMipLevels(); - const auto cdatatype = toCompressedPixelDataType(ktxinfo); - const auto datatype = toPixelDataType(ktxinfo); - const auto dataformat = toPixelDataFormat(ktxinfo); - - auto texformat = toTextureFormat(ktxinfo); - if (srgb) { - texformat = toSrgbTextureFormat(texformat); - } - - Texture* texture = Texture::Builder() - .width(ktxinfo.pixelWidth) - .height(ktxinfo.pixelHeight) - .levels(static_cast(nmips)) - .sampler(ktx.isCubemap() ? Sampler::SAMPLER_CUBEMAP : Sampler::SAMPLER_2D) - .format(texformat) - .build(*engine); - - struct Userdata { - uint32_t remainingBuffers; - Callback callback; - void* userdata; - }; - - Userdata* cbuser = new Userdata({nmips, callback, userdata}); - - PixelBufferDescriptor::Callback cb = [](void*, size_t, void* cbuserptr) { - Userdata* cbuser = (Userdata*) cbuserptr; - if (--cbuser->remainingBuffers == 0) { - if (cbuser->callback) { - cbuser->callback(cbuser->userdata); - } - delete cbuser; - } - }; - - uint8_t* data; - uint32_t size; - - if (isCompressed(ktxinfo)) { - if (ktx.isCubemap()) { - for (uint32_t level = 0; level < nmips; ++level) { - ktx.getBlob({level, 0, 0}, &data, &size); - PixelBufferDescriptor pbd(data, size * 6, cdatatype, size, cb, cbuser); - texture->setImage(*engine, level, std::move(pbd), Texture::FaceOffsets(size)); - } - return texture; - } - for (uint32_t level = 0; level < nmips; ++level) { - ktx.getBlob({level, 0, 0}, &data, &size); - PixelBufferDescriptor pbd(data, size, cdatatype, size, cb, cbuser); - texture->setImage(*engine, level, std::move(pbd)); - } - return texture; - } - - if (ktx.isCubemap()) { - for (uint32_t level = 0; level < nmips; ++level) { - ktx.getBlob({level, 0, 0}, &data, &size); - PixelBufferDescriptor pbd(data, size * 6, dataformat, datatype, cb, cbuser); - texture->setImage(*engine, level, std::move(pbd), Texture::FaceOffsets(size)); - } - return texture; - } - - for (uint32_t level = 0; level < nmips; ++level) { - ktx.getBlob({level, 0, 0}, &data, &size); - PixelBufferDescriptor pbd(data, size, dataformat, datatype, cb, cbuser); - texture->setImage(*engine, level, std::move(pbd)); - } - return texture; - } - - /** - * Creates a Texture object from a KTX bundle, populates all of its faces and miplevels, - * and automatically destroys the bundle after all the texture data has been uploaded. - * - * @param engine Used to create the Filament Texture - * @param ktx In-memory representation of a KTX file - * @param srgb Forces the KTX-specified format into an SRGB format if possible - */ - inline Texture* createTexture(Engine* engine, KtxBundle* ktx, bool srgb) { - auto freeKtx = [] (void* userdata) { - KtxBundle* ktx = (KtxBundle*) userdata; - delete ktx; - }; - return createTexture(engine, *ktx, srgb, freeKtx, ktx); - } - - template - T toCompressedFilamentEnum(uint32_t format) { - switch (format) { - case KtxBundle::RGB_S3TC_DXT1: return T::DXT1_RGB; - case KtxBundle::RGBA_S3TC_DXT1: return T::DXT1_RGBA; - case KtxBundle::RGBA_S3TC_DXT3: return T::DXT3_RGBA; - case KtxBundle::RGBA_S3TC_DXT5: return T::DXT5_RGBA; - case KtxBundle::RGBA_ASTC_4x4: return T::RGBA_ASTC_4x4; - case KtxBundle::RGBA_ASTC_5x4: return T::RGBA_ASTC_5x4; - case KtxBundle::RGBA_ASTC_5x5: return T::RGBA_ASTC_5x5; - case KtxBundle::RGBA_ASTC_6x5: return T::RGBA_ASTC_6x5; - case KtxBundle::RGBA_ASTC_6x6: return T::RGBA_ASTC_6x6; - case KtxBundle::RGBA_ASTC_8x5: return T::RGBA_ASTC_8x5; - case KtxBundle::RGBA_ASTC_8x6: return T::RGBA_ASTC_8x6; - case KtxBundle::RGBA_ASTC_8x8: return T::RGBA_ASTC_8x8; - case KtxBundle::RGBA_ASTC_10x5: return T::RGBA_ASTC_10x5; - case KtxBundle::RGBA_ASTC_10x6: return T::RGBA_ASTC_10x6; - case KtxBundle::RGBA_ASTC_10x8: return T::RGBA_ASTC_10x8; - case KtxBundle::RGBA_ASTC_10x10: return T::RGBA_ASTC_10x10; - case KtxBundle::RGBA_ASTC_12x10: return T::RGBA_ASTC_12x10; - case KtxBundle::RGBA_ASTC_12x12: return T::RGBA_ASTC_12x12; - case KtxBundle::SRGB8_ALPHA8_ASTC_4x4: return T::SRGB8_ALPHA8_ASTC_4x4; - case KtxBundle::SRGB8_ALPHA8_ASTC_5x4: return T::SRGB8_ALPHA8_ASTC_5x4; - case KtxBundle::SRGB8_ALPHA8_ASTC_5x5: return T::SRGB8_ALPHA8_ASTC_5x5; - case KtxBundle::SRGB8_ALPHA8_ASTC_6x5: return T::SRGB8_ALPHA8_ASTC_6x5; - case KtxBundle::SRGB8_ALPHA8_ASTC_6x6: return T::SRGB8_ALPHA8_ASTC_6x6; - case KtxBundle::SRGB8_ALPHA8_ASTC_8x5: return T::SRGB8_ALPHA8_ASTC_8x5; - case KtxBundle::SRGB8_ALPHA8_ASTC_8x6: return T::SRGB8_ALPHA8_ASTC_8x6; - case KtxBundle::SRGB8_ALPHA8_ASTC_8x8: return T::SRGB8_ALPHA8_ASTC_8x8; - case KtxBundle::SRGB8_ALPHA8_ASTC_10x5: return T::SRGB8_ALPHA8_ASTC_10x5; - case KtxBundle::SRGB8_ALPHA8_ASTC_10x6: return T::SRGB8_ALPHA8_ASTC_10x6; - case KtxBundle::SRGB8_ALPHA8_ASTC_10x8: return T::SRGB8_ALPHA8_ASTC_10x8; - case KtxBundle::SRGB8_ALPHA8_ASTC_10x10: return T::SRGB8_ALPHA8_ASTC_10x10; - case KtxBundle::SRGB8_ALPHA8_ASTC_12x10: return T::SRGB8_ALPHA8_ASTC_12x10; - case KtxBundle::SRGB8_ALPHA8_ASTC_12x12: return T::SRGB8_ALPHA8_ASTC_12x12; - case KtxBundle::R11_EAC: return T::EAC_R11; - case KtxBundle::SIGNED_R11_EAC: return T::EAC_R11_SIGNED; - case KtxBundle::RG11_EAC: return T::EAC_RG11; - case KtxBundle::SIGNED_RG11_EAC: return T::EAC_RG11_SIGNED; - case KtxBundle::RGB8_ETC2: return T::ETC2_RGB8; - case KtxBundle::SRGB8_ETC2: return T::ETC2_SRGB8; - case KtxBundle::RGB8_ALPHA1_ETC2: return T::ETC2_RGB8_A1; - case KtxBundle::SRGB8_ALPHA1_ETC: return T::ETC2_SRGB8_A1; - case KtxBundle::RGBA8_ETC2_EAC: return T::ETC2_EAC_RGBA8; - case KtxBundle::SRGB8_ALPHA8_ETC2_EAC: return T::ETC2_EAC_SRGBA8; - } - return (T) 0xffff; - } - - inline CompressedPixelDataType toCompressedPixelDataType(const KtxInfo& info) { - return toCompressedFilamentEnum(info.glInternalFormat); - } - - inline PixelDataType toPixelDataType(const KtxInfo& info) { - switch (info.glType) { - case KtxBundle::UNSIGNED_BYTE: return PixelDataType::UBYTE; - case KtxBundle::UNSIGNED_SHORT: return PixelDataType::USHORT; - case KtxBundle::HALF_FLOAT: return PixelDataType::HALF; - case KtxBundle::FLOAT: return PixelDataType::FLOAT; - case KtxBundle::R11F_G11F_B10F: return PixelDataType::UINT_10F_11F_11F_REV; - } - return (PixelDataType) 0xff; - } - - inline PixelDataFormat toPixelDataFormat(const KtxInfo& info) { - switch (info.glFormat) { - case KtxBundle::LUMINANCE: - case KtxBundle::RED: return PixelDataFormat::R; - case KtxBundle::RG: return PixelDataFormat::RG; - case KtxBundle::RGB: return PixelDataFormat::RGB; - case KtxBundle::RGBA: return PixelDataFormat::RGBA; - // glFormat should NOT be a sized format according to the spec - // however cmgen was generating incorrect files until after Filament 1.8.0 - // so we keep this line here to preserve compatibility with older assets - case KtxBundle::R11F_G11F_B10F: return PixelDataFormat::RGB; - } - return (PixelDataFormat) 0xff; - } - - inline bool isCompressed(const KtxInfo& info) { - return info.glFormat == 0; - } - - inline TextureFormat toSrgbTextureFormat(TextureFormat format) { - switch(format) { - // Non-compressed - case Texture::InternalFormat::RGB8: - return Texture::InternalFormat::SRGB8; - case Texture::InternalFormat::RGBA8: - return Texture::InternalFormat::SRGB8_A8; - - // ASTC - case Texture::InternalFormat::RGBA_ASTC_4x4: - return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_4x4; - case Texture::InternalFormat::RGBA_ASTC_5x4: - return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_5x4; - case Texture::InternalFormat::RGBA_ASTC_5x5: - return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_5x5; - case Texture::InternalFormat::RGBA_ASTC_6x5: - return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_6x5; - case Texture::InternalFormat::RGBA_ASTC_6x6: - return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_6x6; - case Texture::InternalFormat::RGBA_ASTC_8x5: - return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_8x5; - case Texture::InternalFormat::RGBA_ASTC_8x6: - return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_8x6; - case Texture::InternalFormat::RGBA_ASTC_8x8: - return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_8x8; - case Texture::InternalFormat::RGBA_ASTC_10x5: - return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_10x5; - case Texture::InternalFormat::RGBA_ASTC_10x6: - return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_10x6; - case Texture::InternalFormat::RGBA_ASTC_10x8: - return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_10x8; - case Texture::InternalFormat::RGBA_ASTC_10x10: - return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_10x10; - case Texture::InternalFormat::RGBA_ASTC_12x10: - return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_12x10; - case Texture::InternalFormat::RGBA_ASTC_12x12: - return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_12x12; - - // ETC2 - case Texture::InternalFormat::ETC2_RGB8: - return Texture::InternalFormat::ETC2_SRGB8; - case Texture::InternalFormat::ETC2_RGB8_A1: - return Texture::InternalFormat::ETC2_SRGB8_A1; - case Texture::InternalFormat::ETC2_EAC_RGBA8: - return Texture::InternalFormat::ETC2_EAC_SRGBA8; - - // DXT - case Texture::InternalFormat::DXT1_RGB: - return Texture::InternalFormat::DXT1_SRGB; - case Texture::InternalFormat::DXT1_RGBA: - return Texture::InternalFormat::DXT1_SRGBA; - case Texture::InternalFormat::DXT3_RGBA: - return Texture::InternalFormat::DXT3_SRGBA; - case Texture::InternalFormat::DXT5_RGBA: - return Texture::InternalFormat::DXT5_SRGBA; - - default: - return format; - } - } - - inline TextureFormat toTextureFormat(const KtxInfo& info) { - switch (info.glInternalFormat) { - case KtxBundle::RED: return TextureFormat::R8; - case KtxBundle::RG: return TextureFormat::RG8; - case KtxBundle::RGB: return TextureFormat::RGB8; - case KtxBundle::RGBA: return TextureFormat::RGBA8; - case KtxBundle::LUMINANCE: return TextureFormat::R8; - case KtxBundle::LUMINANCE_ALPHA: return TextureFormat::RG8; - case KtxBundle::R8: return TextureFormat::R8; - case KtxBundle::R8_SNORM: return TextureFormat::R8_SNORM; - case KtxBundle::R8UI: return TextureFormat::R8UI; - case KtxBundle::R8I: return TextureFormat::R8I; - case KtxBundle::STENCIL_INDEX8: return TextureFormat::STENCIL8; - case KtxBundle::R16F: return TextureFormat::R16F; - case KtxBundle::R16UI: return TextureFormat::R16UI; - case KtxBundle::R16I: return TextureFormat::R16I; - case KtxBundle::RG8: return TextureFormat::RG8; - case KtxBundle::RG8_SNORM: return TextureFormat::RG8_SNORM; - case KtxBundle::RG8UI: return TextureFormat::RG8UI; - case KtxBundle::RG8I: return TextureFormat::RG8I; - case KtxBundle::RGB565: return TextureFormat::RGB565; - case KtxBundle::RGB9_E5: return TextureFormat::RGB9_E5; - case KtxBundle::RGB5_A1: return TextureFormat::RGB5_A1; - case KtxBundle::RGBA4: return TextureFormat::RGBA4; - case KtxBundle::DEPTH_COMPONENT16: return TextureFormat::DEPTH16; - case KtxBundle::RGB8: return TextureFormat::RGB8; - case KtxBundle::SRGB8: return TextureFormat::SRGB8; - case KtxBundle::RGB8_SNORM: return TextureFormat::RGB8_SNORM; - case KtxBundle::RGB8UI: return TextureFormat::RGB8UI; - case KtxBundle::RGB8I: return TextureFormat::RGB8I; - case KtxBundle::R32F: return TextureFormat::R32F; - case KtxBundle::R32UI: return TextureFormat::R32UI; - case KtxBundle::R32I: return TextureFormat::R32I; - case KtxBundle::RG16F: return TextureFormat::RG16F; - case KtxBundle::RG16UI: return TextureFormat::RG16UI; - case KtxBundle::RG16I: return TextureFormat::RG16I; - case KtxBundle::R11F_G11F_B10F: return TextureFormat::R11F_G11F_B10F; - case KtxBundle::RGBA8: return TextureFormat::RGBA8; - case KtxBundle::SRGB8_ALPHA8: return TextureFormat::SRGB8_A8; - case KtxBundle::RGBA8_SNORM: return TextureFormat::RGBA8_SNORM; - case KtxBundle::RGB10_A2: return TextureFormat::RGB10_A2; - case KtxBundle::RGBA8UI: return TextureFormat::RGBA8UI; - case KtxBundle::RGBA8I: return TextureFormat::RGBA8I; - case KtxBundle::DEPTH24_STENCIL8: return TextureFormat::DEPTH24_STENCIL8; - case KtxBundle::DEPTH32F_STENCIL8: return TextureFormat::DEPTH32F_STENCIL8; - case KtxBundle::RGB16F: return TextureFormat::RGB16F; - case KtxBundle::RGB16UI: return TextureFormat::RGB16UI; - case KtxBundle::RGB16I: return TextureFormat::RGB16I; - case KtxBundle::RG32F: return TextureFormat::RG32F; - case KtxBundle::RG32UI: return TextureFormat::RG32UI; - case KtxBundle::RG32I: return TextureFormat::RG32I; - case KtxBundle::RGBA16F: return TextureFormat::RGBA16F; - case KtxBundle::RGBA16UI: return TextureFormat::RGBA16UI; - case KtxBundle::RGBA16I: return TextureFormat::RGBA16I; - case KtxBundle::RGB32F: return TextureFormat::RGB32F; - case KtxBundle::RGB32UI: return TextureFormat::RGB32UI; - case KtxBundle::RGB32I: return TextureFormat::RGB32I; - case KtxBundle::RGBA32F: return TextureFormat::RGBA32F; - case KtxBundle::RGBA32UI: return TextureFormat::RGBA32UI; - case KtxBundle::RGBA32I: return TextureFormat::RGBA32I; - } - return toCompressedFilamentEnum(info.glInternalFormat); - } - -} // namespace ktx - -} // namespace image - -#endif diff --git a/libs/image/src/KtxBundle.cpp b/libs/image/src/Ktx1Bundle.cpp similarity index 92% rename from libs/image/src/KtxBundle.cpp rename to libs/image/src/Ktx1Bundle.cpp index 78238fb001..ab7f01ca5b 100644 --- a/libs/image/src/KtxBundle.cpp +++ b/libs/image/src/Ktx1Bundle.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include +#include #include #include @@ -37,7 +37,7 @@ struct SerializationHeader { static_assert(sizeof(SerializationHeader) == 16 * 4, "Unexpected header size."); // We flatten the three-dimensional blob index using the ordering defined by the KTX spec. -inline size_t flatten(const image::KtxBundle* bundle, image::KtxBlobIndex index) { +inline size_t flatten(const image::Ktx1Bundle* bundle, image::KtxBlobIndex index) { const uint32_t nfaces = bundle->isCubemap() ? 6 : 1; const uint32_t nlayers = bundle->getArrayLength(); return index.cubeFace + index.arrayIndex * nfaces + index.mipLevel * nfaces * nlayers; @@ -97,9 +97,9 @@ struct KtxBlobList { } }; -KtxBundle::~KtxBundle() = default; +Ktx1Bundle::~Ktx1Bundle() = default; -KtxBundle::KtxBundle(uint32_t numMipLevels, uint32_t arrayLength, bool isCubemap) : +Ktx1Bundle::Ktx1Bundle(uint32_t numMipLevels, uint32_t arrayLength, bool isCubemap) : mBlobs(new KtxBlobList), mMetadata(new KtxMetadata) { mNumMipLevels = numMipLevels; mArrayLength = arrayLength; @@ -107,7 +107,7 @@ KtxBundle::KtxBundle(uint32_t numMipLevels, uint32_t arrayLength, bool isCubemap mBlobs->sizes.resize(numMipLevels * arrayLength * mNumCubeFaces); } -KtxBundle::KtxBundle(uint8_t const* bytes, uint32_t nbytes) : +Ktx1Bundle::Ktx1Bundle(uint8_t const* bytes, uint32_t nbytes) : mBlobs(new KtxBlobList), mMetadata(new KtxMetadata) { ASSERT_PRECONDITION(sizeof(SerializationHeader) <= nbytes, "KTX buffer is too small"); @@ -170,7 +170,7 @@ KtxBundle::KtxBundle(uint8_t const* bytes, uint32_t nbytes) : } } -bool KtxBundle::serialize(uint8_t* destination, uint32_t numBytes) const { +bool Ktx1Bundle::serialize(uint8_t* destination, uint32_t numBytes) const { uint32_t requiredLength = getSerializedLength(); if (numBytes < requiredLength) { return false; @@ -184,7 +184,7 @@ bool KtxBundle::serialize(uint8_t* destination, uint32_t numBytes) const { header.numberOfArrayElements = mArrayLength; header.numberOfFaces = mNumCubeFaces; - // For simplicity, KtxBundle does not allow non-zero array length, but to be conformant we + // For simplicity, Ktx1Bundle does not allow non-zero array length, but to be conformant we // should set this field to zero for non-array textures. if (mArrayLength == 1) { header.numberOfArrayElements = 0; @@ -247,7 +247,7 @@ bool KtxBundle::serialize(uint8_t* destination, uint32_t numBytes) const { return true; } -uint32_t KtxBundle::getSerializedLength() const { +uint32_t Ktx1Bundle::getSerializedLength() const { uint32_t total = sizeof(SerializationHeader); for (const auto& iter : mMetadata->keyvals) { const uint32_t kvsize = iter.first.size() + 1 + iter.second.size(); @@ -271,7 +271,7 @@ uint32_t KtxBundle::getSerializedLength() const { return total; } -const char* KtxBundle::getMetadata(const char* key, size_t* valueSize) const { +const char* Ktx1Bundle::getMetadata(const char* key, size_t* valueSize) const { auto iter = mMetadata->keyvals.find(key); if (iter == mMetadata->keyvals.end()) { return nullptr; @@ -283,11 +283,11 @@ const char* KtxBundle::getMetadata(const char* key, size_t* valueSize) const { return iter->second.data(); } -void KtxBundle::setMetadata(const char* key, const char* value) { +void Ktx1Bundle::setMetadata(const char* key, const char* value) { mMetadata->keyvals.insert({key, value}); } -bool KtxBundle::getSphericalHarmonics(filament::math::float3* result) { +bool Ktx1Bundle::getSphericalHarmonics(filament::math::float3* result) { char const* src = getMetadata("sh"); if (!src) { return false; @@ -305,7 +305,7 @@ bool KtxBundle::getSphericalHarmonics(filament::math::float3* result) { return true; } -bool KtxBundle::getBlob(KtxBlobIndex index, uint8_t** data, uint32_t* size) const { +bool Ktx1Bundle::getBlob(KtxBlobIndex index, uint8_t** data, uint32_t* size) const { if (index.mipLevel >= mNumMipLevels || index.arrayIndex >= mArrayLength || index.cubeFace >= mNumCubeFaces) { return false; @@ -320,7 +320,7 @@ bool KtxBundle::getBlob(KtxBlobIndex index, uint8_t** data, uint32_t* size) cons return true; } -bool KtxBundle::setBlob(KtxBlobIndex index, uint8_t const* data, uint32_t size) { +bool Ktx1Bundle::setBlob(KtxBlobIndex index, uint8_t const* data, uint32_t size) { if (index.mipLevel >= mNumMipLevels || index.arrayIndex >= mArrayLength || index.cubeFace >= mNumCubeFaces) { return false; @@ -334,7 +334,7 @@ bool KtxBundle::setBlob(KtxBlobIndex index, uint8_t const* data, uint32_t size) return true; } -bool KtxBundle::allocateBlob(KtxBlobIndex index, uint32_t size) { +bool Ktx1Bundle::allocateBlob(KtxBlobIndex index, uint32_t size) { if (index.mipLevel >= mNumMipLevels || index.arrayIndex >= mArrayLength || index.cubeFace >= mNumCubeFaces) { return false; diff --git a/libs/image/tests/test_image.cpp b/libs/image/tests/test_image.cpp index 963515a414..a0594a17e7 100644 --- a/libs/image/tests/test_image.cpp +++ b/libs/image/tests/test_image.cpp @@ -15,7 +15,7 @@ */ #include -#include +#include #include #include #include @@ -366,7 +366,7 @@ TEST_F(ImageTest, Ktx) { // NOLINT uint8_t foo[] = {1, 2, 3}; uint8_t* data; uint32_t size; - KtxBundle nascent(2, 1, true); + Ktx1Bundle nascent(2, 1, true); ASSERT_EQ(nascent.getNumMipLevels(), 2); ASSERT_EQ(nascent.getArrayLength(), 1); ASSERT_TRUE(nascent.isCubemap()); @@ -390,7 +390,7 @@ TEST_F(ImageTest, Ktx) { // NOLINT vector buffer(fileSize); std::ifstream in(path, std::ifstream::in | std::ifstream::binary); ASSERT_TRUE(in.read((char*) buffer.data(), fileSize)); - KtxBundle deserialized(buffer.data(), buffer.size()); + Ktx1Bundle deserialized(buffer.data(), buffer.size()); ASSERT_EQ(deserialized.getNumMipLevels(), 1); ASSERT_EQ(deserialized.getArrayLength(), 1); @@ -421,14 +421,14 @@ TEST_F(ImageTest, Ktx) { // NOLINT reserialized.resize(serializedSize); ASSERT_TRUE(deserialized.serialize(reserialized.data(), serializedSize)); - KtxBundle bundleWithMetadata(reserialized.data(), reserialized.size()); + Ktx1Bundle bundleWithMetadata(reserialized.data(), reserialized.size()); val = string(bundleWithMetadata.getMetadata("foo")); ASSERT_EQ(val, "bar"); } } TEST_F(ImageTest, getSphericalHarmonics) { - KtxBundle ktx(2, 1, true); + Ktx1Bundle ktx(2, 1, true); const char* sphereHarmonics = R"(0.199599 0.197587 0.208682 0.0894955 0.126985 0.187462 diff --git a/libs/ktxreader/CMakeLists.txt b/libs/ktxreader/CMakeLists.txt new file mode 100644 index 0000000000..6036c90a12 --- /dev/null +++ b/libs/ktxreader/CMakeLists.txt @@ -0,0 +1,65 @@ +cmake_minimum_required(VERSION 3.19) +project(ktxreader) + +set(TARGET ktxreader) +set(PUBLIC_HDR_DIR include) + +# ================================================================================================== +# Sources and headers +# ================================================================================================== +set(PUBLIC_HDRS + include/ktxreader/Ktx1Reader.h +) + +set(SRCS + src/Ktx1Reader.cpp +) + +# ================================================================================================== +# Include and target definitions +# ================================================================================================== +include_directories(${PUBLIC_HDR_DIR}) + +add_library(${TARGET} STATIC ${PUBLIC_HDRS} ${SRCS}) + +target_link_libraries(${TARGET} PUBLIC utils image filament) + +target_include_directories(${TARGET} PUBLIC ${PUBLIC_HDR_DIR}) + +# ================================================================================================== +# Compiler flags +# ================================================================================================== +if (MSVC) + target_compile_options(${TARGET} PRIVATE $<$:/fp:fast>) +else() + target_compile_options(${TARGET} PRIVATE $<$:-ffast-math>) + target_compile_options(${TARGET} PRIVATE -Wno-deprecated-register) +endif() + +# ================================================================================================== +# Installation +# ================================================================================================== +install(TARGETS ${TARGET} ARCHIVE DESTINATION lib/${DIST_DIR}) +install(DIRECTORY ${PUBLIC_HDR_DIR}/${TARGET} DESTINATION include) + +# ================================================================================================== +# Tests +# ================================================================================================== + +function(add_testfile filename) + set(source_path "${CMAKE_CURRENT_SOURCE_DIR}/tests/${filename}") + set(target_path "${PROJECT_BINARY_DIR}/${filename}") + set(TESTFILES ${TESTFILES} ${target_path} PARENT_SCOPE) + add_custom_command( + OUTPUT ${target_path} + COMMAND ${CMAKE_COMMAND} -E copy ${source_path} ${target_path} + MAIN_DEPENDENCY ${source_path}) +endfunction() + +add_testfile(color_grid_uastc_zstd.ktx2) +add_testfile(lightroom_ibl.ktx) + +if (NOT ANDROID AND NOT WEBGL AND NOT IOS) + add_executable(test_ktxreader tests/test_ktxreader.cpp ${TESTFILES}) + target_link_libraries(test_ktxreader PRIVATE ${TARGET} gtest) +endif() diff --git a/libs/ktxreader/include/ktxreader/Ktx1Reader.h b/libs/ktxreader/include/ktxreader/Ktx1Reader.h new file mode 100644 index 0000000000..6cff1579f4 --- /dev/null +++ b/libs/ktxreader/include/ktxreader/Ktx1Reader.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef IMAGE_KTXUTILITY_H +#define IMAGE_KTXUTILITY_H + +#include +#include + +#include + +namespace ktxreader { + +using KtxInfo = image::KtxInfo; +using Ktx1Bundle = image::Ktx1Bundle; + +/** + * Allows clients to create Filament textures from Ktx1Bundle objects. + */ +namespace Ktx1Reader { + + using Texture = filament::Texture; + using Engine = filament::Engine; + + using TextureFormat = Texture::InternalFormat; + using CompressedPixelDataType = Texture::CompressedType; + using PixelDataType = Texture::Type; + using PixelDataFormat = Texture::Format; + using PixelBufferDescriptor = Texture::PixelBufferDescriptor; + + using Callback = void(*)(void* userdata); + + CompressedPixelDataType toCompressedPixelDataType(const KtxInfo& info); + PixelDataType toPixelDataType(const KtxInfo& info); + PixelDataFormat toPixelDataFormat(const KtxInfo& info); + bool isCompressed(const KtxInfo& info); + TextureFormat toTextureFormat(const KtxInfo& info); + TextureFormat toSrgbTextureFormat(TextureFormat tex); + + /** + * Creates a Texture object from a KTX file and populates all of its faces and miplevels. + * + * @param engine Used to create the Filament Texture + * @param ktx In-memory representation of a KTX file + * @param srgb Forces the KTX-specified format into an SRGB format if possible + * @param callback Gets called after all texture data has been uploaded to the GPU + * @param userdata Passed into the callback + */ + Texture* createTexture(Engine* engine, const Ktx1Bundle& ktx, bool srgb, + Callback callback, void* userdata); + + /** + * Creates a Texture object from a KTX bundle, populates all of its faces and miplevels, + * and automatically destroys the bundle after all the texture data has been uploaded. + * + * @param engine Used to create the Filament Texture + * @param ktx In-memory representation of a KTX file + * @param srgb Forces the KTX-specified format into an SRGB format if possible + */ + Texture* createTexture(Engine* engine, Ktx1Bundle* ktx, bool srgb); + + CompressedPixelDataType toCompressedPixelDataType(const KtxInfo& info); + + PixelDataType toPixelDataType(const KtxInfo& info); + + PixelDataFormat toPixelDataFormat(const KtxInfo& info); + + bool isCompressed(const KtxInfo& info); + + TextureFormat toSrgbTextureFormat(TextureFormat format); + + TextureFormat toTextureFormat(const KtxInfo& info); + +} // namespace Ktx1Reader +} // namespace ktxreader + +#endif diff --git a/libs/ktxreader/src/Ktx1Reader.cpp b/libs/ktxreader/src/Ktx1Reader.cpp new file mode 100644 index 0000000000..16d003207c --- /dev/null +++ b/libs/ktxreader/src/Ktx1Reader.cpp @@ -0,0 +1,316 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace ktxreader { +namespace Ktx1Reader { + +template +T toCompressedFilamentEnum(uint32_t format) { + switch (format) { + case Ktx1Bundle::RGB_S3TC_DXT1: return T::DXT1_RGB; + case Ktx1Bundle::RGBA_S3TC_DXT1: return T::DXT1_RGBA; + case Ktx1Bundle::RGBA_S3TC_DXT3: return T::DXT3_RGBA; + case Ktx1Bundle::RGBA_S3TC_DXT5: return T::DXT5_RGBA; + case Ktx1Bundle::RGBA_ASTC_4x4: return T::RGBA_ASTC_4x4; + case Ktx1Bundle::RGBA_ASTC_5x4: return T::RGBA_ASTC_5x4; + case Ktx1Bundle::RGBA_ASTC_5x5: return T::RGBA_ASTC_5x5; + case Ktx1Bundle::RGBA_ASTC_6x5: return T::RGBA_ASTC_6x5; + case Ktx1Bundle::RGBA_ASTC_6x6: return T::RGBA_ASTC_6x6; + case Ktx1Bundle::RGBA_ASTC_8x5: return T::RGBA_ASTC_8x5; + case Ktx1Bundle::RGBA_ASTC_8x6: return T::RGBA_ASTC_8x6; + case Ktx1Bundle::RGBA_ASTC_8x8: return T::RGBA_ASTC_8x8; + case Ktx1Bundle::RGBA_ASTC_10x5: return T::RGBA_ASTC_10x5; + case Ktx1Bundle::RGBA_ASTC_10x6: return T::RGBA_ASTC_10x6; + case Ktx1Bundle::RGBA_ASTC_10x8: return T::RGBA_ASTC_10x8; + case Ktx1Bundle::RGBA_ASTC_10x10: return T::RGBA_ASTC_10x10; + case Ktx1Bundle::RGBA_ASTC_12x10: return T::RGBA_ASTC_12x10; + case Ktx1Bundle::RGBA_ASTC_12x12: return T::RGBA_ASTC_12x12; + case Ktx1Bundle::SRGB8_ALPHA8_ASTC_4x4: return T::SRGB8_ALPHA8_ASTC_4x4; + case Ktx1Bundle::SRGB8_ALPHA8_ASTC_5x4: return T::SRGB8_ALPHA8_ASTC_5x4; + case Ktx1Bundle::SRGB8_ALPHA8_ASTC_5x5: return T::SRGB8_ALPHA8_ASTC_5x5; + case Ktx1Bundle::SRGB8_ALPHA8_ASTC_6x5: return T::SRGB8_ALPHA8_ASTC_6x5; + case Ktx1Bundle::SRGB8_ALPHA8_ASTC_6x6: return T::SRGB8_ALPHA8_ASTC_6x6; + case Ktx1Bundle::SRGB8_ALPHA8_ASTC_8x5: return T::SRGB8_ALPHA8_ASTC_8x5; + case Ktx1Bundle::SRGB8_ALPHA8_ASTC_8x6: return T::SRGB8_ALPHA8_ASTC_8x6; + case Ktx1Bundle::SRGB8_ALPHA8_ASTC_8x8: return T::SRGB8_ALPHA8_ASTC_8x8; + case Ktx1Bundle::SRGB8_ALPHA8_ASTC_10x5: return T::SRGB8_ALPHA8_ASTC_10x5; + case Ktx1Bundle::SRGB8_ALPHA8_ASTC_10x6: return T::SRGB8_ALPHA8_ASTC_10x6; + case Ktx1Bundle::SRGB8_ALPHA8_ASTC_10x8: return T::SRGB8_ALPHA8_ASTC_10x8; + case Ktx1Bundle::SRGB8_ALPHA8_ASTC_10x10: return T::SRGB8_ALPHA8_ASTC_10x10; + case Ktx1Bundle::SRGB8_ALPHA8_ASTC_12x10: return T::SRGB8_ALPHA8_ASTC_12x10; + case Ktx1Bundle::SRGB8_ALPHA8_ASTC_12x12: return T::SRGB8_ALPHA8_ASTC_12x12; + case Ktx1Bundle::R11_EAC: return T::EAC_R11; + case Ktx1Bundle::SIGNED_R11_EAC: return T::EAC_R11_SIGNED; + case Ktx1Bundle::RG11_EAC: return T::EAC_RG11; + case Ktx1Bundle::SIGNED_RG11_EAC: return T::EAC_RG11_SIGNED; + case Ktx1Bundle::RGB8_ETC2: return T::ETC2_RGB8; + case Ktx1Bundle::SRGB8_ETC2: return T::ETC2_SRGB8; + case Ktx1Bundle::RGB8_ALPHA1_ETC2: return T::ETC2_RGB8_A1; + case Ktx1Bundle::SRGB8_ALPHA1_ETC: return T::ETC2_SRGB8_A1; + case Ktx1Bundle::RGBA8_ETC2_EAC: return T::ETC2_EAC_RGBA8; + case Ktx1Bundle::SRGB8_ALPHA8_ETC2_EAC: return T::ETC2_EAC_SRGBA8; + } + return (T) 0xffff; +} + +Texture* createTexture(Engine* engine, const Ktx1Bundle& ktx, bool srgb, + Callback callback, void* userdata) { + using Sampler = Texture::Sampler; + const auto& ktxinfo = ktx.getInfo(); + const uint32_t nmips = ktx.getNumMipLevels(); + const auto cdatatype = toCompressedPixelDataType(ktxinfo); + const auto datatype = toPixelDataType(ktxinfo); + const auto dataformat = toPixelDataFormat(ktxinfo); + + auto texformat = toTextureFormat(ktxinfo); + if (srgb) { + texformat = toSrgbTextureFormat(texformat); + } + + Texture* texture = Texture::Builder() + .width(ktxinfo.pixelWidth) + .height(ktxinfo.pixelHeight) + .levels(static_cast(nmips)) + .sampler(ktx.isCubemap() ? Sampler::SAMPLER_CUBEMAP : Sampler::SAMPLER_2D) + .format(texformat) + .build(*engine); + + struct Userdata { + uint32_t remainingBuffers; + Callback callback; + void* userdata; + }; + + Userdata* cbuser = new Userdata({nmips, callback, userdata}); + + PixelBufferDescriptor::Callback cb = [](void*, size_t, void* cbuserptr) { + Userdata* cbuser = (Userdata*) cbuserptr; + if (--cbuser->remainingBuffers == 0) { + if (cbuser->callback) { + cbuser->callback(cbuser->userdata); + } + delete cbuser; + } + }; + + uint8_t* data; + uint32_t size; + + if (isCompressed(ktxinfo)) { + if (ktx.isCubemap()) { + for (uint32_t level = 0; level < nmips; ++level) { + ktx.getBlob({level, 0, 0}, &data, &size); + PixelBufferDescriptor pbd(data, size * 6, cdatatype, size, cb, cbuser); + texture->setImage(*engine, level, std::move(pbd), Texture::FaceOffsets(size)); + } + return texture; + } + for (uint32_t level = 0; level < nmips; ++level) { + ktx.getBlob({level, 0, 0}, &data, &size); + PixelBufferDescriptor pbd(data, size, cdatatype, size, cb, cbuser); + texture->setImage(*engine, level, std::move(pbd)); + } + return texture; + } + + if (ktx.isCubemap()) { + for (uint32_t level = 0; level < nmips; ++level) { + ktx.getBlob({level, 0, 0}, &data, &size); + PixelBufferDescriptor pbd(data, size * 6, dataformat, datatype, cb, cbuser); + texture->setImage(*engine, level, std::move(pbd), Texture::FaceOffsets(size)); + } + return texture; + } + + for (uint32_t level = 0; level < nmips; ++level) { + ktx.getBlob({level, 0, 0}, &data, &size); + PixelBufferDescriptor pbd(data, size, dataformat, datatype, cb, cbuser); + texture->setImage(*engine, level, std::move(pbd)); + } + return texture; +} + +Texture* createTexture(Engine* engine, Ktx1Bundle* ktx, bool srgb) { + auto freeKtx = [] (void* userdata) { + Ktx1Bundle* ktx = (Ktx1Bundle*) userdata; + delete ktx; + }; + return createTexture(engine, *ktx, srgb, freeKtx, ktx); +} + +CompressedPixelDataType toCompressedPixelDataType(const KtxInfo& info) { + return toCompressedFilamentEnum(info.glInternalFormat); +} + +PixelDataType toPixelDataType(const KtxInfo& info) { + switch (info.glType) { + case Ktx1Bundle::UNSIGNED_BYTE: return PixelDataType::UBYTE; + case Ktx1Bundle::UNSIGNED_SHORT: return PixelDataType::USHORT; + case Ktx1Bundle::HALF_FLOAT: return PixelDataType::HALF; + case Ktx1Bundle::FLOAT: return PixelDataType::FLOAT; + case Ktx1Bundle::R11F_G11F_B10F: return PixelDataType::UINT_10F_11F_11F_REV; + } + return (PixelDataType) 0xff; +} + +PixelDataFormat toPixelDataFormat(const KtxInfo& info) { + switch (info.glFormat) { + case Ktx1Bundle::LUMINANCE: + case Ktx1Bundle::RED: return PixelDataFormat::R; + case Ktx1Bundle::RG: return PixelDataFormat::RG; + case Ktx1Bundle::RGB: return PixelDataFormat::RGB; + case Ktx1Bundle::RGBA: return PixelDataFormat::RGBA; + // glFormat should NOT be a sized format according to the spec + // however cmgen was generating incorrect files until after Filament 1.8.0 + // so we keep this line here to preserve compatibility with older assets + case Ktx1Bundle::R11F_G11F_B10F: return PixelDataFormat::RGB; + } + return (PixelDataFormat) 0xff; +} + +bool isCompressed(const KtxInfo& info) { + return info.glFormat == 0; +} + +TextureFormat toSrgbTextureFormat(TextureFormat format) { + switch(format) { + // Non-compressed + case Texture::InternalFormat::RGB8: + return Texture::InternalFormat::SRGB8; + case Texture::InternalFormat::RGBA8: + return Texture::InternalFormat::SRGB8_A8; + + // ASTC + case Texture::InternalFormat::RGBA_ASTC_4x4: + return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_4x4; + case Texture::InternalFormat::RGBA_ASTC_5x4: + return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_5x4; + case Texture::InternalFormat::RGBA_ASTC_5x5: + return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_5x5; + case Texture::InternalFormat::RGBA_ASTC_6x5: + return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_6x5; + case Texture::InternalFormat::RGBA_ASTC_6x6: + return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_6x6; + case Texture::InternalFormat::RGBA_ASTC_8x5: + return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_8x5; + case Texture::InternalFormat::RGBA_ASTC_8x6: + return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_8x6; + case Texture::InternalFormat::RGBA_ASTC_8x8: + return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_8x8; + case Texture::InternalFormat::RGBA_ASTC_10x5: + return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_10x5; + case Texture::InternalFormat::RGBA_ASTC_10x6: + return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_10x6; + case Texture::InternalFormat::RGBA_ASTC_10x8: + return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_10x8; + case Texture::InternalFormat::RGBA_ASTC_10x10: + return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_10x10; + case Texture::InternalFormat::RGBA_ASTC_12x10: + return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_12x10; + case Texture::InternalFormat::RGBA_ASTC_12x12: + return Texture::InternalFormat::SRGB8_ALPHA8_ASTC_12x12; + + // ETC2 + case Texture::InternalFormat::ETC2_RGB8: + return Texture::InternalFormat::ETC2_SRGB8; + case Texture::InternalFormat::ETC2_RGB8_A1: + return Texture::InternalFormat::ETC2_SRGB8_A1; + case Texture::InternalFormat::ETC2_EAC_RGBA8: + return Texture::InternalFormat::ETC2_EAC_SRGBA8; + + // DXT + case Texture::InternalFormat::DXT1_RGB: + return Texture::InternalFormat::DXT1_SRGB; + case Texture::InternalFormat::DXT1_RGBA: + return Texture::InternalFormat::DXT1_SRGBA; + case Texture::InternalFormat::DXT3_RGBA: + return Texture::InternalFormat::DXT3_SRGBA; + case Texture::InternalFormat::DXT5_RGBA: + return Texture::InternalFormat::DXT5_SRGBA; + + default: + return format; + } +} + +TextureFormat toTextureFormat(const KtxInfo& info) { + switch (info.glInternalFormat) { + case Ktx1Bundle::RED: return TextureFormat::R8; + case Ktx1Bundle::RG: return TextureFormat::RG8; + case Ktx1Bundle::RGB: return TextureFormat::RGB8; + case Ktx1Bundle::RGBA: return TextureFormat::RGBA8; + case Ktx1Bundle::LUMINANCE: return TextureFormat::R8; + case Ktx1Bundle::LUMINANCE_ALPHA: return TextureFormat::RG8; + case Ktx1Bundle::R8: return TextureFormat::R8; + case Ktx1Bundle::R8_SNORM: return TextureFormat::R8_SNORM; + case Ktx1Bundle::R8UI: return TextureFormat::R8UI; + case Ktx1Bundle::R8I: return TextureFormat::R8I; + case Ktx1Bundle::STENCIL_INDEX8: return TextureFormat::STENCIL8; + case Ktx1Bundle::R16F: return TextureFormat::R16F; + case Ktx1Bundle::R16UI: return TextureFormat::R16UI; + case Ktx1Bundle::R16I: return TextureFormat::R16I; + case Ktx1Bundle::RG8: return TextureFormat::RG8; + case Ktx1Bundle::RG8_SNORM: return TextureFormat::RG8_SNORM; + case Ktx1Bundle::RG8UI: return TextureFormat::RG8UI; + case Ktx1Bundle::RG8I: return TextureFormat::RG8I; + case Ktx1Bundle::RGB565: return TextureFormat::RGB565; + case Ktx1Bundle::RGB9_E5: return TextureFormat::RGB9_E5; + case Ktx1Bundle::RGB5_A1: return TextureFormat::RGB5_A1; + case Ktx1Bundle::RGBA4: return TextureFormat::RGBA4; + case Ktx1Bundle::DEPTH_COMPONENT16: return TextureFormat::DEPTH16; + case Ktx1Bundle::RGB8: return TextureFormat::RGB8; + case Ktx1Bundle::SRGB8: return TextureFormat::SRGB8; + case Ktx1Bundle::RGB8_SNORM: return TextureFormat::RGB8_SNORM; + case Ktx1Bundle::RGB8UI: return TextureFormat::RGB8UI; + case Ktx1Bundle::RGB8I: return TextureFormat::RGB8I; + case Ktx1Bundle::R32F: return TextureFormat::R32F; + case Ktx1Bundle::R32UI: return TextureFormat::R32UI; + case Ktx1Bundle::R32I: return TextureFormat::R32I; + case Ktx1Bundle::RG16F: return TextureFormat::RG16F; + case Ktx1Bundle::RG16UI: return TextureFormat::RG16UI; + case Ktx1Bundle::RG16I: return TextureFormat::RG16I; + case Ktx1Bundle::R11F_G11F_B10F: return TextureFormat::R11F_G11F_B10F; + case Ktx1Bundle::RGBA8: return TextureFormat::RGBA8; + case Ktx1Bundle::SRGB8_ALPHA8: return TextureFormat::SRGB8_A8; + case Ktx1Bundle::RGBA8_SNORM: return TextureFormat::RGBA8_SNORM; + case Ktx1Bundle::RGB10_A2: return TextureFormat::RGB10_A2; + case Ktx1Bundle::RGBA8UI: return TextureFormat::RGBA8UI; + case Ktx1Bundle::RGBA8I: return TextureFormat::RGBA8I; + case Ktx1Bundle::DEPTH24_STENCIL8: return TextureFormat::DEPTH24_STENCIL8; + case Ktx1Bundle::DEPTH32F_STENCIL8: return TextureFormat::DEPTH32F_STENCIL8; + case Ktx1Bundle::RGB16F: return TextureFormat::RGB16F; + case Ktx1Bundle::RGB16UI: return TextureFormat::RGB16UI; + case Ktx1Bundle::RGB16I: return TextureFormat::RGB16I; + case Ktx1Bundle::RG32F: return TextureFormat::RG32F; + case Ktx1Bundle::RG32UI: return TextureFormat::RG32UI; + case Ktx1Bundle::RG32I: return TextureFormat::RG32I; + case Ktx1Bundle::RGBA16F: return TextureFormat::RGBA16F; + case Ktx1Bundle::RGBA16UI: return TextureFormat::RGBA16UI; + case Ktx1Bundle::RGBA16I: return TextureFormat::RGBA16I; + case Ktx1Bundle::RGB32F: return TextureFormat::RGB32F; + case Ktx1Bundle::RGB32UI: return TextureFormat::RGB32UI; + case Ktx1Bundle::RGB32I: return TextureFormat::RGB32I; + case Ktx1Bundle::RGBA32F: return TextureFormat::RGBA32F; + case Ktx1Bundle::RGBA32UI: return TextureFormat::RGBA32UI; + case Ktx1Bundle::RGBA32I: return TextureFormat::RGBA32I; + } + return toCompressedFilamentEnum(info.glInternalFormat); +} + +} // namespace Ktx1Reader +} // namespace ktxreader diff --git a/libs/ktxreader/tests/color_grid_uastc_zstd.ktx2 b/libs/ktxreader/tests/color_grid_uastc_zstd.ktx2 new file mode 100644 index 0000000000000000000000000000000000000000..b1ca0735c3b3066fb478f88a4a9c828ebefac3c9 GIT binary patch literal 170512 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 literal 0 HcmV?d00001 diff --git a/libs/ktxreader/tests/lightroom_ibl.ktx b/libs/ktxreader/tests/lightroom_ibl.ktx new file mode 100644 index 0000000000000000000000000000000000000000..e8b1ba4b0067f59e6db71c9175ecb5e1d06c9e5c GIT binary patch literal 129368 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 + +#include +#include + +#include +#include + +#include +#include + +using namespace filament; +using namespace std; + +using utils::Path; + +class KtxReaderTest : public testing::Test { +protected: + void SetUp() override { + engine = Engine::create(Engine::Backend::NOOP); + } + + void TearDown() override { + Engine::destroy(&engine); + } + + Engine* engine = nullptr; +}; + +static vector readFile(const Path& inputPath) { + std::ifstream file(inputPath, ios::binary); + return vector((istreambuf_iterator(file)), {}); +} + +TEST_F(KtxReaderTest, Ktx1) { + const utils::Path parent = Path::getCurrentExecutable().getParent(); + const auto contents = readFile(parent + "lightroom_ibl.ktx"); + ASSERT_EQ(contents.size(), 129368); + + image::Ktx1Bundle bundle(contents.data(), contents.size()); + + Texture* tex = ktxreader::Ktx1Reader::createTexture(engine, bundle, false, + [](void* userdata) { /* */ }, nullptr); + + ASSERT_TRUE(tex != nullptr); + + ASSERT_EQ(tex->getWidth(), 64); + ASSERT_EQ(tex->getHeight(), 64); + + engine->destroy(tex); +} + +TEST_F(KtxReaderTest, Ktx2) { + const utils::Path parent = Path::getCurrentExecutable().getParent(); + const auto contents = readFile(parent + "color_grid_uastc_zstd.ktx2"); + ASSERT_EQ(contents.size(), 170512); + + // TODO: create Filament texture from the KTX2 file. +} + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/samples/suzanne.cpp b/samples/suzanne.cpp index 1eb07fafc0..b7a44bc878 100644 --- a/samples/suzanne.cpp +++ b/samples/suzanne.cpp @@ -28,8 +28,7 @@ #include -#include -#include +#include #include #include @@ -47,7 +46,7 @@ #include "generated/resources/monkey.h" using namespace filament; -using namespace image; +using namespace ktxreader; using namespace filament::math; struct App { @@ -146,14 +145,14 @@ int main(int argc, char** argv) { auto& em = utils::EntityManager::get(); // Create textures. The KTX bundles are freed by KtxUtility. - auto albedo = new image::KtxBundle(MONKEY_ALBEDO_S3TC_DATA, MONKEY_ALBEDO_S3TC_SIZE); - auto ao = new image::KtxBundle(MONKEY_AO_DATA, MONKEY_AO_SIZE); - auto metallic = new image::KtxBundle(MONKEY_METALLIC_DATA, MONKEY_METALLIC_SIZE); - auto roughness = new image::KtxBundle(MONKEY_ROUGHNESS_DATA, MONKEY_ROUGHNESS_SIZE); - app.albedo = ktx::createTexture(engine, albedo, true); - app.ao = ktx::createTexture(engine, ao, false); - app.metallic = ktx::createTexture(engine, metallic, false); - app.roughness = ktx::createTexture(engine, roughness, false); + auto albedo = new image::Ktx1Bundle(MONKEY_ALBEDO_S3TC_DATA, MONKEY_ALBEDO_S3TC_SIZE); + auto ao = new image::Ktx1Bundle(MONKEY_AO_DATA, MONKEY_AO_SIZE); + auto metallic = new image::Ktx1Bundle(MONKEY_METALLIC_DATA, MONKEY_METALLIC_SIZE); + auto roughness = new image::Ktx1Bundle(MONKEY_ROUGHNESS_DATA, MONKEY_ROUGHNESS_SIZE); + app.albedo = Ktx1Reader::createTexture(engine, albedo, true); + app.ao = Ktx1Reader::createTexture(engine, ao, false); + app.metallic = Ktx1Reader::createTexture(engine, metallic, false); + app.roughness = Ktx1Reader::createTexture(engine, roughness, false); app.normal = loadNormalMap(engine, MONKEY_NORMAL_DATA, MONKEY_NORMAL_SIZE); TextureSampler sampler(TextureSampler::MinFilter::LINEAR_MIPMAP_LINEAR, TextureSampler::MagFilter::LINEAR); diff --git a/tools/cmgen/src/cmgen.cpp b/tools/cmgen/src/cmgen.cpp index 2035135ad0..5e67779abe 100644 --- a/tools/cmgen/src/cmgen.cpp +++ b/tools/cmgen/src/cmgen.cpp @@ -30,7 +30,7 @@ #include #include -#include +#include #include #include @@ -137,7 +137,7 @@ static void UTILS_UNUSED outputSpectrum(std::ostream& out, static void saveImage(const std::string& path, ImageEncoder::Format format, const Image& image, const std::string& compression); static LinearImage toLinearImage(const Image& image); -static void exportKtxFaces(KtxBundle& container, uint32_t miplevel, const Cubemap& cm); +static void exportKtxFaces(Ktx1Bundle& container, uint32_t miplevel, const Cubemap& cm); // ----------------------------------------------------------------------------------------------- @@ -936,14 +936,14 @@ void iblRoughnessPrefilter( // It's convenient to create an empty KTX bundle on the stack in this scope, regardless of // whether KTX is requested. It does not consume memory if empty. - KtxBundle container((uint32_t) numLevels, 1, true); + Ktx1Bundle container((uint32_t) numLevels, 1, true); container.info() = { - .endianness = KtxBundle::ENDIAN_DEFAULT, - .glType = KtxBundle::R11F_G11F_B10F, + .endianness = Ktx1Bundle::ENDIAN_DEFAULT, + .glType = Ktx1Bundle::R11F_G11F_B10F, .glTypeSize = 1, - .glFormat = KtxBundle::RGB, - .glInternalFormat = KtxBundle::R11F_G11F_B10F, - .glBaseInternalFormat = KtxBundle::R11F_G11F_B10F, + .glFormat = Ktx1Bundle::RGB, + .glInternalFormat = Ktx1Bundle::R11F_G11F_B10F, + .glBaseInternalFormat = Ktx1Bundle::R11F_G11F_B10F, .pixelWidth = 1U << baseExp, .pixelHeight = 1U << baseExp, .pixelDepth = 0, @@ -1195,14 +1195,14 @@ void extractCubemapFaces(utils::JobSystem& js, const utils::Path& iname, const C if (g_type == OutputType::KTX) { const uint32_t dim = (const uint32_t) cm.getDimensions(); - KtxBundle container(1, 1, true); + Ktx1Bundle container(1, 1, true); container.info() = { - .endianness = KtxBundle::ENDIAN_DEFAULT, - .glType = KtxBundle::R11F_G11F_B10F, + .endianness = Ktx1Bundle::ENDIAN_DEFAULT, + .glType = Ktx1Bundle::R11F_G11F_B10F, .glTypeSize = 1, - .glFormat = KtxBundle::RGB, - .glInternalFormat = KtxBundle::R11F_G11F_B10F, - .glBaseInternalFormat = KtxBundle::R11F_G11F_B10F, + .glFormat = Ktx1Bundle::RGB, + .glInternalFormat = Ktx1Bundle::R11F_G11F_B10F, + .glBaseInternalFormat = Ktx1Bundle::R11F_G11F_B10F, .pixelWidth = dim, .pixelHeight = dim, .pixelDepth = 0, @@ -1268,7 +1268,7 @@ static void saveImage(const std::string& path, ImageEncoder::Format format, cons } } -static void exportKtxFaces(KtxBundle& container, uint32_t miplevel, const Cubemap& cm) { +static void exportKtxFaces(Ktx1Bundle& container, uint32_t miplevel, const Cubemap& cm) { auto& info = container.info(); #ifdef IMAGEIO_SUPPORTS_BLOCK_COMPRESSION @@ -1285,8 +1285,8 @@ static void exportKtxFaces(KtxBundle& container, uint32_t miplevel, const Cubema info.glTypeSize = 1; info.glFormat = 0; // FIXME: not sure this is always correct to use RGB here, does this work with HDR formats? - info.glBaseInternalFormat = KtxBundle::RGB; - info.glInternalFormat = KtxBundle::RGB; + info.glBaseInternalFormat = Ktx1Bundle::RGB; + info.glInternalFormat = Ktx1Bundle::RGB; } #else if (!g_compression.empty()) { diff --git a/tools/mipgen/src/main.cpp b/tools/mipgen/src/main.cpp index 17e608a9a1..493c7d6ebd 100644 --- a/tools/mipgen/src/main.cpp +++ b/tools/mipgen/src/main.cpp @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #ifdef IMAGEIO_SUPPORTS_BLOCK_COMPRESSION @@ -326,11 +326,11 @@ int main(int argc, char* argv[]) { // The libimage API does not include the original image in the mip array, // which might make sense when generating individual files, but for a KTX // bundle, we want to include level 0, so add 1 to the KTX level count. - KtxBundle container(1 + miplevels.size(), 1, false); + Ktx1Bundle container(1 + miplevels.size(), 1, false); auto& info = container.info(); info = { - .endianness = KtxBundle::ENDIAN_DEFAULT, - .glType = KtxBundle::UNSIGNED_BYTE, + .endianness = Ktx1Bundle::ENDIAN_DEFAULT, + .glType = Ktx1Bundle::UNSIGNED_BYTE, .glTypeSize = 1, .pixelWidth = sourceImage.getWidth(), .pixelHeight = sourceImage.getHeight(), @@ -338,14 +338,14 @@ int main(int argc, char* argv[]) { }; size_t componentCount = sourceImage.getChannels(); if (componentCount == 1) { - info.glFormat = info.glBaseInternalFormat = KtxBundle::RED; - info.glInternalFormat = KtxBundle::R8; + info.glFormat = info.glBaseInternalFormat = Ktx1Bundle::RED; + info.glInternalFormat = Ktx1Bundle::R8; } else if (componentCount == 3) { - info.glFormat = info.glBaseInternalFormat = KtxBundle::RGB; - info.glInternalFormat = KtxBundle::RGB8; + info.glFormat = info.glBaseInternalFormat = Ktx1Bundle::RGB; + info.glInternalFormat = Ktx1Bundle::RGB8; } else if (componentCount == 4) { - info.glFormat = info.glBaseInternalFormat = KtxBundle::RGBA; - info.glInternalFormat = KtxBundle::RGBA8; + info.glFormat = info.glBaseInternalFormat = Ktx1Bundle::RGBA; + info.glInternalFormat = Ktx1Bundle::RGBA8; } #ifdef IMAGEIO_SUPPORTS_BLOCK_COMPRESSION CompressionConfig config {}; diff --git a/tools/roughness-prefilter/src/main.cpp b/tools/roughness-prefilter/src/main.cpp index a56a8b9ab9..e6ed1d74b8 100644 --- a/tools/roughness-prefilter/src/main.cpp +++ b/tools/roughness-prefilter/src/main.cpp @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include @@ -364,15 +364,15 @@ int main(int argc, char* argv[]) { js.adopt(); // For thread safety, we allocate each KTX blob now, before invoking the job system. - image::KtxBundle bundle(mipLevels, 1, false); + image::Ktx1Bundle bundle(mipLevels, 1, false); if (g_ktxContainer) { bundle.info() = { - .endianness = KtxBundle::ENDIAN_DEFAULT, - .glType = KtxBundle::UNSIGNED_BYTE, + .endianness = Ktx1Bundle::ENDIAN_DEFAULT, + .glType = Ktx1Bundle::UNSIGNED_BYTE, .glTypeSize = 1, - .glFormat = KtxBundle::LUMINANCE, - .glInternalFormat = KtxBundle::LUMINANCE, - .glBaseInternalFormat = KtxBundle::LUMINANCE, + .glFormat = Ktx1Bundle::LUMINANCE, + .glInternalFormat = Ktx1Bundle::LUMINANCE, + .glBaseInternalFormat = Ktx1Bundle::LUMINANCE, .pixelWidth = (uint32_t) width, .pixelHeight = (uint32_t) height, .pixelDepth = 0, diff --git a/web/docs/tutorial_redball.md b/web/docs/tutorial_redball.md index 079c65f330..c55542b62d 100644 --- a/web/docs/tutorial_redball.md +++ b/web/docs/tutorial_redball.md @@ -236,7 +236,7 @@ const datatype = Filament.PixelDataType.UINT_10F_11F_11F_REV; // Create a Texture object for the mipmapped cubemap. const ibl_package = Filament.Buffer(Filament.assets[ibl_url]); -const iblktx = new Filament.KtxBundle(ibl_package); +const iblktx = new Filament.Ktx1Bundle(ibl_package); const ibltex = Filament.Texture.Builder() .width(iblktx.info().pixelWidth) @@ -283,7 +283,7 @@ Here's one way to create a texture for the skybox: ```js const sky_package = Filament.Buffer(Filament.assets[sky_url]); -const skyktx = new Filament.KtxBundle(sky_package); +const skyktx = new Filament.Ktx1Bundle(sky_package); const skytex = Filament.Texture.Builder() .width(skyktx.info().pixelWidth) .height(skyktx.info().pixelHeight) diff --git a/web/filament-js/CMakeLists.txt b/web/filament-js/CMakeLists.txt index 1761ffb390..9ecb9fe128 100644 --- a/web/filament-js/CMakeLists.txt +++ b/web/filament-js/CMakeLists.txt @@ -41,7 +41,7 @@ set_target_properties(filament-js PROPERTIES LINK_DEPENDS "${EXTERN_POSTJS_SRC}" OUTPUT_NAME filament) -target_link_libraries(filament-js PRIVATE filament math utils image filameshio gltfio_core viewer) +target_link_libraries(filament-js PRIVATE filament math utils ktxreader filameshio gltfio_core viewer) # Copy package.json (et al) into the output folder to allow "npm publish" to gather the # artifacts that it needs. diff --git a/web/filament-js/extensions.js b/web/filament-js/extensions.js index bc1d950f0f..f4baec28fc 100644 --- a/web/filament-js/extensions.js +++ b/web/filament-js/extensions.js @@ -437,14 +437,14 @@ Filament.loadClassExtensions = function() { return result; }; - Filament.KtxBundle.prototype.getBlob = function(index) { + Filament.Ktx1Bundle.prototype.getBlob = function(index) { const blob = this._getBlob(index); const result = blob.getBytes(); blob.delete(); return result; } - Filament.KtxBundle.prototype.getCubeBlob = function(miplevel) { + Filament.Ktx1Bundle.prototype.getCubeBlob = function(miplevel) { const blob = this._getCubeBlob(miplevel); const result = blob.getBytes(); blob.delete(); diff --git a/web/filament-js/jsbindings.cpp b/web/filament-js/jsbindings.cpp index 2eec57ce16..ce3a952436 100644 --- a/web/filament-js/jsbindings.cpp +++ b/web/filament-js/jsbindings.cpp @@ -68,8 +68,7 @@ #include #include -#include -#include +#include #include #include @@ -93,6 +92,7 @@ using namespace filamesh; using namespace geometry; using namespace gltfio; using namespace image; +using namespace ktxreader; using namespace filament::viewer; @@ -1525,29 +1525,29 @@ class_("driver$PixelBufferDescriptor") // HELPER TYPES // ------------ -/// KtxBundle ::class:: In-memory representation of a KTX file. +/// Ktx1Bundle ::class:: In-memory representation of a KTX file. /// Most clients should use one of the `create*FromKtx` utility methods in the JavaScript [Engine] -/// wrapper rather than interacting with `KtxBundle` directly. -class_("KtxBundle") - .constructor(EMBIND_LAMBDA(KtxBundle*, (BufferDescriptor kbd), { - return new KtxBundle((uint8_t*) kbd.bd->buffer, (uint32_t) kbd.bd->size); +/// wrapper rather than interacting with `Ktx1Bundle` directly. +class_("Ktx1Bundle") + .constructor(EMBIND_LAMBDA(Ktx1Bundle*, (BufferDescriptor kbd), { + return new Ktx1Bundle((uint8_t*) kbd.bd->buffer, (uint32_t) kbd.bd->size); })) /// info ::method:: Obtains properties of the KTX header. /// ::retval:: The [KtxInfo] property accessor object. - .function("getNumMipLevels", &KtxBundle::getNumMipLevels) + .function("getNumMipLevels", &Ktx1Bundle::getNumMipLevels) /// getArrayLength ::method:: Obtains length of the texture array. /// ::retval:: The number of elements in the texture array - .function("getArrayLength", &KtxBundle::getArrayLength) + .function("getArrayLength", &Ktx1Bundle::getArrayLength) /// getInternalFormat ::method:: /// srgb ::argument:: boolean that forces the resulting format to SRGB if possible. /// ::retval:: [Texture$InternalFormat] /// Returns "undefined" if no valid Filament enumerant exists. .function("getInternalFormat", - EMBIND_LAMBDA(Texture::InternalFormat, (KtxBundle* self, bool srgb), { - auto result = ktx::toTextureFormat(self->info()); + EMBIND_LAMBDA(Texture::InternalFormat, (Ktx1Bundle* self, bool srgb), { + auto result = Ktx1Reader::toTextureFormat(self->info()); if (srgb) { if (result == Texture::InternalFormat::RGB8) { result = Texture::InternalFormat::SRGB8; @@ -1563,42 +1563,42 @@ class_("KtxBundle") /// ::retval:: [PixelDataFormat] /// Returns "undefined" if no valid Filament enumerant exists. .function("getPixelDataFormat", - EMBIND_LAMBDA(backend::PixelDataFormat, (KtxBundle* self), { - return ktx::toPixelDataFormat(self->getInfo()); + EMBIND_LAMBDA(backend::PixelDataFormat, (Ktx1Bundle* self), { + return Ktx1Reader::toPixelDataFormat(self->getInfo()); }), allow_raw_pointers()) /// getPixelDataType ::method:: /// ::retval:: [PixelDataType] /// Returns "undefined" if no valid Filament enumerant exists. .function("getPixelDataType", - EMBIND_LAMBDA(backend::PixelDataType, (KtxBundle* self), { - return ktx::toPixelDataType(self->getInfo()); + EMBIND_LAMBDA(backend::PixelDataType, (Ktx1Bundle* self), { + return Ktx1Reader::toPixelDataType(self->getInfo()); }), allow_raw_pointers()) /// getCompressedPixelDataType ::method:: /// ::retval:: [CompressedPixelDataType] /// Returns "undefined" if no valid Filament enumerant exists. .function("getCompressedPixelDataType", - EMBIND_LAMBDA(backend::CompressedPixelDataType, (KtxBundle* self), { - return ktx::toCompressedPixelDataType(self->getInfo()); + EMBIND_LAMBDA(backend::CompressedPixelDataType, (Ktx1Bundle* self), { + return Ktx1Reader::toCompressedPixelDataType(self->getInfo()); }), allow_raw_pointers()) /// isCompressed ::method:: /// Per spec, compressed textures in KTX always have their glFormat field set to 0. /// ::retval:: boolean - .function("isCompressed", EMBIND_LAMBDA(bool, (KtxBundle* self), { - return ktx::isCompressed(self->getInfo()); + .function("isCompressed", EMBIND_LAMBDA(bool, (Ktx1Bundle* self), { + return Ktx1Reader::isCompressed(self->getInfo()); }), allow_raw_pointers()) - .function("isCubemap", &KtxBundle::isCubemap) - .function("_getBlob", EMBIND_LAMBDA(BufferDescriptor, (KtxBundle* self, KtxBlobIndex index), { + .function("isCubemap", &Ktx1Bundle::isCubemap) + .function("_getBlob", EMBIND_LAMBDA(BufferDescriptor, (Ktx1Bundle* self, KtxBlobIndex index), { uint8_t* data; uint32_t size; self->getBlob(index, &data, &size); return BufferDescriptor(data, size); }), allow_raw_pointers()) .function("_getCubeBlob", EMBIND_LAMBDA(BufferDescriptor, - (KtxBundle* self, uint32_t miplevel), { + (Ktx1Bundle* self, uint32_t miplevel), { uint8_t* data; uint32_t size; self->getBlob({miplevel}, &data, &size); @@ -1607,22 +1607,22 @@ class_("KtxBundle") /// info ::method:: Obtains properties of the KTX header. /// ::retval:: The [KtxInfo] property accessor object. - .function("info", &KtxBundle::info) + .function("info", &Ktx1Bundle::info) /// getMetadata ::method:: Obtains arbitrary metadata from the KTX file. /// key ::argument:: string /// ::retval:: string - .function("getMetadata", EMBIND_LAMBDA(std::string, (KtxBundle* self, std::string key), { + .function("getMetadata", EMBIND_LAMBDA(std::string, (Ktx1Bundle* self, std::string key), { return std::string(self->getMetadata(key.c_str())); }), allow_raw_pointers()); function("ktx$createTexture", EMBIND_LAMBDA(Texture*, - (Engine* engine, const KtxBundle& ktx, bool srgb), { - return ktx::createTexture(engine, ktx, srgb, nullptr, nullptr); + (Engine* engine, const Ktx1Bundle& ktx, bool srgb), { + return Ktx1Reader::createTexture(engine, ktx, srgb, nullptr, nullptr); }), allow_raw_pointers()); /// KtxInfo ::class:: Property accessor for KTX header. -/// For example, `ktxbundle.info().pixelWidth`. See the +/// For example, `Ktx1Bundle.info().pixelWidth`. See the /// [KTX spec](https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/) for the list of /// properties. class_("KtxInfo") diff --git a/web/filament-js/utilities.js b/web/filament-js/utilities.js index c400358472..0c639b6429 100644 --- a/web/filament-js/utilities.js +++ b/web/filament-js/utilities.js @@ -242,14 +242,14 @@ Filament.loadMathExtensions = function() { Filament._createTextureFromKtx = function(ktxdata, engine, options) { options = options || {}; - const ktx = options['ktx'] || new Filament.KtxBundle(ktxdata); + const ktx = options['ktx'] || new Filament.Ktx1Bundle(ktxdata); const srgb = !!options['srgb']; return Filament.ktx$createTexture(engine, ktx, srgb); }; Filament._createIblFromKtx = function(ktxdata, engine, options) { options = options || {}; - const iblktx = options['ktx'] = new Filament.KtxBundle(ktxdata); + const iblktx = options['ktx'] = new Filament.Ktx1Bundle(ktxdata); const format = iblktx.info().glInternalFormat; //if (format != this.ctx.R11F_G11F_B10F && format != this.ctx.RGB16F && format != this.ctx.RGB32F) {