modifications for v2.5

This commit is contained in:
Richard Geldreich
2026-07-01 13:20:19 -04:00
parent 3cfdd2240b
commit 1093ca17ef
3 changed files with 103 additions and 19 deletions

View File

@@ -1368,27 +1368,51 @@ bool TinyDDS_ReadHeader(TinyDDS_ContextHandle handle) {
return false;
}
// correct for dodgy mipmap levels counts
// rg: The original tinydds mipmap-count "correction" below is WRONG and is
// disabled. For COMPRESSED formats it stopped counting at the 4x4 block size
// (w <= 4 || h <= 4) and truncated mipMapCount there, which drops the perfectly
// valid sub-block mip levels (e.g. 2x2 and 1x1) -- those levels are legal and are
// simply stored padded to a single 4x4 block. ANY DDS file, block-compressed or
// uncompressed, can carry a full mip chain down to 1x1.
//
// Original (incorrect) code:
//
// if(ctx->header.mipMapCount > 1) {
// uint32_t w = ctx->header.width;
// uint32_t h = ctx->header.height;
//
// for(uint32_t i = 0; i < ctx->header.mipMapCount;++i) {
// if (TinyDDS_IsCompressed(ctx->format)) {
// if (w <= 4 || h <= 4) {
// ctx->header.mipMapCount = i + 1;
// break;
// }
// } else if (w <= 1 || h <= 1) {
// ctx->header.mipMapCount = i + 1;
// break;
// }
//
// w = w / 2;
// h = h / 2;
// }
// }
//
// Replacement: count the true maximum number of mip levels for these dimensions
// (halving each axis down to 1x1, for every format) and clamp the header's count
// to it ONLY if the file claims MORE levels than are dimensionally possible.
if(ctx->header.mipMapCount > 1) {
uint32_t w = ctx->header.width;
uint32_t h = ctx->header.height;
for(uint32_t i = 0; i < ctx->header.mipMapCount;++i) {
if (TinyDDS_IsCompressed(ctx->format)) {
if (w <= 4 || h <= 4) {
ctx->header.mipMapCount = i + 1;
break;
}
} else if (w <= 1 || h <= 1) {
ctx->header.mipMapCount = i + 1;
break;
}
w = w / 2;
h = h / 2;
uint32_t maxMipMapCount = 1;
while ((w > 1) || (h > 1)) {
w = (w > 1) ? (w >> 1) : 1;
h = (h > 1) ? (h >> 1) : 1;
maxMipMapCount++;
}
if (ctx->header.mipMapCount > maxMipMapCount)
ctx->header.mipMapCount = maxMipMapCount;
}
if (TinyDDS_IsCompressed(ctx->format)) {

View File

@@ -32,12 +32,16 @@
<ClCompile Include="..\encoder\basisu_astc_hdr_common.cpp" />
<ClCompile Include="..\encoder\basisu_astc_ldr_common.cpp" />
<ClCompile Include="..\encoder\basisu_astc_ldr_encode.cpp" />
<ClCompile Include="..\encoder\basisu_xbc7_encode.cpp" />
<ClCompile Include="..\encoder\basisu_astc_ldr_fencode.cpp" />
<ClCompile Include="..\encoder\basisu_tinyexr.cpp" />
<ClCompile Include="..\encoder\basisu_uastc_hdr_4x4_enc.cpp" />
<ClCompile Include="..\encoder\basisu_backend.cpp" />
<ClCompile Include="..\encoder\basisu_basis_file.cpp" />
<ClCompile Include="..\encoder\basisu_bc7enc.cpp" />
<ClCompile Include="..\encoder\basisu_comp.cpp" />
<ClCompile Include="..\encoder\basisu_bc15_spmd.cpp" />
<ClCompile Include="..\encoder\basisu_bc15_spmd_sse.cpp" />
<ClCompile Include="..\encoder\basisu_enc.cpp" />
<ClCompile Include="..\encoder\basisu_etc.cpp" />
<ClCompile Include="..\encoder\basisu_frontend.cpp" />
@@ -49,6 +53,8 @@
<ClCompile Include="..\encoder\basisu_resample_filters.cpp" />
<ClCompile Include="..\encoder\basisu_ssim.cpp" />
<ClCompile Include="..\encoder\basisu_uastc_enc.cpp" />
<ClCompile Include="..\encoder\basisu_bc7e_scalar.cpp" />
<ClCompile Include="..\encoder\basisu_dds_export.cpp" />
<ClCompile Include="..\encoder\jpgd.cpp" />
<ClCompile Include="..\encoder\pvpngreader.cpp" />
<ClCompile Include="..\transcoder\basisu_transcoder.cpp" />
@@ -62,9 +68,13 @@
<ClInclude Include="..\encoder\basisu_astc_hdr_common.h" />
<ClInclude Include="..\encoder\basisu_astc_ldr_common.h" />
<ClInclude Include="..\encoder\basisu_astc_ldr_encode.h" />
<ClInclude Include="..\encoder\basisu_xbc7_encode.h" />
<ClInclude Include="..\encoder\basisu_astc_ldr_fencode.h" />
<ClInclude Include="..\encoder\basisu_uastc_hdr_4x4_enc.h" />
<ClInclude Include="..\encoder\basisu_backend.h" />
<ClInclude Include="..\encoder\basisu_basis_file.h" />
<ClInclude Include="..\encoder\basisu_bc15_spmd.h" />
<ClInclude Include="..\encoder\basisu_bc15_spmd_kernels.inl" />
<ClInclude Include="..\encoder\basisu_bc7enc.h" />
<ClInclude Include="..\encoder\basisu_comp.h" />
<ClInclude Include="..\encoder\basisu_enc.h" />
@@ -82,6 +92,8 @@
<ClInclude Include="..\encoder\basisu_resampler_filters.h" />
<ClInclude Include="..\encoder\basisu_ssim.h" />
<ClInclude Include="..\encoder\basisu_uastc_enc.h" />
<ClInclude Include="..\encoder\basisu_bc7e_scalar.h" />
<ClInclude Include="..\encoder\basisu_dds_export.h" />
<ClInclude Include="..\encoder\cppspmd_flow.h" />
<ClInclude Include="..\encoder\cppspmd_math.h" />
<ClInclude Include="..\encoder\cppspmd_math_declares.h" />
@@ -99,6 +111,7 @@
<ClInclude Include="..\transcoder\basisu_transcoder.h" />
<ClInclude Include="..\transcoder\basisu_transcoder_internal.h" />
<ClInclude Include="..\transcoder\basisu_transcoder_uastc.h" />
<ClInclude Include="..\transcoder\basisu_xbc7_decoder.h" />
</ItemGroup>
<ItemGroup>
<None Include="..\bin\ocl_kernels.cl" />
@@ -111,6 +124,8 @@
<None Include="..\transcoder\basisu_transcoder_tables_bc7_m5_color.inc" />
<None Include="..\transcoder\basisu_transcoder_tables_dxt1_5.inc" />
<None Include="..\transcoder\basisu_transcoder_tables_dxt1_6.inc" />
<None Include="..\transcoder\basisu_xbc7_decoder.inl" />
<None Include="..\transcoder\basisu_dds_transcoder.inl" />
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
@@ -228,7 +243,7 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions);BASISU_SUPPORT_SSE=1;BASISU_SUPPORT_OPENCL=1;</PreprocessorDefinitions>
<PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions);BASISU_SUPPORT_SSE=1;BASISU_SUPPORT_OPENCL=1;_HAS_EXCEPTIONS=0</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
@@ -246,7 +261,7 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64EC'">
<ClCompile>
<SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions);BASISU_SUPPORT_SSE=0;BASISU_SUPPORT_OPENCL=1;</PreprocessorDefinitions>
<PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions);BASISU_SUPPORT_SSE=0;BASISU_SUPPORT_OPENCL=1;_HAS_EXCEPTIONS=0</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
@@ -266,7 +281,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions);BASISU_SUPPORT_SSE=1;BASISU_SUPPORT_OPENCL=1;</PreprocessorDefinitions>
<PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions);BASISU_SUPPORT_SSE=1;BASISU_SUPPORT_OPENCL=1;_HAS_EXCEPTIONS=0</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
@@ -294,7 +309,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions);BASISU_SUPPORT_SSE=0;BASISU_SUPPORT_OPENCL=1;</PreprocessorDefinitions>
<PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions);BASISU_SUPPORT_SSE=0;BASISU_SUPPORT_OPENCL=1;_HAS_EXCEPTIONS=0</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>

