Skip to content

Commit 8e1fa57

Browse files
committed
Merge pull request #88676 from BlueCube3310/basisu-resolution-fix
BasisUniversal: Fix texture decompression
2 parents 15bb860 + 0c596df commit 8e1fa57

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

modules/basis_universal/image_compress_basisu.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ Ref<Image> basis_universal_unpacker_ptr(const uint8_t *p_data, int p_size) {
158158
bool s3tc_supported = RS::get_singleton()->has_os_feature("s3tc");
159159
bool etc2_supported = RS::get_singleton()->has_os_feature("etc2");
160160

161+
bool needs_ra_rg_swap = false;
162+
161163
switch (*(uint32_t *)(src_ptr)) {
162164
case BASIS_DECOMPRESS_RG: {
163165
// RGTC transcoding is currently performed with RG_AS_RA, fail.
@@ -213,6 +215,7 @@ Ref<Image> basis_universal_unpacker_ptr(const uint8_t *p_data, int p_size) {
213215
// No supported VRAM compression formats, decompress.
214216
basisu_format = basist::transcoder_texture_format::cTFRGBA32;
215217
image_format = Image::FORMAT_RGBA8;
218+
needs_ra_rg_swap = true;
216219
}
217220
} break;
218221
}
@@ -228,6 +231,7 @@ Ref<Image> basis_universal_unpacker_ptr(const uint8_t *p_data, int p_size) {
228231
basist::basisu_image_info basisu_info;
229232
transcoder.get_image_info(src_ptr, src_size, basisu_info, 0);
230233

234+
// Create the buffer for transcoded/decompressed data.
231235
Vector<uint8_t> out_data;
232236
out_data.resize(Image::get_image_data_size(basisu_info.m_width, basisu_info.m_height, image_format, basisu_info.m_total_levels > 1));
233237

@@ -239,8 +243,10 @@ Ref<Image> basis_universal_unpacker_ptr(const uint8_t *p_data, int p_size) {
239243
basist::basisu_image_level_info basisu_level;
240244
transcoder.get_image_level_info(src_ptr, src_size, basisu_level, 0, i);
241245

246+
uint32_t mip_block_or_pixel_count = image_format >= Image::FORMAT_DXT1 ? basisu_level.m_total_blocks : basisu_level.m_orig_width * basisu_level.m_orig_height;
242247
int ofs = Image::get_image_mipmap_offset(basisu_info.m_width, basisu_info.m_height, image_format, i);
243-
bool result = transcoder.transcode_image_level(src_ptr, src_size, 0, i, dst + ofs, basisu_level.m_total_blocks, basisu_format);
248+
249+
bool result = transcoder.transcode_image_level(src_ptr, src_size, 0, i, dst + ofs, mip_block_or_pixel_count, basisu_format);
244250

245251
if (!result) {
246252
print_line(vformat("BasisUniversal cannot unpack level %d.", i));
@@ -250,6 +256,11 @@ Ref<Image> basis_universal_unpacker_ptr(const uint8_t *p_data, int p_size) {
250256

251257
image = Image::create_from_data(basisu_info.m_width, basisu_info.m_height, basisu_info.m_total_levels > 1, image_format, out_data);
252258

259+
if (needs_ra_rg_swap) {
260+
// Swap uncompressed RA-as-RG texture's color channels.
261+
image->convert_ra_rgba8_to_rg();
262+
}
263+
253264
return image;
254265
}
255266

0 commit comments

Comments
 (0)