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};