View File

@@ -45,6 +45,12 @@
<ClCompile Include="..\encoder\basisu_comp.cpp">
<Filter>Source Files\encoder</Filter>
</ClCompile>
<ClCompile Include="..\encoder\basisu_bc15_spmd.cpp">
<Filter>Source Files\encoder</Filter>
</ClCompile>
<ClCompile Include="..\encoder\basisu_bc15_spmd_sse.cpp">
<Filter>Source Files\encoder</Filter>
</ClCompile>
<ClCompile Include="..\encoder\basisu_enc.cpp">
<Filter>Source Files\encoder</Filter>
</ClCompile>
@@ -78,6 +84,12 @@
<ClCompile Include="..\encoder\basisu_uastc_enc.cpp">
<Filter>Source Files\encoder</Filter>
</ClCompile>
<ClCompile Include="..\encoder\basisu_bc7e_scalar.cpp">
<Filter>Source Files\encoder</Filter>
</ClCompile>
<ClCompile Include="..\encoder\basisu_dds_export.cpp">
<Filter>Source Files\encoder</Filter>
</ClCompile>
<ClCompile Include="..\encoder\jpgd.cpp">
<Filter>Source Files\encoder</Filter>
</ClCompile>
@@ -102,9 +114,15 @@
<ClCompile Include="..\encoder\basisu_astc_ldr_encode.cpp">
<Filter>Source Files\encoder</Filter>
</ClCompile>
<ClCompile Include="..\encoder\basisu_xbc7_encode.cpp">
<Filter>Source Files\encoder</Filter>
</ClCompile>
<ClCompile Include="..\encoder\basisu_tinyexr.cpp">
<Filter>Source Files\encoder</Filter>
</ClCompile>
<ClCompile Include="..\encoder\basisu_astc_ldr_fencode.cpp">
<Filter>Source Files\encoder</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\transcoder\basisu_astc_helpers.h">
@@ -158,6 +176,12 @@
<ClInclude Include="..\encoder\basisu_basis_file.h">
<Filter>Source Files\encoder</Filter>
</ClInclude>
<ClInclude Include="..\encoder\basisu_bc15_spmd.h">
<Filter>Source Files\encoder</Filter>
</ClInclude>
<ClInclude Include="..\encoder\basisu_bc15_spmd_kernels.inl">
<Filter>Source Files\encoder</Filter>
</ClInclude>
<ClInclude Include="..\encoder\basisu_bc7enc.h">
<Filter>Source Files\encoder</Filter>
</ClInclude>
@@ -206,6 +230,12 @@
<ClInclude Include="..\encoder\basisu_uastc_enc.h">
<Filter>Source Files\encoder</Filter>
</ClInclude>
<ClInclude Include="..\encoder\basisu_bc7e_scalar.h">
<Filter>Source Files\encoder</Filter>
</ClInclude>
<ClInclude Include="..\encoder\basisu_dds_export.h">
<Filter>Source Files\encoder</Filter>
</ClInclude>
<ClInclude Include="..\encoder\jpgd.h">
<Filter>Source Files\encoder</Filter>
</ClInclude>
@@ -236,9 +266,18 @@
<ClInclude Include="..\encoder\basisu_astc_ldr_encode.h">
<Filter>Source Files\encoder</Filter>
</ClInclude>
<ClInclude Include="..\encoder\basisu_xbc7_encode.h">
<Filter>Source Files\encoder</Filter>
</ClInclude>
<ClInclude Include="..\transcoder\basisu_idct.h">
<Filter>Source Files\transcoder</Filter>
</ClInclude>
<ClInclude Include="..\encoder\basisu_astc_ldr_fencode.h">
<Filter>Source Files\encoder</Filter>
</ClInclude>
<ClInclude Include="..\transcoder\basisu_xbc7_decoder.h">
<Filter>Source Files\transcoder</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\transcoder\basisu_transcoder_tables_astc.inc">
@@ -271,5 +310,11 @@
<None Include="..\transcoder\basisu_astc_cfgs.inl">
<Filter>Source Files\transcoder</Filter>
</None>
<None Include="..\transcoder\basisu_xbc7_decoder.inl">
<Filter>Source Files\transcoder</Filter>
</None>
<None Include="..\transcoder\basisu_dds_transcoder.inl">
<Filter>Source Files\transcoder</Filter>
</None>
</ItemGroup>
</Project>