Skip to content

Commit ca6b8a7

Browse files
committed
ktx: support the same etc2 formats available in amd compressonator
1 parent 42b66db commit ca6b8a7

File tree

5 files changed

+73
-99
lines changed

5 files changed

+73
-99
lines changed

code/bmpman/bmpman.cpp

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,14 +1059,20 @@ int bm_is_compressed(int num) {
10591059
case BM_TYPE_ETC2_RGB:
10601060
return KTX_ETC2_RGB;
10611061

1062+
case BM_TYPE_ETC2_SRGB:
1063+
return KTX_ETC2_SRGB;
1064+
10621065
case BM_TYPE_ETC2_RGBA_EAC:
10631066
return KTX_ETC2_RGBA_EAC;
10641067

1065-
case BM_TYPE_EAC_R11:
1066-
return KTX_EAC_R11;
1068+
case BM_TYPE_ETC2_SRGBA_EAC:
1069+
return KTX_ETC2_SRGBA_EAC;
1070+
1071+
case BM_TYPE_ETC2_RGBA1:
1072+
return KTX_ETC2_RGB_A1;
10671073

1068-
case BM_TYPE_EAC_RG11:
1069-
return KTX_EAC_RG11;
1074+
case BM_TYPE_ETC2_SRGBA1:
1075+
return KTX_ETC2_SRGB_A1;
10701076

10711077
default:
10721078
return 0;
@@ -2797,19 +2803,18 @@ void bm_page_in_texture(int bitmapnum, int nframes) {
27972803
continue;
27982804

27992805
case BM_TYPE_ETC2_RGB:
2800-
frame_entry->used_flags = BMP_TEX_ETC2_RGB;
2801-
continue;
2802-
2803-
case BM_TYPE_ETC2_RGBA_EAC:
2804-
frame_entry->used_flags = BMP_TEX_ETC2_RGBA_EAC;
2806+
case BM_TYPE_ETC2_SRGB:
2807+
frame_entry->used_flags = BMP_TEX_ETC2_RGB8;
28052808
continue;
28062809

2807-
case BM_TYPE_EAC_R11:
2808-
frame_entry->used_flags = BMP_TEX_EAC_R11;
2810+
case BM_TYPE_ETC2_RGBA1:
2811+
case BM_TYPE_ETC2_SRGBA1:
2812+
frame_entry->used_flags = BMP_TEX_ETC2_RGBA1;
28092813
continue;
28102814

2811-
case BM_TYPE_EAC_RG11:
2812-
frame_entry->used_flags = BMP_TEX_EAC_RG11;
2815+
case BM_TYPE_ETC2_RGBA_EAC:
2816+
case BM_TYPE_ETC2_SRGBA_EAC:
2817+
frame_entry->used_flags = BMP_TEX_ETC2_RGBA8;
28132818
continue;
28142819

28152820
default:
@@ -2858,19 +2863,18 @@ void bm_page_in_xparent_texture(int bitmapnum, int nframes) {
28582863
continue;
28592864

28602865
case BM_TYPE_ETC2_RGB:
2861-
entry->used_flags = BMP_TEX_ETC2_RGB;
2866+
case BM_TYPE_ETC2_SRGB:
2867+
entry->used_flags = BMP_TEX_ETC2_RGB8;
28622868
continue;
28632869

2864-
case BM_TYPE_ETC2_RGBA_EAC:
2865-
entry->used_flags = BMP_TEX_ETC2_RGBA_EAC;
2870+
case BM_TYPE_ETC2_RGBA1:
2871+
case BM_TYPE_ETC2_SRGBA1:
2872+
entry->used_flags = BMP_TEX_ETC2_RGBA1;
28662873
continue;
28672874

2868-
case BM_TYPE_EAC_R11:
2869-
entry->used_flags = BMP_TEX_EAC_R11;
2870-
continue;
2871-
2872-
case BM_TYPE_EAC_RG11:
2873-
entry->used_flags = BMP_TEX_EAC_RG11;
2875+
case BM_TYPE_ETC2_RGBA_EAC:
2876+
case BM_TYPE_ETC2_SRGBA_EAC:
2877+
entry->used_flags = BMP_TEX_ETC2_RGBA8;
28742878
continue;
28752879

28762880
default:

code/bmpman/bmpman.h

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
// Flag positions for bitmap.flags
3636
// ***** NOTE: bitmap.flags is an 8-bit value, no more BMP_TEX_* flags can be added unless the type is changed!! ******
37-
// Update: type changed to 16-bit
37+
// Update: bitmap.flags type changed to 16-bit
3838
#define BMP_AABITMAP (1<<0) //!< antialiased bitmap
3939
#define BMP_TEX_XPARENT (1<<1) //!< transparent texture
4040
#define BMP_TEX_OTHER (1<<2) //!< so we can identify all "normal" textures
@@ -44,14 +44,14 @@
4444
#define BMP_TEX_BC7 (1<<6) //!< BC7 compressed 8r8g8b8a (32bit)
4545
#define BMP_TEX_CUBEMAP (1<<7) //!< a texture made for cubic environment map
4646
#define BMP_MASK_BITMAP (1<<8) //!< a bitmap that will be used for masking mouse interaction. Typically not used in render operations
47-
#define BMP_TEX_ETC2_RGB (1 << 9)
48-
#define BMP_TEX_ETC2_RGBA_EAC (1 << 10)
49-
#define BMP_TEX_EAC_R11 (1 << 11)
50-
#define BMP_TEX_EAC_RG11 (1 << 12)
47+
#define BMP_TEX_ETC2_RGB8 (1 << 9) //!< ETC2 RGB compressed (24bit, no alpha)
48+
#define BMP_TEX_ETC2_RGBA1 (1 << 10) //!< ETC2 RGBA1 compressed (24bit, 1 alpha)
49+
#define BMP_TEX_ETC2_RGBA8 (1 << 11) //!< ETC2 RGBA8 compressed (32bit, 8 alpha)
50+
5151

5252
// Combined flags
53-
#define BMP_TEX_COMP ( BMP_TEX_DXT1 | BMP_TEX_DXT3 | BMP_TEX_DXT5 | BMP_TEX_BC7 | BMP_TEX_ETC2_RGB |\
54-
BMP_TEX_ETC2_RGBA_EAC | BMP_TEX_EAC_R11 | BMP_TEX_EAC_RG11 ) //!< Compressed textures
53+
#define BMP_TEX_COMP ( BMP_TEX_DXT1 | BMP_TEX_DXT3 | BMP_TEX_DXT5 | BMP_TEX_BC7 | BMP_TEX_ETC2_RGB8 |\
54+
BMP_TEX_ETC2_RGBA1 | BMP_TEX_ETC2_RGBA8 ) //!< Compressed textures
5555
#define BMP_TEX_NONCOMP ( BMP_TEX_XPARENT | BMP_TEX_OTHER ) //!< Non-compressed textures
5656
#define BMP_TEX_ANY ( BMP_TEX_COMP | BMP_TEX_NONCOMP ) //!< Any texture
5757

@@ -88,11 +88,14 @@ enum BM_TYPE
8888
BM_TYPE_CUBEMAP_DXT5, //!< 32-bit cubemap (compressed cubemap surface)
8989

9090
BM_TYPE_3D, //!< 3D in-memory
91-
BM_TYPE_KTX, //!< generic identifier for KTX
92-
BM_TYPE_ETC2_RGB, //!< 24 bit without alpha
93-
BM_TYPE_ETC2_RGBA_EAC, //!< 32 bit with alpha
94-
BM_TYPE_EAC_R11, //!< BC4 equivalent
95-
BM_TYPE_EAC_RG11 //!< BC5 equivalent
91+
92+
BM_TYPE_KTX, //!< generic identifier for KTX1
93+
BM_TYPE_ETC2_RGB, //!< 24 bit, no alpha
94+
BM_TYPE_ETC2_SRGB, //!< 24 bit, no alpha, signed
95+
BM_TYPE_ETC2_RGBA1, //!< 24 bit, 1 bit alpha
96+
BM_TYPE_ETC2_SRGBA1, //!< 24 bit, 1 bit alpha, signed
97+
BM_TYPE_ETC2_RGBA_EAC, //!< 32 bit, 8 bit alpha
98+
BM_TYPE_ETC2_SRGBA_EAC //!< 32 bit, 8 bit alpha, signed
9699
};
97100

98101
/**

code/graphics/opengl/gropengltexture.cpp

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -447,14 +447,10 @@ static int opengl_texture_set_level(int bitmap_handle, int bitmap_type, int bmap
447447

448448
case KTX_ETC2_RGB:
449449
case KTX_ETC2_RGBA_EAC:
450-
case KTX_EAC_R11:
451-
case KTX_EAC_RG11:
452450
case KTX_ETC2_SRGB:
453451
case KTX_ETC2_SRGBA_EAC:
454452
case KTX_ETC2_RGB_A1:
455453
case KTX_ETC2_SRGB_A1:
456-
case KTX_EAC_R11_SNORM:
457-
case KTX_EAC_RG11_SNORM:
458454
intFormat = ktx_map_ktx_format_to_gl_internal(bm_handle);
459455
block_size = ktx_etc_block_bytes(intFormat);
460456
break;
@@ -776,14 +772,10 @@ static GLenum opengl_get_internal_format(int handle, int bitmap_type, int bpp) {
776772

777773
case KTX_ETC2_RGB:
778774
case KTX_ETC2_RGBA_EAC:
779-
case KTX_EAC_R11:
780-
case KTX_EAC_RG11:
781775
case KTX_ETC2_SRGB:
782776
case KTX_ETC2_SRGBA_EAC:
783777
case KTX_ETC2_RGB_A1:
784778
case KTX_ETC2_SRGB_A1:
785-
case KTX_EAC_R11_SNORM:
786-
case KTX_EAC_RG11_SNORM:
787779
return ktx_map_ktx_format_to_gl_internal(bm_handle);
788780

789781
default:
@@ -874,23 +866,21 @@ void opengl_determine_bpp_and_flags(int bitmap_handle, int bitmap_type, ushort&
874866
break;
875867

876868
case KTX_ETC2_RGB:
869+
case KTX_ETC2_SRGB:
877870
bpp = 24;
878-
flags |= BMP_TEX_ETC2_RGB;
871+
flags |= BMP_TEX_ETC2_RGB8;
879872
break;
880873

881-
case KTX_ETC2_RGBA_EAC:
882-
bpp = 32;
883-
flags |= BMP_TEX_ETC2_RGBA_EAC;
884-
break;
885-
886-
case KTX_EAC_R11:
887-
bpp = 8;
888-
flags |= BMP_TEX_EAC_R11;
874+
case KTX_ETC2_RGB_A1:
875+
case KTX_ETC2_SRGB_A1:
876+
bpp = 24;
877+
flags |= BMP_TEX_ETC2_RGBA1;
889878
break;
890879

891-
case KTX_EAC_RG11:
892-
bpp = 16;
893-
flags |= BMP_TEX_EAC_RG11;
880+
case KTX_ETC2_RGBA_EAC:
881+
case KTX_ETC2_SRGBA_EAC:
882+
bpp = 32;
883+
flags |= BMP_TEX_ETC2_RGBA8;
894884
break;
895885

896886
default:

code/ktxutils/ktxutils.cpp

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@
33
#include "cfile/cfile.h"
44
//KTX1 Spec definition https://registry.khronos.org/KTX/specs/1.0/ktxspec.v1.html
55
//ETC2 formats spec https://registry.khronos.org/DataFormat/specs/1.4/dataformat.1.4.inline.html#ETC2
6+
/*
7+
KTX 1 Parser - Format supported by Etc2Comp and AMD Compressonator
8+
ETC2 support for the formats supported by AMD compressonator and their signed alternatives:
9+
ETC2_RGB / ETC2_SRGB -> 24 bit no alpha
10+
ETC2_RGBA1 / ETC2_SRGBA1 -> 24 bit with 1 bit punchthrough alpha
11+
ETC2_RGBA / ETC2_SRGBA -> 32 bit with 8 bit alpha
12+
*/
613

