Skip to content

Commit f318d60

Browse files
committed
Merge pull request godotengine#65376 from reduz/astc-support
Implement basic ASTC support
2 parents ed65738 + 71d21c7 commit f318d60

File tree

5 files changed

+153
-16
lines changed

5 files changed

+153
-16
lines changed

core/io/image.cpp

+50-6
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,14 @@ int Image::get_format_pixel_size(Format p_format) {
173173
return 1;
174174
case FORMAT_DXT5_RA_AS_RG:
175175
return 1;
176+
case FORMAT_ASTC_4x4:
177+
return 1;
178+
case FORMAT_ASTC_4x4_HDR:
179+
return 1;
180+
case FORMAT_ASTC_8x8:
181+
return 1;
182+
case FORMAT_ASTC_8x8_HDR:
183+
return 1;
176184
case FORMAT_MAX: {
177185
}
178186
}
@@ -213,7 +221,18 @@ void Image::get_format_min_pixel_size(Format p_format, int &r_w, int &r_h) {
213221
r_h = 4;
214222

215223
} break;
224+
case FORMAT_ASTC_4x4:
225+
case FORMAT_ASTC_4x4_HDR: {
226+
r_w = 4;
227+
r_h = 4;
228+
229+
} break;
230+
case FORMAT_ASTC_8x8:
231+
case FORMAT_ASTC_8x8_HDR: {
232+
r_w = 8;
233+
r_h = 8;
216234

235+
} break;
217236
default: {
218237
r_w = 1;
219238
r_h = 1;
@@ -222,7 +241,9 @@ void Image::get_format_min_pixel_size(Format p_format, int &r_w, int &r_h) {
222241
}
223242

224243
int Image::get_format_pixel_rshift(Format p_format) {
225-
if (p_format == FORMAT_DXT1 || p_format == FORMAT_RGTC_R || p_format == FORMAT_ETC || p_format == FORMAT_ETC2_R11 || p_format == FORMAT_ETC2_R11S || p_format == FORMAT_ETC2_RGB8 || p_format == FORMAT_ETC2_RGB8A1) {
244+
if (p_format == FORMAT_ASTC_8x8) {
245+
return 2;
246+
} else if (p_format == FORMAT_DXT1 || p_format == FORMAT_RGTC_R || p_format == FORMAT_ETC || p_format == FORMAT_ETC2_R11 || p_format == FORMAT_ETC2_R11S || p_format == FORMAT_ETC2_RGB8 || p_format == FORMAT_ETC2_RGB8A1) {
226247
return 1;
227248
} else {
228249
return 0;
@@ -260,6 +281,14 @@ int Image::get_format_block_size(Format p_format) {
260281
{
261282
return 4;
262283
}
284+
case FORMAT_ASTC_4x4:
285+
case FORMAT_ASTC_4x4_HDR: {
286+
return 4;
287+
}
288+
case FORMAT_ASTC_8x8:
289+
case FORMAT_ASTC_8x8_HDR: {
290+
return 8;
291+
}
263292
default: {
264293
}
265294
}
@@ -2581,19 +2610,21 @@ Error Image::decompress() {
25812610
_image_decompress_etc1(this);
25822611
} else if (format >= FORMAT_ETC2_R11 && format <= FORMAT_ETC2_RA_AS_RG && _image_decompress_etc2) {
25832612
_image_decompress_etc2(this);
2613+
} else if (format >= FORMAT_ASTC_4x4 && format <= FORMAT_ASTC_8x8_HDR && _image_decompress_astc) {
2614+
_image_decompress_astc(this);
25842615
} else {
25852616
return ERR_UNAVAILABLE;
25862617
}
25872618
return OK;
25882619
}
25892620

2590-
Error Image::compress(CompressMode p_mode, CompressSource p_source, float p_lossy_quality) {
2621+
Error Image::compress(CompressMode p_mode, CompressSource p_source, float p_lossy_quality, ASTCFormat p_astc_format) {
25912622
ERR_FAIL_INDEX_V_MSG(p_mode, COMPRESS_MAX, ERR_INVALID_PARAMETER, "Invalid compress mode.");
25922623
ERR_FAIL_INDEX_V_MSG(p_source, COMPRESS_SOURCE_MAX, ERR_INVALID_PARAMETER, "Invalid compress source.");
2593-
return compress_from_channels(p_mode, detect_used_channels(p_source), p_lossy_quality);
2624+
return compress_from_channels(p_mode, detect_used_channels(p_source), p_lossy_quality, p_astc_format);
25942625
}
25952626

2596-
Error Image::compress_from_channels(CompressMode p_mode, UsedChannels p_channels, float p_lossy_quality) {
2627+
Error Image::compress_from_channels(CompressMode p_mode, UsedChannels p_channels, float p_lossy_quality, ASTCFormat p_astc_format) {
25972628
switch (p_mode) {
25982629
case COMPRESS_S3TC: {
25992630
ERR_FAIL_COND_V(!_image_compress_bc_func, ERR_UNAVAILABLE);
@@ -2611,6 +2642,10 @@ Error Image::compress_from_channels(CompressMode p_mode, UsedChannels p_channels
26112642
ERR_FAIL_COND_V(!_image_compress_bptc_func, ERR_UNAVAILABLE);
26122643
_image_compress_bptc_func(this, p_lossy_quality, p_channels);
26132644
} break;
2645+
case COMPRESS_ASTC: {
2646+
ERR_FAIL_COND_V(!_image_compress_bptc_func, ERR_UNAVAILABLE);
2647+
_image_compress_astc_func(this, p_lossy_quality, p_astc_format);
2648+
} break;
26142649
case COMPRESS_MAX: {
26152650
ERR_FAIL_V(ERR_INVALID_PARAMETER);
26162651
} break;
@@ -2967,10 +3002,12 @@ void (*Image::_image_compress_bc_func)(Image *, float, Image::UsedChannels) = nu
29673002
void (*Image::_image_compress_bptc_func)(Image *, float, Image::UsedChannels) = nullptr;
29683003
void (*Image::_image_compress_etc1_func)(Image *, float) = nullptr;
29693004
void (*Image::_image_compress_etc2_func)(Image *, float, Image::UsedChannels) = nullptr;
3005+
void (*Image::_image_compress_astc_func)(Image *, float, Image::ASTCFormat) = nullptr;
29703006
void (*Image::_image_decompress_bc)(Image *) = nullptr;
29713007
void (*Image::_image_decompress_bptc)(Image *) = nullptr;
29723008
void (*Image::_image_decompress_etc1)(Image *) = nullptr;
29733009
void (*Image::_image_decompress_etc2)(Image *) = nullptr;
3010+
void (*Image::_image_decompress_astc)(Image *) = nullptr;
29743011

29753012
Vector<uint8_t> (*Image::webp_lossy_packer)(const Ref<Image> &, float) = nullptr;
29763013
Vector<uint8_t> (*Image::webp_lossless_packer)(const Ref<Image> &) = nullptr;
@@ -3387,8 +3424,8 @@ void Image::_bind_methods() {
33873424
ClassDB::bind_method(D_METHOD("is_invisible"), &Image::is_invisible);
33883425

33893426
ClassDB::bind_method(D_METHOD("detect_used_channels", "source"), &Image::detect_used_channels, DEFVAL(COMPRESS_SOURCE_GENERIC));
3390-
ClassDB::bind_method(D_METHOD("compress", "mode", "source", "lossy_quality"), &Image::compress, DEFVAL(COMPRESS_SOURCE_GENERIC), DEFVAL(0.7));
3391-
ClassDB::bind_method(D_METHOD("compress_from_channels", "mode", "channels", "lossy_quality"), &Image::compress_from_channels, DEFVAL(0.7));
3427+
ClassDB::bind_method(D_METHOD("compress", "mode", "source", "lossy_quality", "astc_format"), &Image::compress, DEFVAL(COMPRESS_SOURCE_GENERIC), DEFVAL(0.7), DEFVAL(ASTC_FORMAT_4x4));
3428+
ClassDB::bind_method(D_METHOD("compress_from_channels", "mode", "channels", "lossy_quality", "astc_format"), &Image::compress_from_channels, DEFVAL(0.7), DEFVAL(ASTC_FORMAT_4x4));
33923429
ClassDB::bind_method(D_METHOD("decompress"), &Image::decompress);
33933430
ClassDB::bind_method(D_METHOD("is_compressed"), &Image::is_compressed);
33943431

@@ -3472,6 +3509,10 @@ void Image::_bind_methods() {
34723509
BIND_ENUM_CONSTANT(FORMAT_ETC2_RGB8A1);
34733510
BIND_ENUM_CONSTANT(FORMAT_ETC2_RA_AS_RG);
34743511
BIND_ENUM_CONSTANT(FORMAT_DXT5_RA_AS_RG);
3512+
BIND_ENUM_CONSTANT(FORMAT_ASTC_4x4);
3513+
BIND_ENUM_CONSTANT(FORMAT_ASTC_4x4_HDR);
3514+
BIND_ENUM_CONSTANT(FORMAT_ASTC_8x8);
3515+
BIND_ENUM_CONSTANT(FORMAT_ASTC_8x8_HDR);
34753516
BIND_ENUM_CONSTANT(FORMAT_MAX);
34763517

34773518
BIND_ENUM_CONSTANT(INTERPOLATE_NEAREST);
@@ -3499,6 +3540,9 @@ void Image::_bind_methods() {
34993540
BIND_ENUM_CONSTANT(COMPRESS_SOURCE_GENERIC);
35003541
BIND_ENUM_CONSTANT(COMPRESS_SOURCE_SRGB);
35013542
BIND_ENUM_CONSTANT(COMPRESS_SOURCE_NORMAL);
3543+
3544+
BIND_ENUM_CONSTANT(ASTC_FORMAT_4x4);
3545+
BIND_ENUM_CONSTANT(ASTC_FORMAT_8x8);
35023546
}
35033547

35043548
void Image::set_compress_bc_func(void (*p_compress_func)(Image *, float, UsedChannels)) {

core/io/image.h

+15-2
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ class Image : public Resource {
109109
FORMAT_ETC2_RGB8A1,
110110
FORMAT_ETC2_RA_AS_RG, //used to make basis universal happy
111111
FORMAT_DXT5_RA_AS_RG, //used to make basis universal happy
112+
FORMAT_ASTC_4x4,
113+
FORMAT_ASTC_4x4_HDR,
114+
FORMAT_ASTC_8x8,
115+
FORMAT_ASTC_8x8_HDR,
112116
FORMAT_MAX
113117
};
114118

@@ -134,6 +138,11 @@ class Image : public Resource {
134138
};
135139
//some functions provided by something else
136140

141+
enum ASTCFormat {
142+
ASTC_FORMAT_4x4,
143+
ASTC_FORMAT_8x8,
144+
};
145+
137146
static ImageMemLoadFunc _png_mem_loader_func;
138147
static ImageMemLoadFunc _jpg_mem_loader_func;
139148
static ImageMemLoadFunc _webp_mem_loader_func;
@@ -144,11 +153,13 @@ class Image : public Resource {
144153
static void (*_image_compress_bptc_func)(Image *, float p_lossy_quality, UsedChannels p_channels);
145154
static void (*_image_compress_etc1_func)(Image *, float);
146155
static void (*_image_compress_etc2_func)(Image *, float, UsedChannels p_channels);
156+
static void (*_image_compress_astc_func)(Image *, float, ASTCFormat p_format);
147157

148158
static void (*_image_decompress_bc)(Image *);
149159
static void (*_image_decompress_bptc)(Image *);
150160
static void (*_image_decompress_etc1)(Image *);
151161
static void (*_image_decompress_etc2)(Image *);
162+
static void (*_image_decompress_astc)(Image *);
152163

153164
static Vector<uint8_t> (*webp_lossy_packer)(const Ref<Image> &p_image, float p_quality);
154165
static Vector<uint8_t> (*webp_lossless_packer)(const Ref<Image> &p_image);
@@ -347,6 +358,7 @@ class Image : public Resource {
347358
COMPRESS_ETC,
348359
COMPRESS_ETC2,
349360
COMPRESS_BPTC,
361+
COMPRESS_ASTC,
350362
COMPRESS_MAX,
351363
};
352364
enum CompressSource {
@@ -356,8 +368,8 @@ class Image : public Resource {
356368
COMPRESS_SOURCE_MAX,
357369
};
358370

359-
Error compress(CompressMode p_mode, CompressSource p_source = COMPRESS_SOURCE_GENERIC, float p_lossy_quality = 0.7);
360-
Error compress_from_channels(CompressMode p_mode, UsedChannels p_channels, float p_lossy_quality = 0.7);
371+
Error compress(CompressMode p_mode, CompressSource p_source = COMPRESS_SOURCE_GENERIC, float p_lossy_quality = 0.7, ASTCFormat p_astc_format = ASTC_FORMAT_4x4);
372+
Error compress_from_channels(CompressMode p_mode, UsedChannels p_channels, float p_lossy_quality = 0.7, ASTCFormat p_astc_format = ASTC_FORMAT_4x4);
361373
Error decompress();
362374
bool is_compressed() const;
363375

@@ -429,5 +441,6 @@ VARIANT_ENUM_CAST(Image::CompressSource)
429441
VARIANT_ENUM_CAST(Image::UsedChannels)
430442
VARIANT_ENUM_CAST(Image::AlphaMode)
431443
VARIANT_ENUM_CAST(Image::RoughnessChannel)
444+
VARIANT_ENUM_CAST(Image::ASTCFormat)
432445

433446
#endif // IMAGE_H

doc/classes/Image.xml

+29-2
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,25 @@
7676
<param index="0" name="mode" type="int" enum="Image.CompressMode" />
7777
<param index="1" name="source" type="int" enum="Image.CompressSource" default="0" />
7878
<param index="2" name="lossy_quality" type="float" default="0.7" />
79+
<param index="3" name="astc_format" type="int" enum="Image.ASTCFormat" default="0" />
7980
<description>
80-
Compresses the image to use less memory. Can not directly access pixel data while the image is compressed. Returns error if the chosen compression mode is not available. See [enum CompressMode] and [enum CompressSource] constants.
81+
Compresses the image to use less memory. Can not directly access pixel data while the image is compressed. Returns error if the chosen compression mode is not available.
82+
The [param mode] parameter helps to pick the best compression method for DXT and ETC2 formats. It is ignored for ASTC compression.
83+
The [param lossy_quality] parameter is optional for compressors that support it.
84+
For ASTC compression, the [param astc_format] parameter must be supplied.
8185
</description>
8286
</method>
8387
<method name="compress_from_channels">
8488
<return type="int" enum="Error" />
8589
<param index="0" name="mode" type="int" enum="Image.CompressMode" />
8690
<param index="1" name="channels" type="int" enum="Image.UsedChannels" />
8791
<param index="2" name="lossy_quality" type="float" default="0.7" />
92+
<param index="3" name="astc_format" type="int" enum="Image.ASTCFormat" default="0" />
8893
<description>
94+
Compresses the image to use less memory. Can not directly access pixel data while the image is compressed. Returns error if the chosen compression mode is not available.
95+
This is an alternative to [method compress] that lets the user supply the channels used in order for the compressor to pick the best DXT and ETC2 formats. For other formats (non DXT or ETC2), this argument is ignored.
96+
The [param lossy_quality] parameter is optional for compressors that support it.
97+
For ASTC compression, the [param astc_format] parameter must be supplied.
8998
</description>
9099
</method>
91100
<method name="compute_image_metrics">
@@ -658,7 +667,19 @@
658667
</constant>
659668
<constant name="FORMAT_DXT5_RA_AS_RG" value="34" enum="Format">
660669
</constant>
661-
<constant name="FORMAT_MAX" value="35" enum="Format">
670+
<constant name="FORMAT_ASTC_4x4" value="35" enum="Format">
671+
[url=https://en.wikipedia.org/wiki/Adaptive_scalable_texture_compression]Adaptive Scalable Texutre Compression[/url]. This implements the 4x4 (high quality) mode.
672+
</constant>
673+
<constant name="FORMAT_ASTC_4x4_HDR" value="36" enum="Format">
674+
Same format as [constant FORMAT_ASTC_4x4], but with the hint to let the GPU know it is used for HDR.
675+
</constant>
676+
<constant name="FORMAT_ASTC_8x8" value="37" enum="Format">
677+
[url=https://en.wikipedia.org/wiki/Adaptive_scalable_texture_compression]Adaptive Scalable Texutre Compression[/url]. This implements the 8x8 (low quality) mode.
678+
</constant>
679+
<constant name="FORMAT_ASTC_8x8_HDR" value="38" enum="Format">
680+
Same format as [constant FORMAT_ASTC_8x8], but with the hint to let the GPU know it is used for HDR.
681+
</constant>
682+
<constant name="FORMAT_MAX" value="39" enum="Format">
662683
Represents the size of the [enum Format] enum.
663684
</constant>
664685
<constant name="INTERPOLATE_NEAREST" value="0" enum="Interpolation">
@@ -722,5 +743,11 @@
722743
<constant name="COMPRESS_SOURCE_NORMAL" value="2" enum="CompressSource">
723744
Source texture (before compression) is a normal texture (e.g. it can be compressed into two channels).
724745
</constant>
746+
<constant name="ASTC_FORMAT_4x4" value="0" enum="ASTCFormat">
747+
Hint to indicate that the high quality 4x4 ASTC compression format should be used.
748+
</constant>
749+
<constant name="ASTC_FORMAT_8x8" value="1" enum="ASTCFormat">
750+
Hint to indicate that the low quality 8x8 ASTC compression format should be used.
751+
</constant>
725752
</constants>
726753
</class>

drivers/vulkan/rendering_device_vulkan.cpp

+19-6
Original file line numberDiff line numberDiff line change
@@ -995,8 +995,11 @@ void RenderingDeviceVulkan::get_compressed_image_format_block_dimensions(DataFor
995995
case DATA_FORMAT_EAC_R11G11_UNORM_BLOCK:
996996
case DATA_FORMAT_EAC_R11G11_SNORM_BLOCK:
997997
case DATA_FORMAT_ASTC_4x4_UNORM_BLOCK: // Again, not sure about astc.
998-
case DATA_FORMAT_ASTC_4x4_SRGB_BLOCK:
999-
case DATA_FORMAT_ASTC_5x4_UNORM_BLOCK:
998+
case DATA_FORMAT_ASTC_4x4_SRGB_BLOCK: {
999+
r_w = 4;
1000+
r_h = 4;
1001+
} break;
1002+
case DATA_FORMAT_ASTC_5x4_UNORM_BLOCK: // Unsupported
10001003
case DATA_FORMAT_ASTC_5x4_SRGB_BLOCK:
10011004
case DATA_FORMAT_ASTC_5x5_UNORM_BLOCK:
10021005
case DATA_FORMAT_ASTC_5x5_SRGB_BLOCK:
@@ -1007,10 +1010,16 @@ void RenderingDeviceVulkan::get_compressed_image_format_block_dimensions(DataFor
10071010
case DATA_FORMAT_ASTC_8x5_UNORM_BLOCK:
10081011
case DATA_FORMAT_ASTC_8x5_SRGB_BLOCK:
10091012
case DATA_FORMAT_ASTC_8x6_UNORM_BLOCK:
1010-
case DATA_FORMAT_ASTC_8x6_SRGB_BLOCK:
1013+
case DATA_FORMAT_ASTC_8x6_SRGB_BLOCK: {
1014+
r_w = 4;
1015+
r_h = 4;
1016+
} break;
10111017
case DATA_FORMAT_ASTC_8x8_UNORM_BLOCK:
1012-
case DATA_FORMAT_ASTC_8x8_SRGB_BLOCK:
1013-
case DATA_FORMAT_ASTC_10x5_UNORM_BLOCK:
1018+
case DATA_FORMAT_ASTC_8x8_SRGB_BLOCK: {
1019+
r_w = 8;
1020+
r_h = 8;
1021+
} break;
1022+
case DATA_FORMAT_ASTC_10x5_UNORM_BLOCK: // Unsupported
10141023
case DATA_FORMAT_ASTC_10x5_SRGB_BLOCK:
10151024
case DATA_FORMAT_ASTC_10x6_UNORM_BLOCK:
10161025
case DATA_FORMAT_ASTC_10x6_SRGB_BLOCK:
@@ -1100,7 +1109,7 @@ uint32_t RenderingDeviceVulkan::get_compressed_image_format_block_byte_size(Data
11001109
case DATA_FORMAT_ASTC_12x10_SRGB_BLOCK:
11011110
case DATA_FORMAT_ASTC_12x12_UNORM_BLOCK:
11021111
case DATA_FORMAT_ASTC_12x12_SRGB_BLOCK:
1103-
return 8; // Wrong.
1112+
return 16;
11041113
default: {
11051114
}
11061115
}
@@ -1122,6 +1131,10 @@ uint32_t RenderingDeviceVulkan::get_compressed_image_format_pixel_rshift(DataFor
11221131
case DATA_FORMAT_EAC_R11_UNORM_BLOCK:
11231132
case DATA_FORMAT_EAC_R11_SNORM_BLOCK:
11241133
return 1;
1134+
case DATA_FORMAT_ASTC_8x8_SRGB_BLOCK:
1135+
case DATA_FORMAT_ASTC_8x8_UNORM_BLOCK: {
1136+
return 2;
1137+
}
11251138
default: {
11261139
}
11271140
}

servers/rendering/renderer_rd/storage_rd/texture_storage.cpp

+40
Original file line numberDiff line numberDiff line change
@@ -1777,6 +1777,46 @@ Ref<Image> TextureStorage::_validate_texture_format(const Ref<Image> &p_image, T
17771777
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_ZERO;
17781778
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_ONE;
17791779
} break;
1780+
case Image::FORMAT_ASTC_4x4:
1781+
case Image::FORMAT_ASTC_4x4_HDR: {
1782+
if (RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_ASTC_4x4_UNORM_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_UPDATE_BIT)) {
1783+
r_format.format = RD::DATA_FORMAT_ASTC_4x4_UNORM_BLOCK;
1784+
if (p_image->get_format() == Image::FORMAT_ASTC_4x4) {
1785+
r_format.format_srgb = RD::DATA_FORMAT_ASTC_4x4_SRGB_BLOCK;
1786+
}
1787+
} else {
1788+
//not supported, reconvert
1789+
r_format.format = RD::DATA_FORMAT_R8G8B8A8_UNORM;
1790+
r_format.format_srgb = RD::DATA_FORMAT_R8G8B8A8_SRGB;
1791+
image->decompress();
1792+
image->convert(Image::FORMAT_RGBA8);
1793+
}
1794+
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
1795+
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
1796+
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
1797+
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
1798+
1799+
} break; // astc 4x4
1800+
case Image::FORMAT_ASTC_8x8:
1801+
case Image::FORMAT_ASTC_8x8_HDR: {
1802+
if (RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_UPDATE_BIT)) {
1803+
r_format.format = RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK;
1804+
if (p_image->get_format() == Image::FORMAT_ASTC_8x8) {
1805+
r_format.format_srgb = RD::DATA_FORMAT_ASTC_8x8_SRGB_BLOCK;
1806+
}
1807+
} else {
1808+
//not supported, reconvert
1809+
r_format.format = RD::DATA_FORMAT_R8G8B8A8_UNORM;
1810+
r_format.format_srgb = RD::DATA_FORMAT_R8G8B8A8_SRGB;
1811+
image->decompress();
1812+
image->convert(Image::FORMAT_RGBA8);
1813+
}
1814+
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
1815+
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
1816+
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
1817+
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
1818+
1819+
} break; // astc 8x8
17801820

17811821
default: {
17821822
}

0 commit comments

Comments
 (0)