From 88a9fcd142c8d98d013dbed2b9adf37dfe965b83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tur=C3=A1nszki=20J=C3=A1nos?= Date: Mon, 3 Jul 2023 10:39:45 +0200 Subject: [PATCH] force alignment of mip levels for block compressible imported textures by reducing mipcount if necessary --- WickedEngine/wiGraphics.h | 8 +++++++- WickedEngine/wiResourceManager.cpp | 2 +- WickedEngine/wiVersion.cpp | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/WickedEngine/wiGraphics.h b/WickedEngine/wiGraphics.h index 72972d1b6..c18aa598f 100644 --- a/WickedEngine/wiGraphics.h +++ b/WickedEngine/wiGraphics.h @@ -1729,7 +1729,7 @@ namespace wi::graphics { return ((value + alignment - 1) / alignment) * alignment; } - constexpr uint32_t GetMipCount(uint32_t width, uint32_t height, uint32_t depth = 1u, uint32_t min_dimension = 1u) + constexpr uint32_t GetMipCount(uint32_t width, uint32_t height, uint32_t depth = 1u, uint32_t min_dimension = 1u, uint32_t required_alignment = 1u) { uint32_t mips = 1; while (width > min_dimension || height > min_dimension || depth > min_dimension) @@ -1737,6 +1737,12 @@ namespace wi::graphics width = std::max(min_dimension, width >> 1u); height = std::max(min_dimension, height >> 1u); depth = std::max(min_dimension, depth >> 1u); + if ( + AlignTo(width, required_alignment) != width || + AlignTo(height, required_alignment) != height || + AlignTo(depth, required_alignment) != depth + ) + break; mips++; } return mips; diff --git a/WickedEngine/wiResourceManager.cpp b/WickedEngine/wiResourceManager.cpp index bbfec7b77..885fcb94a 100644 --- a/WickedEngine/wiResourceManager.cpp +++ b/WickedEngine/wiResourceManager.cpp @@ -934,7 +934,7 @@ namespace wi const uint32_t block_size = GetFormatBlockSize(desc.format); desc.width = AlignTo(desc.width, block_size); desc.height = AlignTo(desc.height, block_size); - desc.mip_levels = GetMipCount(desc.width, desc.height, desc.depth, block_size); + desc.mip_levels = GetMipCount(desc.width, desc.height, desc.depth, block_size, block_size); success = device->CreateTexture(&desc, nullptr, &resource->texture); device->SetName(&resource->texture, name.c_str()); diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 1a8594768..f50c043b3 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 71; // minor bug fixes, alterations, refactors, updates - const int revision = 238; + const int revision = 239; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);