714
static const uint8_t KTX_ID[12] = { 0xAB, 'K', 'T', 'X', ' ', '1', '1', 0xBB, '\r', '\n', 0x1A, '\n' };
815

@@ -15,14 +22,10 @@ uint32_t ktx_etc_block_bytes(const int internal_format)
1522
case GL_COMPRESSED_SRGB8_ETC2:
1623
case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
1724
case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
18-
case GL_COMPRESSED_R11_EAC:
19-
case GL_COMPRESSED_SIGNED_R11_EAC:
2025
return 8;
2126

2227
case GL_COMPRESSED_RGBA8_ETC2_EAC:
2328
case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
24-
case GL_COMPRESSED_RG11_EAC:
25-
case GL_COMPRESSED_SIGNED_RG11_EAC:
2629
return 16;
2730

2831
default:
@@ -39,10 +42,6 @@ int ktx_map_ktx_format_to_gl_internal(const int ktx_format)
3942
return GL_COMPRESSED_RGB8_ETC2;
4043
case KTX_ETC2_RGBA_EAC:
4144
return GL_COMPRESSED_RGBA8_ETC2_EAC;
42-
case KTX_EAC_R11:
43-
return GL_COMPRESSED_R11_EAC;
44-
case KTX_EAC_RG11:
45-
return GL_COMPRESSED_RG11_EAC;
4645
case KTX_ETC2_SRGB:
4746
return GL_COMPRESSED_SRGB8_ETC2;
4847
case KTX_ETC2_SRGBA_EAC:
@@ -51,10 +50,6 @@ int ktx_map_ktx_format_to_gl_internal(const int ktx_format)
5150
return GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
5251
case KTX_ETC2_SRGB_A1:
5352
return GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
54-
case KTX_EAC_R11_SNORM:
55-
return GL_COMPRESSED_SIGNED_R11_EAC;
56-
case KTX_EAC_RG11_SNORM:
57-
return GL_COMPRESSED_SIGNED_RG11_EAC;
5853

5954
default: return 0;
6055
}
@@ -65,22 +60,19 @@ int ktx_map_gl_internal_to_bm(const int internal_format)
6560
switch (internal_format)
6661
{
6762
case GL_COMPRESSED_RGB8_ETC2:
63+
return BM_TYPE_ETC2_RGB;
6864
case GL_COMPRESSED_SRGB8_ETC2:
65+
return BM_TYPE_ETC2_SRGB;
66+
6967
case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
68+
return BM_TYPE_ETC2_RGBA1;
7069
case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
71-
return BM_TYPE_ETC2_RGB;
70+
return BM_TYPE_ETC2_SRGBA1;
7271

7372
case GL_COMPRESSED_RGBA8_ETC2_EAC:
74-
case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
7573
return BM_TYPE_ETC2_RGBA_EAC;
76-
77-
case GL_COMPRESSED_R11_EAC:
78-
case GL_COMPRESSED_SIGNED_R11_EAC:
79-
return BM_TYPE_EAC_R11;
80-
81-
case GL_COMPRESSED_RG11_EAC:
82-
case GL_COMPRESSED_SIGNED_RG11_EAC:
83-
return BM_TYPE_EAC_RG11;
74+
case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
75+
return BM_TYPE_ETC2_SRGBA_EAC;
8476

8577
default:
8678
return BM_TYPE_NONE;
@@ -91,6 +83,7 @@ int ktx1_read_header(const char* filename, CFILE* img_cfp, int* w, int* h, int*
9183
{
9284
CFILE* cf;
9385
char real_name[MAX_FILENAME_LEN];
86+
//copied from ddsutils
9487
if (img_cfp == nullptr) {
9588
// this better not happen.. ever
9689
Assert(filename != nullptr);
@@ -187,17 +180,16 @@ int ktx1_read_header(const char* filename, CFILE* img_cfp, int* w, int* h, int*
187180
switch (bm_ct)
188181
{
189182
case BM_TYPE_ETC2_RGB:
183+
case BM_TYPE_ETC2_SRGB:
184+
case BM_TYPE_ETC2_RGBA1:
185+
case BM_TYPE_ETC2_SRGBA1:
190186
*bpp = 24;
191187
break;
192188
case BM_TYPE_ETC2_RGBA_EAC:
189+
case BM_TYPE_ETC2_SRGBA_EAC:
193190
*bpp = 32;
194191
break;
195-
case BM_TYPE_EAC_R11:
196-
*bpp = 8;
197-
break;
198-
case BM_TYPE_EAC_RG11:
199-
*bpp = 16;
200-
break;
192+
201193
default:
202194
*bpp = 0;
203195
break;
@@ -217,6 +209,7 @@ int ktx1_read_bitmap(const char* filename, ubyte* dst, ubyte* out_bpp)
217209
{
218210
CFILE* cf;
219211
char real_name[MAX_FILENAME_LEN];
212+
// copied from ddsutils
220213
// this better not happen.. ever
221214
Assert(filename != nullptr);
222215

code/ktxutils/ktxutils.h

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,10 @@
99
enum KTX_Format {
1010
KTX_ETC2_RGB = 100,
1111
KTX_ETC2_RGBA_EAC,
12-
KTX_EAC_R11,
13-
KTX_EAC_RG11,
1412
KTX_ETC2_SRGB,
1513
KTX_ETC2_SRGBA_EAC,
1614
KTX_ETC2_RGB_A1,
17-
KTX_ETC2_SRGB_A1,
18-
KTX_EAC_R11_SNORM,
19-
KTX_EAC_RG11_SNORM
15+
KTX_ETC2_SRGB_A1
2016
};
2117

2218
// GLenum definitions, ETC2 is guarranted on ES 3.2, but in desktop GL it is supported from 4.3
@@ -40,18 +36,6 @@ enum KTX_Format {
4036
#ifndef GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
4137
#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
4238
#endif
43-
#ifndef GL_COMPRESSED_R11_EAC
44-
#define GL_COMPRESSED_R11_EAC 0x9270
45-
#endif
46-
#ifndef GL_COMPRESSED_SIGNED_R11_EAC
47-
#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271
48-
#endif
49-
#ifndef GL_COMPRESSED_RG11_EAC
50-
#define GL_COMPRESSED_RG11_EAC 0x9272
51-
#endif
52-
#ifndef GL_COMPRESSED_SIGNED_RG11_EAC
53-
#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273
54-
#endif
5539

5640
enum KTX1_Error {
5741
KTX1_ERROR_NONE = 0,

0 commit comments

Comments
 (0)