From c2fcaf7a6bf7e1a384e1e42745296f20677bfba0 Mon Sep 17 00:00:00 2001 From: Koncz Levente Date: Tue, 6 Dec 2022 20:18:35 +0100 Subject: [PATCH] Add RGTC + BPTC support (#6320) * Add RGTC support * Add BPTC support --- RELEASE_NOTES.md | 1 + .../com/google/android/filament/Texture.java | 28 +++++++++++++- docs/webgl/reference.html | 16 ++++++++ .../backend/include/backend/DriverEnums.h | 38 ++++++++++++++++++- filament/backend/src/BackendUtils.cpp | 34 +++++++++++++++++ filament/backend/src/metal/MetalEnums.mm | 10 +++++ filament/backend/src/opengl/GLUtils.h | 28 ++++++++++++++ filament/backend/src/opengl/OpenGLContext.cpp | 4 ++ filament/backend/src/opengl/OpenGLContext.h | 2 + filament/backend/src/opengl/OpenGLDriver.cpp | 6 +++ filament/backend/src/ostream.cpp | 10 ++++- filament/backend/src/vulkan/VulkanUtility.cpp | 10 +++++ filament/src/details/Texture.cpp | 16 ++++++++ libs/image/include/image/Ktx1Bundle.h | 10 +++++ libs/ktxreader/include/ktxreader/Ktx1Reader.h | 9 ++++- libs/ktxreader/src/Ktx1Reader.cpp | 13 +++++++ libs/ktxreader/src/Ktx2Reader.cpp | 7 ++-- 17 files changed, 233 insertions(+), 9 deletions(-) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index e0a8866aeb..e88d5288e7 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -8,6 +8,7 @@ A new header is inserted each time a *tag* is created. - Java: Fix confusing typo in Camera documentation - engine: the output color space can be set on `ColorGrading`. This API currently has limitations, please refer to the documentation for more details. +- Support for RGTC and BPTC texture compression ## v1.30.0 diff --git a/android/filament-android/src/main/java/com/google/android/filament/Texture.java b/android/filament-android/src/main/java/com/google/android/filament/Texture.java index 85c76fdf64..db312a9344 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/Texture.java +++ b/android/filament-android/src/main/java/com/google/android/filament/Texture.java @@ -250,7 +250,19 @@ public class Texture { SRGB8_ALPHA8_ASTC_10x8, SRGB8_ALPHA8_ASTC_10x10, SRGB8_ALPHA8_ASTC_12x10, - SRGB8_ALPHA8_ASTC_12x12 + SRGB8_ALPHA8_ASTC_12x12, + + // RGTC formats available with a GLES extension + RED_RGTC1, // BC4 unsigned + SIGNED_RED_RGTC1, // BC4 signed + RED_GREEN_RGTC2, // BC5 unsigned + SIGNED_RED_GREEN_RGTC2, // BC5 signed + + // BPTC formats available with a GLES extension + RGB_BPTC_SIGNED_FLOAT, // BC6H signed + RGB_BPTC_UNSIGNED_FLOAT,// BC6H unsigned + RGBA_BPTC_UNORM, // BC7 + SRGB_ALPHA_BPTC_UNORM // BC7 sRGB } /** @@ -296,7 +308,19 @@ public class Texture { SRGB8_ALPHA8_ASTC_10x8, SRGB8_ALPHA8_ASTC_10x10, SRGB8_ALPHA8_ASTC_12x10, - SRGB8_ALPHA8_ASTC_12x12 + SRGB8_ALPHA8_ASTC_12x12, + + // RGTC formats available with a GLES extension + RED_RGTC1, // BC4 unsigned + SIGNED_RED_RGTC1, // BC4 signed + RED_GREEN_RGTC2, // BC5 unsigned + SIGNED_RED_GREEN_RGTC2, // BC5 signed + + // BPTC formats available with a GLES extension + RGB_BPTC_SIGNED_FLOAT, // BC6H signed + RGB_BPTC_UNSIGNED_FLOAT,// BC6H unsigned + RGBA_BPTC_UNORM, // BC7 + SRGB_ALPHA_BPTC_UNORM // BC7 sRGB } /** diff --git a/docs/webgl/reference.html b/docs/webgl/reference.html index c656e8076d..61284e64ce 100644 --- a/docs/webgl/reference.html +++ b/docs/webgl/reference.html @@ -1140,6 +1140,14 @@ This defines the following functions:

  • DXT1_RGBA
  • DXT3_RGBA
  • DXT5_RGBA
  • +
  • RED_RGTC1
  • +
  • SIGNED_RED_RGTC1
  • +
  • RED_GREEN_RGTC2
  • +
  • SIGNED_RED_GREEN_RGTC2
  • +
  • RGB_BPTC_SIGNED_FLOAT
  • +
  • RGB_BPTC_UNSIGNED_FLOAT
  • +
  • RGBA_BPTC_UNORM
  • +
  • SRGB_ALPHA_BPTC_UNORM
  • RGBA_ASTC_4x4
  • RGBA_ASTC_5x4
  • RGBA_ASTC_5x5
  • @@ -1377,6 +1385,14 @@ This defines the following functions:

  • DXT1_RGBA
  • DXT3_RGBA
  • DXT5_RGBA
  • +
  • RED_RGTC1
  • +
  • SIGNED_RED_RGTC1
  • +
  • RED_GREEN_RGTC2
  • +
  • SIGNED_RED_GREEN_RGTC2
  • +
  • RGB_BPTC_SIGNED_FLOAT
  • +
  • RGB_BPTC_UNSIGNED_FLOAT
  • +
  • RGBA_BPTC_UNORM
  • +
  • SRGB_ALPHA_BPTC_UNORM
  • RGBA_ASTC_4x4
  • RGBA_ASTC_5x4
  • RGBA_ASTC_5x5
  • diff --git a/filament/backend/include/backend/DriverEnums.h b/filament/backend/include/backend/DriverEnums.h index a0ed90d2fb..fb6c4be320 100644 --- a/filament/backend/include/backend/DriverEnums.h +++ b/filament/backend/include/backend/DriverEnums.h @@ -398,6 +398,18 @@ enum class CompressedPixelDataType : uint16_t { SRGB8_ALPHA8_ASTC_10x10, SRGB8_ALPHA8_ASTC_12x10, SRGB8_ALPHA8_ASTC_12x12, + + // RGTC formats available with a GLES extension + RED_RGTC1, // BC4 unsigned + SIGNED_RED_RGTC1, // BC4 signed + RED_GREEN_RGTC2, // BC5 unsigned + SIGNED_RED_GREEN_RGTC2, // BC5 signed + + // BPTC formats available with a GLES extension + RGB_BPTC_SIGNED_FLOAT, // BC6H signed + RGB_BPTC_UNSIGNED_FLOAT,// BC6H unsigned + RGBA_BPTC_UNORM, // BC7 + SRGB_ALPHA_BPTC_UNORM, // BC7 sRGB }; /** Supported texel formats @@ -552,6 +564,18 @@ enum class TextureFormat : uint16_t { SRGB8_ALPHA8_ASTC_10x10, SRGB8_ALPHA8_ASTC_12x10, SRGB8_ALPHA8_ASTC_12x12, + + // RGTC formats available with a GLES extension + RED_RGTC1, // BC4 unsigned + SIGNED_RED_RGTC1, // BC4 signed + RED_GREEN_RGTC2, // BC5 unsigned + SIGNED_RED_GREEN_RGTC2, // BC5 signed + + // BPTC formats available with a GLES extension + RGB_BPTC_SIGNED_FLOAT, // BC6H signed + RGB_BPTC_UNSIGNED_FLOAT,// BC6H unsigned + RGBA_BPTC_UNORM, // BC7 + SRGB_ALPHA_BPTC_UNORM, // BC7 sRGB }; //! Bitmask describing the intended Texture Usage @@ -632,7 +656,7 @@ static constexpr bool isSignedIntFormat(TextureFormat format) { } } -//! returns whether this format a compressed format +//! returns whether this format is a compressed format static constexpr bool isCompressedFormat(TextureFormat format) noexcept { return format >= TextureFormat::EAC_R11; } @@ -642,7 +666,7 @@ static constexpr bool isETC2Compression(TextureFormat format) noexcept { return format >= TextureFormat::EAC_R11 && format <= TextureFormat::ETC2_EAC_SRGBA8; } -//! returns whether this format is an ETC3 compressed format +//! returns whether this format is an S3TC compressed format static constexpr bool isS3TCCompression(TextureFormat format) noexcept { return format >= TextureFormat::DXT1_RGB && format <= TextureFormat::DXT5_SRGBA; } @@ -651,6 +675,16 @@ static constexpr bool isS3TCSRGBCompression(TextureFormat format) noexcept { return format >= TextureFormat::DXT1_SRGB && format <= TextureFormat::DXT5_SRGBA; } +//! returns whether this format is an RGTC compressed format +static constexpr bool isRGTCCompression(TextureFormat format) noexcept { + return format >= TextureFormat::RED_RGTC1 && format <= TextureFormat::SIGNED_RED_GREEN_RGTC2; +} + +//! returns whether this format is an BPTC compressed format +static constexpr bool isBPTCCompression(TextureFormat format) noexcept { + return format >= TextureFormat::RGB_BPTC_SIGNED_FLOAT && format <= TextureFormat::SRGB_ALPHA_BPTC_UNORM; +} + static constexpr bool isASTCCompression(TextureFormat format) noexcept { return format >= TextureFormat::RGBA_ASTC_4x4 && format <= TextureFormat::SRGB8_ALPHA8_ASTC_12x12; } diff --git a/filament/backend/src/BackendUtils.cpp b/filament/backend/src/BackendUtils.cpp index e2d6aae93c..9b0298f8be 100644 --- a/filament/backend/src/BackendUtils.cpp +++ b/filament/backend/src/BackendUtils.cpp @@ -173,6 +173,20 @@ size_t getFormatSize(TextureFormat format) noexcept { case TextureFormat::DXT5_SRGBA: return 16; + case TextureFormat::RED_RGTC1: + case TextureFormat::SIGNED_RED_RGTC1: + return 8; + + case TextureFormat::RED_GREEN_RGTC2: + case TextureFormat::SIGNED_RED_GREEN_RGTC2: + return 16; + + case TextureFormat::RGB_BPTC_SIGNED_FLOAT: + case TextureFormat::RGB_BPTC_UNSIGNED_FLOAT: + case TextureFormat::RGBA_BPTC_UNORM: + case TextureFormat::SRGB_ALPHA_BPTC_UNORM: + return 16; + // The block size for ASTC compression is always 16 bytes. case TextureFormat::RGBA_ASTC_4x4: case TextureFormat::RGBA_ASTC_5x4: @@ -276,16 +290,22 @@ size_t getFormatComponentCount(TextureFormat format) noexcept { // Compressed formats --------------------------------------------------------------------- case TextureFormat::EAC_R11: case TextureFormat::EAC_R11_SIGNED: + case TextureFormat::RED_RGTC1: + case TextureFormat::SIGNED_RED_RGTC1: return 1; case TextureFormat::EAC_RG11: case TextureFormat::EAC_RG11_SIGNED: + case TextureFormat::RED_GREEN_RGTC2: + case TextureFormat::SIGNED_RED_GREEN_RGTC2: return 2; case TextureFormat::ETC2_RGB8: case TextureFormat::ETC2_SRGB8: case TextureFormat::DXT1_RGB: case TextureFormat::DXT1_SRGB: + case TextureFormat::RGB_BPTC_SIGNED_FLOAT: + case TextureFormat::RGB_BPTC_UNSIGNED_FLOAT: return 3; case TextureFormat::ETC2_EAC_RGBA8: @@ -298,6 +318,8 @@ size_t getFormatComponentCount(TextureFormat format) noexcept { case TextureFormat::DXT3_SRGBA: case TextureFormat::DXT5_RGBA: case TextureFormat::DXT5_SRGBA: + case TextureFormat::RGBA_BPTC_UNORM: + case TextureFormat::SRGB_ALPHA_BPTC_UNORM: case TextureFormat::RGBA_ASTC_4x4: case TextureFormat::RGBA_ASTC_5x4: case TextureFormat::RGBA_ASTC_5x5: @@ -356,6 +378,18 @@ size_t getBlockWidth(TextureFormat format) noexcept { case TextureFormat::DXT5_SRGBA: return 4; + case TextureFormat::RED_RGTC1: + case TextureFormat::SIGNED_RED_RGTC1: + case TextureFormat::RED_GREEN_RGTC2: + case TextureFormat::SIGNED_RED_GREEN_RGTC2: + return 4; + + case TextureFormat::RGB_BPTC_SIGNED_FLOAT: + case TextureFormat::RGB_BPTC_UNSIGNED_FLOAT: + case TextureFormat::RGBA_BPTC_UNORM: + case TextureFormat::SRGB_ALPHA_BPTC_UNORM: + return 4; + case TextureFormat::RGBA_ASTC_4x4: case TextureFormat::SRGB8_ALPHA8_ASTC_4x4: return 4; diff --git a/filament/backend/src/metal/MetalEnums.mm b/filament/backend/src/metal/MetalEnums.mm index 915f85b1e4..b7d6b3253f 100644 --- a/filament/backend/src/metal/MetalEnums.mm +++ b/filament/backend/src/metal/MetalEnums.mm @@ -198,6 +198,16 @@ MTLPixelFormat getMetalFormat(MetalContext* context, TextureFormat format) noexc case TextureFormat::DXT1_RGB: return MTLPixelFormatInvalid; case TextureFormat::DXT1_SRGB: return MTLPixelFormatInvalid; + + case TextureFormat::RED_RGTC1: return MTLPixelFormatBC4_RUnorm; + case TextureFormat::SIGNED_RED_RGTC1: return MTLPixelFormatBC4_RSnorm; + case TextureFormat::RED_GREEN_RGTC2: return MTLPixelFormatBC5_RGUnorm; + case TextureFormat::SIGNED_RED_GREEN_RGTC2: return MTLPixelFormatBC5_RGSnorm; + + case TextureFormat::RGB_BPTC_SIGNED_FLOAT: return MTLPixelFormatBC6H_RGBFloat; + case TextureFormat::RGB_BPTC_UNSIGNED_FLOAT: return MTLPixelFormatBC6H_RGBUfloat; + case TextureFormat::RGBA_BPTC_UNORM: return MTLPixelFormatBC7_RGBAUnorm; + case TextureFormat::SRGB_ALPHA_BPTC_UNORM: return MTLPixelFormatBC7_RGBAUnorm_sRGB; default: break; } } diff --git a/filament/backend/src/opengl/GLUtils.h b/filament/backend/src/opengl/GLUtils.h index a7ebe888a4..ffb640eb81 100644 --- a/filament/backend/src/opengl/GLUtils.h +++ b/filament/backend/src/opengl/GLUtils.h @@ -472,6 +472,34 @@ constexpr /* inline */ GLenum getInternalFormat(TextureFormat format) noexcept { return 0; #endif +#if defined(GL_EXT_texture_compression_rgtc) + case TextureFormat::RED_RGTC1: return GL_COMPRESSED_RED_RGTC1_EXT; + case TextureFormat::SIGNED_RED_RGTC1: return GL_COMPRESSED_SIGNED_RED_RGTC1_EXT; + case TextureFormat::RED_GREEN_RGTC2: return GL_COMPRESSED_RED_GREEN_RGTC2_EXT; + case TextureFormat::SIGNED_RED_GREEN_RGTC2: return GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT; +#else + case TextureFormat::RED_RGTC1: + case TextureFormat::SIGNED_RED_RGTC1: + case TextureFormat::RED_GREEN_RGTC2: + case TextureFormat::SIGNED_RED_GREEN_RGTC2: + // this should not happen + return 0; +#endif + +#if defined(GL_EXT_texture_compression_bptc) + case TextureFormat::RGB_BPTC_SIGNED_FLOAT: return GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT; + case TextureFormat::RGB_BPTC_UNSIGNED_FLOAT: return GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT; + case TextureFormat::RGBA_BPTC_UNORM: return GL_COMPRESSED_RGBA_BPTC_UNORM_EXT; + case TextureFormat::SRGB_ALPHA_BPTC_UNORM: return GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT; +#else + case TextureFormat::RGB_BPTC_SIGNED_FLOAT: + case TextureFormat::RGB_BPTC_UNSIGNED_FLOAT: + case TextureFormat::RGBA_BPTC_UNORM: + case TextureFormat::SRGB_ALPHA_BPTC_UNORM: + // this should not happen + return 0; +#endif + #if defined(GL_KHR_texture_compression_astc_hdr) case TextureFormat::RGBA_ASTC_4x4: return GL_COMPRESSED_RGBA_ASTC_4x4_KHR; case TextureFormat::RGBA_ASTC_5x4: return GL_COMPRESSED_RGBA_ASTC_5x4_KHR; diff --git a/filament/backend/src/opengl/OpenGLContext.cpp b/filament/backend/src/opengl/OpenGLContext.cpp index e3f446faf1..874a13fda7 100644 --- a/filament/backend/src/opengl/OpenGLContext.cpp +++ b/filament/backend/src/opengl/OpenGLContext.cpp @@ -375,6 +375,8 @@ void OpenGLContext::initExtensionsGLES() noexcept { #endif ext.EXT_texture_compression_s3tc = exts.has("GL_EXT_texture_compression_s3tc"sv); ext.EXT_texture_compression_s3tc_srgb = exts.has("GL_EXT_texture_compression_s3tc_srgb"sv); + ext.EXT_texture_compression_rgtc = exts.has("GL_EXT_texture_compression_rgtc"sv); + ext.EXT_texture_compression_bptc = exts.has("GL_EXT_texture_compression_bptc"sv); ext.EXT_texture_cube_map_array = exts.has("GL_EXT_texture_cube_map_array"sv) || exts.has("GL_OES_texture_cube_map_array"sv); ext.GOOGLE_cpp_style_line_directive = exts.has("GL_GOOGLE_cpp_style_line_directive"sv); ext.KHR_debug = exts.has("GL_KHR_debug"sv); @@ -418,6 +420,8 @@ void OpenGLContext::initExtensionsGL() noexcept { ext.EXT_texture_compression_etc2 = exts.has("GL_ARB_ES3_compatibility"sv); ext.EXT_texture_compression_s3tc = exts.has("GL_EXT_texture_compression_s3tc"sv); ext.EXT_texture_compression_s3tc_srgb = exts.has("GL_EXT_texture_compression_s3tc_srgb"sv); + ext.EXT_texture_compression_rgtc = exts.has("GL_EXT_texture_compression_rgtc"sv); + ext.EXT_texture_compression_bptc = exts.has("GL_EXT_texture_compression_bptc"sv); ext.EXT_texture_filter_anisotropic = exts.has("GL_EXT_texture_filter_anisotropic"sv); ext.EXT_texture_sRGB = exts.has("GL_EXT_texture_sRGB"sv); ext.GOOGLE_cpp_style_line_directive = exts.has("GL_GOOGLE_cpp_style_line_directive"sv); diff --git a/filament/backend/src/opengl/OpenGLContext.h b/filament/backend/src/opengl/OpenGLContext.h index dad6d246b3..85f3ce7fc2 100644 --- a/filament/backend/src/opengl/OpenGLContext.h +++ b/filament/backend/src/opengl/OpenGLContext.h @@ -157,6 +157,8 @@ public: bool EXT_texture_compression_etc2; bool EXT_texture_compression_s3tc; bool EXT_texture_compression_s3tc_srgb; + bool EXT_texture_compression_rgtc; + bool EXT_texture_compression_bptc; bool EXT_texture_cube_map_array; bool EXT_texture_filter_anisotropic; bool EXT_texture_sRGB; diff --git a/filament/backend/src/opengl/OpenGLDriver.cpp b/filament/backend/src/opengl/OpenGLDriver.cpp index 3c317961bc..878d4c1ad7 100644 --- a/filament/backend/src/opengl/OpenGLDriver.cpp +++ b/filament/backend/src/opengl/OpenGLDriver.cpp @@ -1509,6 +1509,12 @@ bool OpenGLDriver::isTextureFormatSupported(TextureFormat format) { return ext.EXT_texture_compression_s3tc || // this is ES specific ext.WEBGL_compressed_texture_s3tc; // this is WEBGL specific } + if (isRGTCCompression(format)) { + return ext.EXT_texture_compression_rgtc; + } + if (isBPTCCompression(format)) { + return ext.EXT_texture_compression_bptc; + } if (isASTCCompression(format)) { return ext.KHR_texture_compression_astc_hdr; } diff --git a/filament/backend/src/ostream.cpp b/filament/backend/src/ostream.cpp index 52cb74b974..c3f97dc8fd 100644 --- a/filament/backend/src/ostream.cpp +++ b/filament/backend/src/ostream.cpp @@ -252,7 +252,14 @@ io::ostream& operator<<(io::ostream& out, TextureFormat format) { CASE(TextureFormat, DXT3_SRGBA) CASE(TextureFormat, DXT5_RGBA) CASE(TextureFormat, DXT5_SRGBA) - CASE(TextureFormat, UNUSED) + CASE(TextureFormat, RED_RGTC1) + CASE(TextureFormat, SIGNED_RED_RGTC1) + CASE(TextureFormat, RED_GREEN_RGTC2) + CASE(TextureFormat, SIGNED_RED_GREEN_RGTC2) + CASE(TextureFormat, RGB_BPTC_SIGNED_FLOAT) + CASE(TextureFormat, RGB_BPTC_UNSIGNED_FLOAT) + CASE(TextureFormat, RGBA_BPTC_UNORM) + CASE(TextureFormat, SRGB_ALPHA_BPTC_UNORM) CASE(TextureFormat, RGBA_ASTC_4x4) CASE(TextureFormat, RGBA_ASTC_5x4) CASE(TextureFormat, RGBA_ASTC_5x5) @@ -281,6 +288,7 @@ io::ostream& operator<<(io::ostream& out, TextureFormat format) { CASE(TextureFormat, SRGB8_ALPHA8_ASTC_10x10) CASE(TextureFormat, SRGB8_ALPHA8_ASTC_12x10) CASE(TextureFormat, SRGB8_ALPHA8_ASTC_12x12) + CASE(TextureFormat, UNUSED) } return out; } diff --git a/filament/backend/src/vulkan/VulkanUtility.cpp b/filament/backend/src/vulkan/VulkanUtility.cpp index 18179a945e..02ba0f0e6c 100644 --- a/filament/backend/src/vulkan/VulkanUtility.cpp +++ b/filament/backend/src/vulkan/VulkanUtility.cpp @@ -184,6 +184,16 @@ VkFormat getVkFormat(TextureFormat format) { case TextureFormat::DXT5_RGBA: return VK_FORMAT_BC3_UNORM_BLOCK; case TextureFormat::DXT5_SRGBA: return VK_FORMAT_BC3_SRGB_BLOCK; + case TextureFormat::RED_RGTC1: return VK_FORMAT_BC4_UNORM_BLOCK; + case TextureFormat::SIGNED_RED_RGTC1: return VK_FORMAT_BC4_SNORM_BLOCK; + case TextureFormat::RED_GREEN_RGTC2: return VK_FORMAT_BC5_UNORM_BLOCK; + case TextureFormat::SIGNED_RED_GREEN_RGTC2: return VK_FORMAT_BC5_SNORM_BLOCK; + + case TextureFormat::RGB_BPTC_SIGNED_FLOAT: return VK_FORMAT_BC6H_SFLOAT_BLOCK; + case TextureFormat::RGB_BPTC_UNSIGNED_FLOAT: return VK_FORMAT_BC6H_UFLOAT_BLOCK; + case TextureFormat::RGBA_BPTC_UNORM: return VK_FORMAT_BC7_UNORM_BLOCK; + case TextureFormat::SRGB_ALPHA_BPTC_UNORM: return VK_FORMAT_BC7_SRGB_BLOCK; + case TextureFormat::RGBA_ASTC_4x4: return VK_FORMAT_ASTC_4x4_UNORM_BLOCK; case TextureFormat::RGBA_ASTC_5x4: return VK_FORMAT_ASTC_5x4_UNORM_BLOCK; case TextureFormat::RGBA_ASTC_5x5: return VK_FORMAT_ASTC_5x5_UNORM_BLOCK; diff --git a/filament/src/details/Texture.cpp b/filament/src/details/Texture.cpp index 183ca831af..f053923644 100644 --- a/filament/src/details/Texture.cpp +++ b/filament/src/details/Texture.cpp @@ -781,6 +781,14 @@ bool FTexture::validatePixelFormatAndType(TextureFormat internalFormat, case TextureFormat::DXT1_SRGBA: case TextureFormat::DXT3_SRGBA: case TextureFormat::DXT5_SRGBA: + case TextureFormat::RED_RGTC1: + case TextureFormat::SIGNED_RED_RGTC1: + case TextureFormat::RED_GREEN_RGTC2: + case TextureFormat::SIGNED_RED_GREEN_RGTC2: + case TextureFormat::RGB_BPTC_SIGNED_FLOAT: + case TextureFormat::RGB_BPTC_UNSIGNED_FLOAT: + case TextureFormat::RGBA_BPTC_UNORM: + case TextureFormat::SRGB_ALPHA_BPTC_UNORM: case TextureFormat::RGBA_ASTC_4x4: case TextureFormat::RGBA_ASTC_5x4: case TextureFormat::RGBA_ASTC_5x5: @@ -981,6 +989,14 @@ bool FTexture::validatePixelFormatAndType(TextureFormat internalFormat, case TextureFormat::DXT1_SRGBA: case TextureFormat::DXT3_SRGBA: case TextureFormat::DXT5_SRGBA: + case TextureFormat::RED_RGTC1: + case TextureFormat::SIGNED_RED_RGTC1: + case TextureFormat::RED_GREEN_RGTC2: + case TextureFormat::SIGNED_RED_GREEN_RGTC2: + case TextureFormat::RGB_BPTC_SIGNED_FLOAT: + case TextureFormat::RGB_BPTC_UNSIGNED_FLOAT: + case TextureFormat::RGBA_BPTC_UNORM: + case TextureFormat::SRGB_ALPHA_BPTC_UNORM: case TextureFormat::RGBA_ASTC_4x4: case TextureFormat::RGBA_ASTC_5x4: case TextureFormat::RGBA_ASTC_5x5: diff --git a/libs/image/include/image/Ktx1Bundle.h b/libs/image/include/image/Ktx1Bundle.h index d408dc7c24..430f92be1e 100644 --- a/libs/image/include/image/Ktx1Bundle.h +++ b/libs/image/include/image/Ktx1Bundle.h @@ -225,6 +225,16 @@ public: static constexpr uint32_t RGBA_S3TC_DXT3 = 0x83F2; static constexpr uint32_t RGBA_S3TC_DXT5 = 0x83F3; + static constexpr uint32_t R_RGTC_BC4_UNORM = 0x8DBB; + static constexpr uint32_t R_RGTC_BC4_SNORM = 0x8DBC; + static constexpr uint32_t RG_RGTC_BC5_UNORM = 0x8DBD; + static constexpr uint32_t RG_RGTC_BC5_SNORM = 0x8DBE; + + static constexpr uint32_t RGBA_BPTC_BC7 = 0x8E8C; + static constexpr uint32_t SRGB8_ALPHA8_BPTC_BC7 = 0x8E8D; + static constexpr uint32_t RGB_BPTC_BC6H_SNORM = 0x8E8E; + static constexpr uint32_t RGB_BPTC_BC6H_UNORM = 0x8E8F; + static constexpr uint32_t RGBA_ASTC_4x4 = 0x93B0; static constexpr uint32_t RGBA_ASTC_5x4 = 0x93B1; static constexpr uint32_t RGBA_ASTC_5x5 = 0x93B2; diff --git a/libs/ktxreader/include/ktxreader/Ktx1Reader.h b/libs/ktxreader/include/ktxreader/Ktx1Reader.h index 5bd6891859..ca980c1c89 100644 --- a/libs/ktxreader/include/ktxreader/Ktx1Reader.h +++ b/libs/ktxreader/include/ktxreader/Ktx1Reader.h @@ -51,7 +51,6 @@ namespace Ktx1Reader { PixelDataFormat toPixelDataFormat(const KtxInfo& info); bool isCompressed(const KtxInfo& info); TextureFormat toTextureFormat(const KtxInfo& info); - TextureFormat toSrgbTextureFormat(TextureFormat tex); template T toCompressedFilamentEnum(uint32_t format) { @@ -60,6 +59,14 @@ namespace Ktx1Reader { 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::R_RGTC_BC4_UNORM: return T::RED_RGTC1; + case Ktx1Bundle::R_RGTC_BC4_SNORM: return T::SIGNED_RED_RGTC1; + case Ktx1Bundle::RG_RGTC_BC5_UNORM: return T::RED_GREEN_RGTC2; + case Ktx1Bundle::RG_RGTC_BC5_SNORM: return T::SIGNED_RED_GREEN_RGTC2; + case Ktx1Bundle::RGBA_BPTC_BC7: return T::RGBA_BPTC_UNORM; + case Ktx1Bundle::SRGB8_ALPHA8_BPTC_BC7: return T::SRGB_ALPHA_BPTC_UNORM; + case Ktx1Bundle::RGB_BPTC_BC6H_SNORM: return T::RGB_BPTC_SIGNED_FLOAT; + case Ktx1Bundle::RGB_BPTC_BC6H_UNORM: return T::RGB_BPTC_UNSIGNED_FLOAT; 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; diff --git a/libs/ktxreader/src/Ktx1Reader.cpp b/libs/ktxreader/src/Ktx1Reader.cpp index 5c0f425cf2..aa20cc8815 100644 --- a/libs/ktxreader/src/Ktx1Reader.cpp +++ b/libs/ktxreader/src/Ktx1Reader.cpp @@ -191,6 +191,19 @@ bool isSrgbTextureFormat(TextureFormat format) { case Texture::InternalFormat::DXT5_RGBA: return false; + // RGTC + case Texture::InternalFormat::RED_RGTC1: + case Texture::InternalFormat::SIGNED_RED_RGTC1: + case Texture::InternalFormat::RED_GREEN_RGTC2: + case Texture::InternalFormat::SIGNED_RED_GREEN_RGTC2: + return false; + + // BPTC + case Texture::InternalFormat::RGB_BPTC_SIGNED_FLOAT: + case Texture::InternalFormat::RGB_BPTC_UNSIGNED_FLOAT: + case Texture::InternalFormat::RGBA_BPTC_UNORM: + return false; + default: return true; } diff --git a/libs/ktxreader/src/Ktx2Reader.cpp b/libs/ktxreader/src/Ktx2Reader.cpp index 622e023522..b04f23f226 100644 --- a/libs/ktxreader/src/Ktx2Reader.cpp +++ b/libs/ktxreader/src/Ktx2Reader.cpp @@ -69,9 +69,6 @@ struct FinalFormatInfo { // transcoder_texture_format::cTFPVRTC2_4_RGBA // transcoder_texture_format::cTFPVRTC1_4_RGB // transcoder_texture_format::cTFPVRTC1_4_RGBA -// transcoder_texture_format::cTFBC4_R -// transcoder_texture_format::cTFBC5_RG -// transcoder_texture_format::cTFBC7_RGBA (this format would add size bloat to the transcoder) // transcoder_texture_format::cTFBGR565 (note the blue/red swap) // static FinalFormatInfo getFinalFormatInfo(Texture::InternalFormat fmt) { @@ -89,6 +86,10 @@ static FinalFormatInfo getFinalFormatInfo(Texture::InternalFormat fmt) { case tif::DXT1_RGB: return {"DXT1_RGB", true, true, LINEAR, ttf::cTFBC1_RGB, tct::DXT1_SRGB}; case tif::DXT5_SRGBA: return {"DXT5_SRGBA", true, true, sRGB, ttf::cTFBC3_RGBA, tct::DXT5_RGBA}; case tif::DXT5_RGBA: return {"DXT5_RGBA", true, true, LINEAR, ttf::cTFBC3_RGBA, tct::DXT5_SRGBA}; + case tif::RED_RGTC1: return {"RED_RGTC1", true, true, LINEAR, ttf::cTFBC4_R, tct::RED_RGTC1}; + case tif::RED_GREEN_RGTC2: return {"RED_GREEN_RGTC2", true, true, LINEAR, ttf::cTFBC5_RG, tct::RED_GREEN_RGTC2}; + case tif::RGBA_BPTC_UNORM: return {"RGBA_BPTC_UNORM", true, true, LINEAR, ttf::cTFBC7_RGBA, tct::RGBA_BPTC_UNORM}; + case tif::SRGB_ALPHA_BPTC_UNORM: return {"SRGB_ALPHA_BPTC_UNORM", true, true, sRGB, ttf::cTFBC7_RGBA, tct::SRGB_ALPHA_BPTC_UNORM}; case tif::SRGB8_ALPHA8_ASTC_4x4: return {"SRGB8_ALPHA8_ASTC_4x4", true, true, sRGB, ttf::cTFASTC_4x4_RGBA, tct::RGBA_ASTC_4x4}; case tif::RGBA_ASTC_4x4: return {"RGBA_ASTC_4x4", true, true, LINEAR, ttf::cTFASTC_4x4_RGBA, tct::SRGB8_ALPHA8_ASTC_4x4}; case tif::EAC_R11: return {"EAC_R11", true, true, LINEAR, ttf::cTFETC2_EAC_R11, tct::EAC_R11};