From 26d960cb726053aeab29d595fb8e6fb0d27c66ce Mon Sep 17 00:00:00 2001 From: Mirco Miranda Date: Tue, 27 Oct 2026 14:26:56 +0100 Subject: [PATCH] DDS: add DX10 BC6H support Add read support for BC6H textures declared in the DX10 extended header (DXGI formats BC6H_TYPELESS, BC6H_UF16 and BC6H_SF16). --- autotests/read/dds/bc6hs.dds | Bin 0 -> 12484 bytes autotests/read/dds/bc6hs.png | Bin 0 -> 3971 bytes autotests/read/dds/bc6hu.dds | Bin 0 -> 12484 bytes autotests/read/dds/bc6hu.png | Bin 0 -> 3954 bytes src/imageformats/dds.cpp | 46 +++++++++++++++++++++++++++++++++++ 5 files changed, 46 insertions(+) create mode 100644 autotests/read/dds/bc6hs.dds create mode 100644 autotests/read/dds/bc6hs.png create mode 100644 autotests/read/dds/bc6hu.dds create mode 100644 autotests/read/dds/bc6hu.png diff --git a/autotests/read/dds/bc6hs.dds b/autotests/read/dds/bc6hs.dds new file mode 100644 index 0000000000000000000000000000000000000000..c827bfd63eef0e1294ffea55f172a8f4e119f94f GIT binary patch literal 12484 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 M07*qoM6N<$f<57BX8-^I literal 0 HcmV?d00001 diff --git a/src/imageformats/dds.cpp b/src/imageformats/dds.cpp index e016475..509689e 100644 --- a/src/imageformats/dds.cpp +++ b/src/imageformats/dds.cpp @@ -131,6 +131,7 @@ enum Format { FormatBC4, FormatBC5, + FormatBC6H, FormatBC7, FormatLast = 0x7fffffff @@ -414,6 +415,10 @@ static const DXGIFormatToFormat knownDXGIFormat[] = { { DXGIFormatBC5_TYPELESS, FormatBC5 }, { DXGIFormatBC5_UNORM, FormatBC5 }, + { DXGIFormatBC6H_TYPELESS, FormatBC6H }, + { DXGIFormatBC6H_UF16, FormatBC6H }, + { DXGIFormatBC6H_SF16, FormatBC6H }, + { DXGIFormatBC7_TYPELESS, FormatBC7 }, { DXGIFormatBC7_UNORM, FormatBC7 }, { DXGIFormatBC7_UNORM_SRGB, FormatBC7 } @@ -515,6 +520,7 @@ static const FormatName formatNames[] = { { FormatBC4, "BC4" }, { FormatBC5, "BC5" }, + { FormatBC6H, "BC6H" }, { FormatBC7, "BC7" } }; static const size_t formatNamesSize = sizeof(formatNames)/sizeof(FormatName); @@ -1025,6 +1031,43 @@ static QImage readBC4(QDataStream &s, quint32 width, quint32 height) return image; } +/* *** BC6H *** + * Stores three (half-float) channels. It has no alpha channel. + */ +static QImage readBC6H(QDataStream &s, quint32 width, quint32 height, bool isSigned) +{ + QImage image = imageAlloc(width, height, QImage::Format_RGBX16FPx4); + if (image.isNull()) { + return image; + } + + quint8 block[16]; + qfloat16 texel[16 * 3]; + for (quint32 i = 0; i < height; i += 4) { + for (quint32 j = 0; j < width; j += 4) { + if (s.readRawData(reinterpret_cast(block), sizeof(block)) != int(sizeof(block))) + return QImage(); + + bcdec_bc6h_half(block, texel, 4 * 3, isSigned); + + const quint32 kMax = qMin(4, height - i); + const quint32 lMax = qMin(4, width - j); + for (quint32 k = 0; k < kMax; k++) { + qfloat16 *line = reinterpret_cast(image.scanLine(i + k)); + for (quint32 l = 0; l < lMax; l++) { + line[(j + l) * 4] = texel[(k * 4 + l) * 3]; + line[(j + l) * 4 + 1] = texel[(k * 4 + l) * 3 + 1]; + line[(j + l) * 4 + 2] = texel[(k * 4 + l) * 3 + 2]; + line[(j + l) * 4 + 3] = 1; + } + } + } + } + + image.setColorSpace(QColorSpace(QColorSpace::SRgbLinear)); + return image; +} + static QImage readBC7(QDataStream &s, quint32 width, quint32 height) { QImage image = imageAlloc(width, height, QImage::Format_ARGB32); @@ -1782,6 +1825,8 @@ static QImage readLayer(QDataStream &s, const DDSHeader &dds, const int format, return readBC4(s, width, height); case FormatBC5: return readATI2(s, width, height); + case FormatBC6H: + return readBC6H(s, width, height, dds.header10.dxgiFormat == DXGIFormatBC6H_SF16); case FormatBC7: return readBC7(s, width, height); case FormatR16F: @@ -1890,6 +1935,7 @@ static qint64 mipmapSize(const DDSHeader &dds, const int format, const int level case FormatBC4: return ((w + 3)/4) * ((h + 3)/4) * 8; case FormatBC5: + case FormatBC6H: case FormatBC7: return ((w + 3)/4) * ((h + 3)/4) * 16; case FormatD16Lockable: