Skip to content

Commit 7356c0d

Browse files
authored
ktx create: Update transfer function handling (#982)
* Support in `ktx create` the transfer function flexibility opened up by spec. revision 2. * Improve libktx checks for valid transfer functions. There are some unrelated changes: - mistakes I noticed in messages for other options - an error in the range of values usable for the --clevel parameter to encode for BasisU. I took the opportunity to fix these here rather than making another PR.
1 parent 636ab33 commit 7356c0d

21 files changed

+1058
-446
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ set(KTX_MAIN_SRC
419419
lib/vkFormat2glInternalFormat.inl
420420
lib/vkFormat2glType.inl
421421
lib/vkformat_check.c
422+
lib/vkformat_check_variant.c
422423
lib/vkformat_enum.h
423424
lib/vkformat_str.c
424425
lib/vkformat_typesize.c

cmake/docs.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ function( CreateDocLibKTX )
9494

9595
set( DOXYGEN_PREDEFINED
9696
KTX_DOXYGEN_SKIP
97+
KTX_FEATURE_WRITE
9798
"KTXTEXTURECLASSDEFN=class_id classId\; \\
9899
struct ktxTexture_vtbl* vtbl\; \\
99100
struct ktxTexture_vvtbl* vvtbl\; \\

external/dfdutils/KHR/khr_df.h

Lines changed: 61 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
/* The Khronos Data Format Specification (version 1.3) */
1+
/* The Khronos Data Format Specification (version 1.4.0) */
22
/*
3-
** Copyright 2015-2020 The Khronos Group Inc.
3+
** Copyright 2015-2025 The Khronos Group Inc.
44
** SPDX-License-Identifier: Apache-2.0
55
*/
66

@@ -101,7 +101,7 @@ typedef enum _khr_df_mask_e {
101101
((BDB)[KHR_DF_WORD_ ## X] = \
102102
((BDB)[KHR_DF_WORD_ ## X] & \
103103
~((KHR_DF_MASK_ ## X) << (KHR_DF_SHIFT_ ## X))) | \
104-
(((val) & (KHR_DF_MASK_ ## X)) << (KHR_DF_SHIFT_ ## X)))
104+
(((uint32_t)(val) & (KHR_DF_MASK_ ## X)) << (KHR_DF_SHIFT_ ## X)))
105105

106106
/* Offsets relative to the start of a sample */
107107
typedef enum _khr_df_sampleword_e {
@@ -135,14 +135,14 @@ typedef enum _khr_df_sampleshift_e {
135135

136136
typedef enum _khr_df_samplemask_e {
137137
KHR_DF_SAMPLEMASK_BITOFFSET = 0xFFFFU,
138-
KHR_DF_SAMPLEMASK_BITLENGTH = 0xFF,
139-
KHR_DF_SAMPLEMASK_CHANNELID = 0xF,
138+
KHR_DF_SAMPLEMASK_BITLENGTH = 0xFFU,
139+
KHR_DF_SAMPLEMASK_CHANNELID = 0xFU,
140140
/* N.B. Qualifiers are defined as an offset into a byte */
141-
KHR_DF_SAMPLEMASK_QUALIFIERS = 0xF0,
142-
KHR_DF_SAMPLEMASK_SAMPLEPOSITION0 = 0xFF,
143-
KHR_DF_SAMPLEMASK_SAMPLEPOSITION1 = 0xFF,
144-
KHR_DF_SAMPLEMASK_SAMPLEPOSITION2 = 0xFF,
145-
KHR_DF_SAMPLEMASK_SAMPLEPOSITION3 = 0xFF,
141+
KHR_DF_SAMPLEMASK_QUALIFIERS = 0xF0U,
142+
KHR_DF_SAMPLEMASK_SAMPLEPOSITION0 = 0xFFU,
143+
KHR_DF_SAMPLEMASK_SAMPLEPOSITION1 = 0xFFU,
144+
KHR_DF_SAMPLEMASK_SAMPLEPOSITION2 = 0xFFU,
145+
KHR_DF_SAMPLEMASK_SAMPLEPOSITION3 = 0xFFU,
146146
/* ISO C restricts enum values to range of int hence the
147147
cast. We do it verbosely instead of using -1 to ensure
148148
it is a 32-bit value even if int is 64 bits. */
@@ -169,7 +169,7 @@ typedef enum _khr_df_samplemask_e {
169169
((S) * KHR_DF_WORD_SAMPLEWORDS) + \
170170
KHR_DF_SAMPLEWORD_ ## X] & \
171171
~((uint32_t)(KHR_DF_SAMPLEMASK_ ## X) << (KHR_DF_SAMPLESHIFT_ ## X))) | \
172-
(((val) & (uint32_t)(KHR_DF_SAMPLEMASK_ ## X)) << (KHR_DF_SAMPLESHIFT_ ## X)))
172+
(((uint32_t)(val) & (uint32_t)(KHR_DF_SAMPLEMASK_ ## X)) << (KHR_DF_SAMPLESHIFT_ ## X)))
173173

174174
/* Helper macro:
175175
Number of samples in basic descriptor block BDB */
@@ -213,7 +213,8 @@ typedef enum _khr_df_versionnumber_e {
213213
KHR_DF_VERSIONNUMBER_1_1 = 0U, /* Version 1.1 did not bump the version number */
214214
KHR_DF_VERSIONNUMBER_1_2 = 1U, /* Version 1.2 increased the version number */
215215
KHR_DF_VERSIONNUMBER_1_3 = 2U, /* Version 1.3 increased the version number */
216-
KHR_DF_VERSIONNUMBER_LATEST = KHR_DF_VERSIONNUMBER_1_3,
216+
KHR_DF_VERSIONNUMBER_1_4 = 2U, /* Version 1.4.0 did not bump the block version number */
217+
KHR_DF_VERSIONNUMBER_LATEST = KHR_DF_VERSIONNUMBER_1_4,
217218
KHR_DF_VERSIONNUMBER_MAX = 0xFFFFU
218219
} khr_df_versionnumber_e;
219220

@@ -273,11 +274,15 @@ typedef enum _khr_df_model_e {
273274
KHR_DF_MODEL_DXT4 = 130U,
274275
KHR_DF_MODEL_DXT5 = 130U,
275276
KHR_DF_MODEL_BC3 = 130U,
276-
/* BC4 - single channel interpolated 8-bit data */
277+
/* ATI1n/DXT5A/BC4 - single channel interpolated 8-bit data */
277278
/* (The UNORM/SNORM variation is recorded in the channel data) */
279+
KHR_DF_MODEL_ATI1N = 131U,
280+
KHR_DF_MODEL_DXT5A = 131U,
278281
KHR_DF_MODEL_BC4 = 131U,
279-
/* BC5 - two channel interpolated 8-bit data */
282+
/* ATI2n_XY/DXN/BC5 - two channel interpolated 8-bit data */
280283
/* (The UNORM/SNORM variation is recorded in the channel data) */
284+
KHR_DF_MODEL_ATI2N_XY = 132U,
285+
KHR_DF_MODEL_DXN = 132U,
281286
KHR_DF_MODEL_BC5 = 132U,
282287
/* BC6H - DX11 format for 16-bit float channels */
283288
KHR_DF_MODEL_BC6H = 133U,
@@ -502,7 +507,6 @@ typedef enum _khr_df_model_channels_e {
502507
KHR_DF_CHANNEL_PVRTC2_DATA = 0U,
503508
KHR_DF_CHANNEL_PVRTC2_COLOR = 0U,
504509
/* MODEL UASTC */
505-
KHR_DF_CHANNEL_UASTC_DATA = 0U,
506510
KHR_DF_CHANNEL_UASTC_RGB = 0U,
507511
KHR_DF_CHANNEL_UASTC_RGBA = 3U,
508512
KHR_DF_CHANNEL_UASTC_RRR = 4U,
@@ -538,6 +542,8 @@ typedef enum _khr_df_primaries_e {
538542
KHR_DF_PRIMARIES_BT601_SMPTE = 3U,
539543
/* Color primaries of ITU-R BT.2020 */
540544
KHR_DF_PRIMARIES_BT2020 = 4U,
545+
/* ITU-R BT.2100 uses the same primaries as BT.2020 */
546+
KHR_DF_PRIMARIES_BT2100 = 4U,
541547
/* CIE theoretical color coordinate space */
542548
KHR_DF_PRIMARIES_CIEXYZ = 5U,
543549
/* Academy Color Encoding System primaries */
@@ -559,49 +565,78 @@ typedef enum _khr_df_primaries_e {
559565
("gamma correction"). Most transfer functions are not a pure
560566
power function and also include a linear element.
561567
LAB and related absolute color representations should use
562-
KHR_DF_TRANSFER_UNSPECIFIED. */
568+
KHR_DF_TRANSFER_UNSPECIFIED.
569+
These encodings indicate that the representation has had
570+
the corresponding transfer function applied relative to a
571+
linear representation; hence to process the linear intensity
572+
represented by the value, a corresponding inverse transform
573+
must be applied. */
563574
typedef enum _khr_df_transfer_e {
564575
/* No transfer function defined */
565576
KHR_DF_TRANSFER_UNSPECIFIED = 0U,
566577
/* Linear transfer function (value proportional to intensity) */
567578
KHR_DF_TRANSFER_LINEAR = 1U,
568-
/* Perceptually-linear transfer function of sRGH (~2.4) */
579+
/* Perceptually-linear transfer function of sRGB (~2.2); also used for scRGB */
569580
KHR_DF_TRANSFER_SRGB = 2U,
581+
KHR_DF_TRANSFER_SRGB_EOTF = 2U,
582+
KHR_DF_TRANSFER_SCRGB = 2U,
583+
KHR_DF_TRANSFER_SCRGB_EOTF = 2U,
570584
/* Perceptually-linear transfer function of ITU BT.601, BT.709 and BT.2020 (~1/.45) */
571585
KHR_DF_TRANSFER_ITU = 3U,
572-
/* SMTPE170M (digital NTSC) defines an alias for the ITU transfer function (~1/.45) */
573-
KHR_DF_TRANSFER_SMTPE170M = 3U,
586+
KHR_DF_TRANSFER_ITU_OETF = 3U,
587+
KHR_DF_TRANSFER_BT601 = 3U,
588+
KHR_DF_TRANSFER_BT601_OETF = 3U,
589+
KHR_DF_TRANSFER_BT709 = 3U,
590+
KHR_DF_TRANSFER_BT709_OETF = 3U,
591+
KHR_DF_TRANSFER_BT2020 = 3U,
592+
KHR_DF_TRANSFER_BT2020_OETF = 3U,
593+
/* SMTPE170M (digital NTSC) defines an alias for the ITU transfer function (~1/.45) and a linear OOTF */
594+
KHR_DF_TRANSFER_SMTPE170M = 3U,
595+
KHR_DF_TRANSFER_SMTPE170M_OETF = 3U,
596+
KHR_DF_TRANSFER_SMTPE170M_EOTF = 3U,
574597
/* Perceptually-linear gamma function of original NTSC (simple 2.2 gamma) */
575598
KHR_DF_TRANSFER_NTSC = 4U,
599+
KHR_DF_TRANSFER_NTSC_EOTF = 4U,
576600
/* Sony S-log used by Sony video cameras */
577601
KHR_DF_TRANSFER_SLOG = 5U,
602+
KHR_DF_TRANSFER_SLOG_OETF = 5U,
578603
/* Sony S-log 2 used by Sony video cameras */
579604
KHR_DF_TRANSFER_SLOG2 = 6U,
605+
KHR_DF_TRANSFER_SLOG2_OETF = 6U,
580606
/* ITU BT.1886 EOTF */
581607
KHR_DF_TRANSFER_BT1886 = 7U,
582-
/* ITU BT.2100 HLG OETF */
608+
KHR_DF_TRANSFER_BT1886_EOTF = 7U,
609+
/* ITU BT.2100 HLG OETF (typical scene-referred content), linear light normalized 0..1 */
583610
KHR_DF_TRANSFER_HLG_OETF = 8U,
584-
/* ITU BT.2100 HLG EOTF */
611+
/* ITU BT.2100 HLG EOTF (nominal HDR display of HLG content), linear light normalized 0..1 */
585612
KHR_DF_TRANSFER_HLG_EOTF = 9U,
586-
/* ITU BT.2100 PQ EOTF */
613+
/* ITU BT.2100 PQ EOTF (typical HDR display-referred PQ content) */
587614
KHR_DF_TRANSFER_PQ_EOTF = 10U,
588-
/* ITU BT.2100 PQ OETF */
615+
/* ITU BT.2100 PQ OETF (nominal scene described by PQ HDR content) */
589616
KHR_DF_TRANSFER_PQ_OETF = 11U,
590617
/* DCI P3 transfer function */
591618
KHR_DF_TRANSFER_DCIP3 = 12U,
619+
KHR_DF_TRANSFER_DCIP3_EOTF = 12U,
592620
/* Legacy PAL OETF */
593621
KHR_DF_TRANSFER_PAL_OETF = 13U,
594622
/* Legacy PAL 625-line EOTF */
595623
KHR_DF_TRANSFER_PAL625_EOTF = 14U,
596624
/* Legacy ST240 transfer function */
597625
KHR_DF_TRANSFER_ST240 = 15U,
626+
KHR_DF_TRANSFER_ST240_OETF = 15U,
627+
KHR_DF_TRANSFER_ST240_EOTF = 15U,
598628
/* ACEScc transfer function */
599629
KHR_DF_TRANSFER_ACESCC = 16U,
630+
KHR_DF_TRANSFER_ACESCC_OETF = 16U,
600631
/* ACEScct transfer function */
601-
KHR_DF_TRANSFER_ACESCCT = 17U,
632+
KHR_DF_TRANSFER_ACESCCT = 17U,
633+
KHR_DF_TRANSFER_ACESCCT_OETF = 17U,
602634
/* Adobe RGB (1998) transfer function */
603-
KHR_DF_TRANSFER_ADOBERGB = 18U,
604-
KHR_DF_TRANSFER_MAX = 0xFFU
635+
KHR_DF_TRANSFER_ADOBERGB = 18U,
636+
KHR_DF_TRANSFER_ADOBERGB_EOTF = 18U,
637+
/* Legacy ITU BT.2100 HLG OETF (typical scene-referred content), linear light normalized 0..12 */
638+
KHR_DF_TRANSFER_HLG_UNNORMALIZED_OETF = 19U,
639+
KHR_DF_TRANSFER_MAX = 0xFFU
605640
} khr_df_transfer_e;
606641

607642
typedef enum _khr_df_flags_e {

external/dfdutils/printdfd.c

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,17 +93,34 @@ const char* dfdToStringTransferFunction(khr_df_transfer_e value) {
9393
case KHR_DF_TRANSFER_LINEAR:
9494
return "KHR_DF_TRANSFER_LINEAR";
9595
case KHR_DF_TRANSFER_SRGB:
96+
// case KHR_DF_TRANSFER_SRGB_EOTF:
97+
// case KHR_DF_TRANSFER_SCRGB:
98+
// case KHR_DF_TRANSFER_SCRGB_EOTF: // Fallthrough, matching values
9699
return "KHR_DF_TRANSFER_SRGB";
97100
case KHR_DF_TRANSFER_ITU:
101+
// case KHR_DF_ITU_OETF:
102+
// case KHR_DF_TRANSFER_BT601:
103+
// case KHR_DF_TRANSFER_BT601_OETF:
104+
// case KHR_DF_TRANSFER_BT709:
105+
// case KHR_DF_TRANSFER_BT709_OETF:
106+
// case KHR_DF_TRANSFER_BT2020:
107+
// case KHR_DF_TRANSFER_BT2020_OETF:
108+
// case KHR_DF_TRANSFER_SMTPE170M:
109+
// case KHR_DF_TRANSFER_SMTPE170M_OETF:
110+
// case KHR_DF_TRANSFER_SMTPE170M_EOTF:
111+
// case KHR_DF_TRANSFER_SMTPE170M: // Fallthrough, matching values
98112
return "KHR_DF_TRANSFER_ITU";
99113
case KHR_DF_TRANSFER_NTSC:
100-
// case KHR_DF_TRANSFER_SMTPE170M: // Fallthrough, Matching values
114+
// case KHR_DF_TRANSFER_NTSC_EOTF: // Fallthrough, matching values
101115
return "KHR_DF_TRANSFER_NTSC";
102116
case KHR_DF_TRANSFER_SLOG:
117+
//case KHR_DF_TRANSFER_SLOG_OETF: // Fallthrough, matching values
103118
return "KHR_DF_TRANSFER_SLOG";
104119
case KHR_DF_TRANSFER_SLOG2:
105-
return "KHR_DF_TRANSFER_SLOG2";
120+
// case KHR_DF_TRANSFER_SLOG2_OETF:
121+
return "KHR_DF_TRANSFER_SLOG2";
106122
case KHR_DF_TRANSFER_BT1886:
123+
// case KHR_DF_TRANSFER_BT1886_EOTF: // Fallthrough, matching values
107124
return "KHR_DF_TRANSFER_BT1886";
108125
case KHR_DF_TRANSFER_HLG_OETF:
109126
return "KHR_DF_TRANSFER_HLG_OETF";
@@ -114,19 +131,27 @@ const char* dfdToStringTransferFunction(khr_df_transfer_e value) {
114131
case KHR_DF_TRANSFER_PQ_OETF:
115132
return "KHR_DF_TRANSFER_PQ_OETF";
116133
case KHR_DF_TRANSFER_DCIP3:
134+
// case KHR_DF_TRANSFER_DCIP3_EOTF: // Fallthrough, matching values
117135
return "KHR_DF_TRANSFER_DCIP3";
118136
case KHR_DF_TRANSFER_PAL_OETF:
119137
return "KHR_DF_TRANSFER_PAL_OETF";
120138
case KHR_DF_TRANSFER_PAL625_EOTF:
121139
return "KHR_DF_TRANSFER_PAL625_EOTF";
122140
case KHR_DF_TRANSFER_ST240:
141+
// case KHR_DF_TRANSFER_ST240_EOTF:
142+
// case KHR_DF_TRANSFER_ST240_OETF: // Fallthrough, matching values
123143
return "KHR_DF_TRANSFER_ST240";
124144
case KHR_DF_TRANSFER_ACESCC:
145+
// case KHR_DF_TRANSFER_ACESCC_OETF: // Fallthrough, matching values
125146
return "KHR_DF_TRANSFER_ACESCC";
126147
case KHR_DF_TRANSFER_ACESCCT:
148+
// case KHR_DF_TRANSFER_ACESCCT_OETF: // Fallthrough, matching values
127149
return "KHR_DF_TRANSFER_ACESCCT";
128150
case KHR_DF_TRANSFER_ADOBERGB:
151+
// case KHR_DF_TRANSFER_ADOBERGB_EOTF: // Fallthrough, matching values
129152
return "KHR_DF_TRANSFER_ADOBERGB";
153+
case KHR_DF_TRANSFER_HLG_UNNORMALIZED_OETF:
154+
return "KHR_DF_TRANSFER_HLG_UNNORMALIZED_OETF";
130155

131156
case KHR_DF_TRANSFER_MAX:
132157
// These enum values are not meant for string representation. Ignore

0 commit comments

Comments
 (0)