feat(ktx): add initial ktx input/output support.#5185
Conversation
Add limited support for input and output for the KTX2 format. Signed-off-by: Walid Chtioui <walid.chtioui.main@gmail.com>
|
Update: I'm working on integrating BCn decoders/encoders directly within libktx so that this PR gets significantly simpler (e.g., from 12_000 lines most of which are from dependencies to circa 2_000). |
*Significantly simplify KTX support by relying on libktx to decode/encode GPU-compressed formats such as BCn, ASTC, and ETC. Consequently, BCn and ETC dependencies are removed. All future required encoders/decoders should be implemented in libktx and not here to keep this is as simple, maintainable, and short as possible. *Remove ETC sub-dependency from local libktx build. *Update ktx README.md documentation to reflect that only libktx dependency is and should be used (i.e., no additional dependencies should be added). Signed-off-by: Walid Chtioui <walid.chtioui.main@gmail.com>
|
Update2: significantly simplified the whole PR. Now only dependency is libktx (since I offloaded most work to libktx via a PR that will be probably merged soon). Can you please not approve workflows unless I explicitly request a workflow run? (to avoid filling the actions log with CIs that I know will certainly fail). |
Sure, in this case I can do so, but only because you are a a first-time contributor to this project, so admins have to approve workflow runs on the project's main account. Once you have any PR accepted and merged, the workflows will run automatically. Here is the general solution that you or others can do, in this situation and after you no longer need admin approval: Let's say you have pushed to your fork's branch "mypr" and submitted a PR to the project from that branch. (Aside: I strongly recommend working in topic branches, and never submitting a PR from your "main".) After submitting the PR, you realize you need to iterate (you want to add things, or CI is not passing and you need to make repairs, or you have review comments to address), but you don't want to do a series of many many pushes as you go, each of which will trigger a CI run on the main branch as well as sending email alerts to everybody "watching" this project, since pushing to your branch is technically a PR update. Instead, push to a different branch! This pushes your fork's "mypr" branch to your fork in a "test" branch. This will run the CI on your fork in your account (allowing you to see if CI passes for the changes you've made), but since your "test" branch is not associated with the PR, it will not send the rest of us alerts and will not trigger a CI run on the project's main repo account. Then when you finally have it right and are ready for the rest of us to see it, you can |
Description
Fixes #2329.
Add initial KTX2 format support (closest similar plugin/format in OIIO is DDS).
Important
This is still a very early draft PR.
Consequently, there are a lot of TODO comments, and code snippets that haven't
been properly tested yet. All of these will be addressed after fixing CI issues.
This KTX plugin support obviously nullifies the benefits of using KTX in the
first place. That being said, this plugin is still useful so that end users
don't have to convert back and forth between KTX <-> supported format (e.g., PNG).
It is also useful to convert to and from KTX2 format using OIIO.
An example usecase would be Blender and its glTf import/export plugin.
(see KhronosGroup/glTF-Blender-IO#1896).
Ideally, at some point in the future, OIIO may introduce a new API to accomodate
texture formats that are mainly used for fast texture uploads to GPUs.
For details on KTX2 and what this PR supports and what it doesn't (alongside a
description of current limitations), see
src/ktx.imageio/README.md(copied partsof it at the end of this).
Tests:
Added initial testsuite but only for the input (i.e., info_command) part of the plugin.
Ideally, after fixing CI issues, the tests will be adjusted for ktxouput.
Checklist:
=> Haven't used any AI coding assistant tools in any capacity whatsoever.
behavior.
=> Not yet. But will add docstrings alongside custom "ktx:" ImageSpec
attribute descriptions.
=> Partially. As stated above, I mainly opened the PR now in the hope of speeding
up fixes for the CI issues.
PR, by pushing the changes to my fork and seeing that the automated CI
passed there.
=> Only 2 jobs pass (clang-format, ABI check).
fixed any problems reported by the clang-format CI test.
corresponding Python bindings. If altering ImageBufAlgo functions, I also
exposed the new functionality as oiiotool options.
=> No new API is introduced. This is just a plugin.
CI Issues:
Tried adjusting the
build_cmakescript but still CMake 3.18.2 is used in somerunners.
some reason). This is probably due to me missing some crucial setup step (I thought
LINK_LIBRARIES KTX::ktxis sufficient for linking to libktx to work - which, again, is onmy machine).
KtxConfig.cmakeon MacOS => Absolutely no idea why (passes in otherWindows/Linux jobs).
some libktx build instruction details that I haven't looked at yet).
Feel free to edit this directly.
The sections below are copied from
src/ktx.imageio/README.md. These will be updatedas this PR progresses.
Supported Encoders/Decoders
Supported/Tested texture kinds:
SINGLE_TEXTURE_1D(TODO)SINGLE_TEXTURE_2DSINGLE_TEXTURE_3D(TODO)CUBEMAP_TEXTURE(TODO)ARRAY_TEXTURE_1D(TODO)ARRAY_TEXTURE_2D(TODO)ARRAY_TEXTURE_3D(not planned)ARRAY_TEXTURE_CUBEMAP(not planned)Supported/Tested raw VkFormats (decoder + encoder):
VK_FORMAT_R8_UNORMVK_FORMAT_R8G8_SRGBVK_FORMAT_R8G8B8_SRGBVK_FORMAT_R8G8B8A8_SRGBBlock-compressed formats (decoder + encoder):
Basis Universal schemes (encoder + decoder):
UASTCETC1SSupercompression schemes (decompressor + compressor):
ZLIBZSTDDependencies (only one - libktx)
libktx: for general KTX@ format support (loading of KTX2 files, transcoding
support, supercompression decompression support, etc.).
OpenImageIO/src/cmake/build_Ktx.cmakelib/etcdec.cxx's license is not permissive.Resources