@@ -94,6 +94,10 @@ static uint32_t setChannelFlags(uint32_t channel, enum VkSuffix suffix)
9494 channel |= KHR_DF_SAMPLE_DATATYPE_LINEAR ;
9595 }
9696 break ;
97+ case s_S10_5 :
98+ channel |=
99+ KHR_DF_SAMPLE_DATATYPE_SIGNED ;
100+ break ;
97101 }
98102 return channel ;
99103}
@@ -109,7 +113,6 @@ static void writeSample(uint32_t *DFD, int sampleNo, int channel,
109113 float f ;
110114 } lower , upper ;
111115 uint32_t * sample = DFD + 1 + KHR_DF_WORD_SAMPLESTART + sampleNo * KHR_DF_WORD_SAMPLEWORDS ;
112- if (channel == 3 ) channel = KHR_DF_CHANNEL_RGBSDA_ALPHA ;
113116
114117 if (channel == 3 ) channel = KHR_DF_CHANNEL_RGBSDA_ALPHA ;
115118 channel = setChannelFlags (channel , suffix );
@@ -159,6 +162,10 @@ static void writeSample(uint32_t *DFD, int sampleNo, int channel,
159162 upper .f = 1.0f ;
160163 lower .f = 0.0f ;
161164 break ;
165+ case s_S10_5 :
166+ assert (bits == 16 && "Format with this suffix must be 16 bits per channel." );
167+ upper .i = 32 ;
168+ lower .i = ~upper .i + 1 ; // -32
162169 }
163170 sample [KHR_DF_SAMPLEWORD_SAMPLELOWER ] = lower .i ;
164171 sample [KHR_DF_SAMPLEWORD_SAMPLEUPPER ] = upper .i ;
@@ -230,8 +237,9 @@ uint32_t *createDFDUnpacked(int bigEndian, int numChannels, int bytes,
230237 * @param bits[] An array of length numChannels.
231238 * Each entry is the number of bits composing the channel, in
232239 * order starting at bit 0 of the packed type.
233- * @param paddings[] An array of length numChannels.
234- * Each entry is the number of padding bits after each channel.
240+ * @param shiftBits[] An array of length numChannels.
241+ * Each entry is the number of bits each channel is shifted
242+ * and thus padded with insignificant bits.
235243 * @param channels[] An array of length numChannels.
236244 * Each entry enumerates the channel type: 0 = red, 1 = green,
237245 * 2 = blue, 15 = alpha, in order starting at bit 0 of the
@@ -243,9 +251,9 @@ uint32_t *createDFDUnpacked(int bigEndian, int numChannels, int bytes,
243251 * @return A data format descriptor in malloc'd data. The caller is responsible
244252 * for freeing the descriptor.
245253 **/
246- uint32_t * createDFDPackedPadded (int bigEndian , int numChannels ,
247- int bits [], int paddings [], int channels [],
248- enum VkSuffix suffix )
254+ uint32_t * createDFDPackedShifted (int bigEndian , int numChannels ,
255+ int bits [], int shiftBits [], int channels [],
256+ enum VkSuffix suffix )
249257{
250258 uint32_t * DFD = 0 ;
251259 if (numChannels == 6 ) {
@@ -291,17 +299,18 @@ uint32_t *createDFDPackedPadded(int bigEndian, int numChannels,
291299 int sampleCounter ;
292300 for (channelCounter = 0 ; channelCounter < numChannels ; ++ channelCounter ) {
293301 beChannelStart [channelCounter ] = totalBits ;
294- totalBits += bits [channelCounter ] + paddings [channelCounter ];
302+ totalBits += shiftBits [channelCounter ] + bits [channelCounter ];
295303 }
296304 BEMask = (totalBits - 1 ) & 0x18 ;
297305 for (channelCounter = 0 ; channelCounter < numChannels ; ++ channelCounter ) {
306+ bitOffset += shiftBits [channelCounter ];
298307 bitChannel [bitOffset ^ BEMask ] = channelCounter ;
299308 if (((bitOffset + bits [channelCounter ] - 1 ) & ~7 ) != (bitOffset & ~7 )) {
300309 /* Continuation sample */
301310 bitChannel [((bitOffset + bits [channelCounter ] - 1 ) & ~7 ) ^ BEMask ] = channelCounter ;
302311 numSamples ++ ;
303312 }
304- bitOffset += bits [channelCounter ] + paddings [ channelCounter ] ;
313+ bitOffset += bits [channelCounter ];
305314 }
306315 DFD = writeHeader (numSamples , totalBits >> 3 , suffix , i_COLOR );
307316
@@ -343,16 +352,17 @@ uint32_t *createDFDPackedPadded(int bigEndian, int numChannels,
343352 int totalBits = 0 ;
344353 int bitOffset = 0 ;
345354 for (sampleCounter = 0 ; sampleCounter < numChannels ; ++ sampleCounter ) {
346- totalBits += bits [sampleCounter ] + paddings [sampleCounter ];
355+ totalBits += shiftBits [sampleCounter ] + bits [sampleCounter ];
347356 }
348357
349358 /* One sample per channel */
350359 DFD = writeHeader (numChannels , totalBits >> 3 , suffix , i_COLOR );
351360 for (sampleCounter = 0 ; sampleCounter < numChannels ; ++ sampleCounter ) {
361+ bitOffset += shiftBits [sampleCounter ];
352362 writeSample (DFD , sampleCounter , channels [sampleCounter ],
353363 bits [sampleCounter ], bitOffset ,
354364 1 , 1 , suffix );
355- bitOffset += bits [sampleCounter ] + paddings [ sampleCounter ] ;
365+ bitOffset += bits [sampleCounter ];
356366 }
357367 }
358368 return DFD ;
@@ -383,20 +393,20 @@ uint32_t *createDFDPacked(int bigEndian, int numChannels,
383393 int bits [], int channels [],
384394 enum VkSuffix suffix ) {
385395 assert (numChannels <= 6 );
386- int paddings [] = {0 , 0 , 0 , 0 , 0 , 0 };
387- return createDFDPackedPadded (bigEndian , numChannels , bits , paddings , channels , suffix );
396+ int shiftBits [] = {0 , 0 , 0 , 0 , 0 , 0 };
397+ return createDFDPackedShifted (bigEndian , numChannels , bits , shiftBits , channels , suffix );
388398}
389399
390400uint32_t * createDFD422 (int bigEndian , int numSamples ,
391- int bits [], int paddings [], int channels [],
401+ int bits [], int shiftBits [], int channels [],
392402 int position_xs [], int position_ys [],
393403 enum VkSuffix suffix ) {
394404 assert (!bigEndian ); (void ) bigEndian ;
395405 assert (suffix == s_UNORM ); (void ) suffix ;
396406
397407 int totalBits = 0 ;
398408 for (int i = 0 ; i < numSamples ; ++ i )
399- totalBits += bits [i ] + paddings [i ];
409+ totalBits += shiftBits [i ] + bits [i ];
400410 assert (totalBits % 8 == 0 );
401411
402412 uint32_t BDFDSize = sizeof (uint32_t ) * (KHR_DF_WORD_SAMPLESTART + numSamples * KHR_DF_WORD_SAMPLEWORDS );
@@ -428,6 +438,7 @@ uint32_t *createDFD422(int bigEndian, int numSamples,
428438
429439 int bitOffset = 0 ;
430440 for (int i = 0 ; i < numSamples ; ++ i ) {
441+ bitOffset += shiftBits [i ];
431442 KHR_DFDSETSVAL (BDFD , i , BITOFFSET , bitOffset );
432443 KHR_DFDSETSVAL (BDFD , i , BITLENGTH , bits [i ] - 1 );
433444 KHR_DFDSETSVAL (BDFD , i , CHANNELID , channels [i ]);
@@ -438,7 +449,7 @@ uint32_t *createDFD422(int bigEndian, int numSamples,
438449 KHR_DFDSETSVAL (BDFD , i , SAMPLEPOSITION3 , 0 );
439450 KHR_DFDSETSVAL (BDFD , i , SAMPLELOWER , 0 );
440451 KHR_DFDSETSVAL (BDFD , i , SAMPLEUPPER , (1u << bits [i ]) - 1u );
441- bitOffset += bits [i ] + paddings [ i ] ;
452+ bitOffset += bits [i ];
442453 }
443454
444455 return DFD ;
0 commit comments