1 /****************************************************************************
2 * Copyright (C) 2014-2015 Intel Corporation. All Rights Reserved.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * @brief Conversion utility functions
27 ******************************************************************************/
31 // disable "potential divide by 0"
32 #pragma warning(disable: 4723)
37 //////////////////////////////////////////////////////////////////////////
38 /// @brief Convert an IEEE 754 16-bit float to an 32-bit single precision
40 /// @param val - 16-bit float
41 /// @todo Maybe move this outside of this file into a header?
42 static INLINE
float ConvertSmallFloatTo32(UINT val
)
45 if ((val
& 0x7fff) == 0)
47 result
= ((uint32_t)(val
& 0x8000)) << 16;
49 else if ((val
& 0x7c00) == 0x7c00)
51 result
= ((val
& 0x3ff) == 0) ? 0x7f800000 : 0x7fc00000;
52 result
|= ((uint32_t)val
& 0x8000) << 16;
56 uint32_t sign
= (val
& 0x8000) << 16;
57 uint32_t mant
= (val
& 0x3ff) << 13;
58 uint32_t exp
= (val
>> 10) & 0x1f;
59 if ((exp
== 0) && (mant
!= 0)) // Adjust exponent and mantissa for denormals
62 while (mant
< (0x400 << 13))
67 mant
&= (0x3ff << 13);
69 exp
= ((exp
- 15 + 127) & 0xff) << 23;
70 result
= sign
| exp
| mant
;
73 return *(float*)&result
;
76 //////////////////////////////////////////////////////////////////////////
77 /// @brief Convert an IEEE 754 32-bit single precision float to an
78 /// unsigned small float with 5 exponent bits and a variable
79 /// number of mantissa bits.
80 /// @param val - 32-bit float
81 /// @todo Maybe move this outside of this file into a header?
82 template<UINT numMantissaBits
>
83 static UINT
Convert32ToSmallFloat(float val
)
85 uint32_t sign
, exp
, mant
;
88 // Extract the sign, exponent, and mantissa
89 UINT uf
= *(UINT
*)&val
;
91 sign
= (uf
& 0x80000000) >> 31;
92 exp
= (uf
& 0x7F800000) >> 23;
93 mant
= uf
& 0x007FFFFF;
95 // 10/11 bit floats are unsigned. Negative values are clamped to 0.
100 // Check for out of range
101 else if ((exp
== 0xFF) && (mant
!= 0)) // NaN
104 mant
= 1 << numMantissaBits
;
106 else if ((exp
== 0xFF) && (mant
== 0)) // INF
111 else if (exp
> (0x70 + 0x1E)) // Too big to represent
114 mant
= (1 << numMantissaBits
) - 1; // 0x3F for 6 bit mantissa.
116 else if ((exp
<= 0x70) && (exp
>= 0x66)) // It's a denorm
119 for (; exp
<= 0x70; mant
>>= 1, exp
++)
122 mant
= mant
>> (23 - numMantissaBits
);
124 else if (exp
< 0x66) // Too small to represent -> Zero
131 // Saves bits that will be shifted off for rounding
132 roundBits
= mant
& 0x1FFFu
;
133 // convert exponent and mantissa to 16 bit format
135 mant
= mant
>> (23 - numMantissaBits
);
137 // Essentially RTZ, but round up if off by only 1 lsb
138 if (roundBits
== 0x1FFFu
)
141 // check for overflow
142 if ((mant
& (0x3 << numMantissaBits
)) != 0) // 0x60 = 0x3 << (num Mantissa Bits)
144 // make sure only the needed bits are used
145 mant
&= (1 << numMantissaBits
) - 1;
149 UINT tmpVal
= (exp
<< numMantissaBits
) | mant
;
153 #if KNOB_ARCH == KNOB_ARCH_AVX
154 //////////////////////////////////////////////////////////////////////////
155 /// @brief Convert an IEEE 754 32-bit single precision float to an
156 /// 16 bit float with 5 exponent bits and a variable
157 /// number of mantissa bits.
158 /// @param val - 32-bit float
159 /// @todo Maybe move this outside of this file into a header?
160 static uint16_t Convert32To16Float(float val
)
162 uint32_t sign
, exp
, mant
;
165 // Extract the sign, exponent, and mantissa
166 uint32_t uf
= *(uint32_t*)&val
;
167 sign
= (uf
& 0x80000000) >> 31;
168 exp
= (uf
& 0x7F800000) >> 23;
169 mant
= uf
& 0x007FFFFF;
171 // Check for out of range
176 sign
= 1; // set the sign bit for NANs
178 else if (std::isinf(val
))
183 else if (exp
> (0x70 + 0x1E)) // Too big to represent -> max representable value
188 else if ((exp
<= 0x70) && (exp
>= 0x66)) // It's a denorm
191 for (; exp
<= 0x70; mant
>>= 1, exp
++)
196 else if (exp
< 0x66) // Too small to represent -> Zero
203 // Saves bits that will be shifted off for rounding
204 roundBits
= mant
& 0x1FFFu
;
205 // convert exponent and mantissa to 16 bit format
209 // Essentially RTZ, but round up if off by only 1 lsb
210 if (roundBits
== 0x1FFFu
)
213 // check for overflow
214 if ((mant
& 0xC00u
) != 0)
216 // make sure only the needed bits are used
221 uint32_t tmpVal
= (sign
<< 15) | (exp
<< 10) | mant
;
222 return (uint16_t)tmpVal
;
226 //////////////////////////////////////////////////////////////////////////
227 /// @brief Retrieve color from hot tile source which is always float.
228 /// @param pDstPixel - Pointer to destination pixel.
229 /// @param srcPixel - Pointer to source pixel (pre-swizzled according to dest).
230 template<SWR_FORMAT DstFormat
>
231 static void ConvertPixelFromFloat(
233 const float srcPixel
[4])
235 uint32_t outColor
[4] = { 0 }; // typeless bits
238 for (UINT comp
= 0; comp
< FormatTraits
<DstFormat
>::numComps
; ++comp
)
240 SWR_TYPE type
= FormatTraits
<DstFormat
>::GetType(comp
);
242 float src
= srcPixel
[comp
];
248 // Force NaN to 0. IEEE standard, comparisons involving NaN always evaluate to false.
249 src
= (src
!= src
) ? 0.0f
: src
;
252 src
= std::max(src
, 0.0f
);
253 src
= std::min(src
, 1.0f
);
256 if (FormatTraits
<DstFormat
>::isSRGB
&& comp
!= 3)
258 src
= (src
<= 0.0031308f
) ? (12.92f
* src
) : (1.055f
* powf(src
, (1.0f
/ 2.4f
)) - 0.055f
);
261 // Float scale to integer scale.
262 UINT scale
= (1 << FormatTraits
<DstFormat
>::GetBPC(comp
)) - 1;
263 src
= (float)scale
* src
;
265 outColor
[comp
] = (UINT
)src
; // Drop fractional part.
270 SWR_ASSERT(!FormatTraits
<DstFormat
>::isSRGB
);
272 // Force NaN to 0. IEEE standard, comparisons involving NaN always evaluate to false.
273 src
= (src
!= src
) ? 0.0f
: src
;
276 src
= std::max(src
, -1.0f
);
277 src
= std::min(src
, 1.0f
);
279 // Float scale to integer scale.
280 UINT scale
= (1 << (FormatTraits
<DstFormat
>::GetBPC(comp
) - 1)) - 1;
281 src
= (float)scale
* src
;
284 src
+= (src
>= 0) ? 0.5f
: -0.5f
;
288 outColor
[comp
] = *(UINT
*)&out
;
294 ///@note The *(UINT*)& is currently necessary as the hot tile appears to always be float.
295 // However, the number in the hot tile should be unsigned integer. So doing this
296 // to preserve bits intead of doing a float -> integer conversion.
297 if (FormatTraits
<DstFormat
>::GetBPC(comp
) == 32)
299 outColor
[comp
] = *(UINT
*)&src
;
303 outColor
[comp
] = *(UINT
*)&src
;
304 UINT max
= (1 << FormatTraits
<DstFormat
>::GetBPC(comp
)) - 1; // 2^numBits - 1
306 outColor
[comp
] = std::min(max
, outColor
[comp
]);
312 if (FormatTraits
<DstFormat
>::GetBPC(comp
) == 32)
314 outColor
[comp
] = *(UINT
*)&src
;
318 INT out
= *(INT
*)&src
; // Hot tile format is SINT?
319 INT max
= (1 << (FormatTraits
<DstFormat
>::GetBPC(comp
) - 1)) - 1;
322 ///@note The output is unsigned integer (bag of bits) and so performing
323 // the clamping here based on range of output component. Also, manually adding
324 // the sign bit in the appropriate spot. Maybe a better way?
325 out
= std::max(out
, min
);
326 out
= std::min(out
, max
);
328 outColor
[comp
] = *(UINT
*)&out
;
334 if (FormatTraits
<DstFormat
>::GetBPC(comp
) == 16)
336 // Convert from 32-bit float to 16-bit float using _mm_cvtps_ph
337 // @todo 16bit float instruction support is orthogonal to avx support. need to
338 // add check for F16C support instead.
339 #if KNOB_ARCH >= KNOB_ARCH_AVX2
340 __m128 src128
= _mm_set1_ps(src
);
341 __m128i srci128
= _mm_cvtps_ph(src128
, _MM_FROUND_TRUNC
);
342 UINT value
= _mm_extract_epi16(srci128
, 0);
344 UINT value
= Convert32To16Float(src
);
347 outColor
[comp
] = value
;
349 else if (FormatTraits
<DstFormat
>::GetBPC(comp
) == 11)
351 outColor
[comp
] = Convert32ToSmallFloat
<6>(src
);
353 else if (FormatTraits
<DstFormat
>::GetBPC(comp
) == 10)
355 outColor
[comp
] = Convert32ToSmallFloat
<5>(src
);
359 outColor
[comp
] = *(UINT
*)&src
;
365 SWR_INVALID("Invalid type: %d", type
);
370 typename FormatTraits
<DstFormat
>::FormatT
* pPixel
= (typename FormatTraits
<DstFormat
>::FormatT
*)pDstPixel
;
372 switch (FormatTraits
<DstFormat
>::numComps
)
375 pPixel
->a
= outColor
[3];
377 pPixel
->b
= outColor
[2];
379 pPixel
->g
= outColor
[1];
381 pPixel
->r
= outColor
[0];
384 SWR_INVALID("Invalid # of comps: %d", FormatTraits
<DstFormat
>::numComps
);
388 //////////////////////////////////////////////////////////////////////////
389 /// @brief Convert pixel in any format to float32
390 /// @param pDstPixel - Pointer to destination pixel.
391 /// @param srcPixel - Pointer to source pixel
392 template<SWR_FORMAT SrcFormat
>
393 INLINE
static void ConvertPixelToFloat(
397 uint32_t srcColor
[4]; // typeless bits
400 typename FormatTraits
<SrcFormat
>::FormatT
* pPixel
= (typename FormatTraits
<SrcFormat
>::FormatT
*)pSrc
;
402 // apply format defaults
403 for (uint32_t comp
= 0; comp
< 4; ++comp
)
405 uint32_t def
= FormatTraits
<SrcFormat
>::GetDefault(comp
);
406 dstPixel
[comp
] = *(float*)&def
;
410 switch (FormatTraits
<SrcFormat
>::numComps
)
413 srcColor
[3] = pPixel
->a
;
415 srcColor
[2] = pPixel
->b
;
417 srcColor
[1] = pPixel
->g
;
419 srcColor
[0] = pPixel
->r
;
422 SWR_INVALID("Invalid # of comps: %d", FormatTraits
<SrcFormat
>::numComps
);
425 // Convert components
426 for (uint32_t comp
= 0; comp
< FormatTraits
<SrcFormat
>::numComps
; ++comp
)
428 SWR_TYPE type
= FormatTraits
<SrcFormat
>::GetType(comp
);
430 uint32_t src
= srcColor
[comp
];
437 if (FormatTraits
<SrcFormat
>::isSRGB
&& comp
!= 3)
439 dst
= *(float*)&srgb8Table
[src
];
443 // component sizes > 16 must use fp divide to maintain ulp requirements
444 if (FormatTraits
<SrcFormat
>::GetBPC(comp
) > 16)
446 dst
= (float)src
/ (float)((1 << FormatTraits
<SrcFormat
>::GetBPC(comp
)) - 1);
450 const float scale
= (1.0f
/ (float)((1 << FormatTraits
<SrcFormat
>::GetBPC(comp
)) - 1));
451 dst
= (float)src
* scale
;
454 dstPixel
[FormatTraits
<SrcFormat
>::swizzle(comp
)] = dst
;
459 SWR_ASSERT(!FormatTraits
<SrcFormat
>::isSRGB
);
468 switch (FormatTraits
<SrcFormat
>::GetBPC(comp
))
471 dst
= (float)((int8_t)src
);
474 dst
= (float)((int16_t)src
);
477 dst
= (float)((int32_t)src
);
480 assert(0 && "attempted to load from SNORM with unsupported bpc");
484 dst
= dst
* (1.0f
/ ((1 << (FormatTraits
<SrcFormat
>::GetBPC(comp
) - 1)) - 1));
486 dstPixel
[FormatTraits
<SrcFormat
>::swizzle(comp
)] = dst
;
491 uint32_t dst
= (uint32_t)src
;
492 dstPixel
[FormatTraits
<SrcFormat
>::swizzle(comp
)] = *(float*)&dst
;
498 switch (FormatTraits
<SrcFormat
>::GetBPC(comp
))
510 assert(0 && "attempted to load from SINT with unsupported bpc");
514 dstPixel
[FormatTraits
<SrcFormat
>::swizzle(comp
)] = *(float*)&dst
;
520 if (FormatTraits
<SrcFormat
>::GetBPC(comp
) == 16)
522 #if KNOB_ARCH >= KNOB_ARCH_AVX2
523 // Convert from 16-bit float to 32-bit float using _mm_cvtph_ps
524 // @todo 16bit float instruction support is orthogonal to avx support. need to
525 // add check for F16C support instead.
526 __m128i src128
= _mm_set1_epi32(src
);
527 __m128 res
= _mm_cvtph_ps(src128
);
528 _mm_store_ss(&dst
, res
);
530 dst
= ConvertSmallFloatTo32(src
);
533 else if (FormatTraits
<SrcFormat
>::GetBPC(comp
) == 11)
535 dst
= ConvertSmallFloatTo32(src
<< 4);
537 else if (FormatTraits
<SrcFormat
>::GetBPC(comp
) == 10)
539 dst
= ConvertSmallFloatTo32(src
<< 5);
546 dstPixel
[FormatTraits
<SrcFormat
>::swizzle(comp
)] = *(float*)&dst
;
550 SWR_INVALID("Invalid type: %d", type
);
556 // non-templated version of conversion functions
557 INLINE
static void ConvertPixelFromFloat(
560 const float srcPixel
[4])
564 case R32G32B32A32_FLOAT
: ConvertPixelFromFloat
<R32G32B32A32_FLOAT
>(pDst
, srcPixel
); break;
565 case R32G32B32A32_SINT
: ConvertPixelFromFloat
<R32G32B32A32_SINT
>(pDst
, srcPixel
); break;
566 case R32G32B32A32_UINT
: ConvertPixelFromFloat
<R32G32B32A32_UINT
>(pDst
, srcPixel
); break;
567 case R32G32B32X32_FLOAT
: ConvertPixelFromFloat
<R32G32B32X32_FLOAT
>(pDst
, srcPixel
); break;
568 case R32G32B32A32_SSCALED
: ConvertPixelFromFloat
<R32G32B32A32_SSCALED
>(pDst
, srcPixel
); break;
569 case R32G32B32A32_USCALED
: ConvertPixelFromFloat
<R32G32B32A32_USCALED
>(pDst
, srcPixel
); break;
570 case R32G32B32_FLOAT
: ConvertPixelFromFloat
<R32G32B32_FLOAT
>(pDst
, srcPixel
); break;
571 case R32G32B32_SINT
: ConvertPixelFromFloat
<R32G32B32_SINT
>(pDst
, srcPixel
); break;
572 case R32G32B32_UINT
: ConvertPixelFromFloat
<R32G32B32_UINT
>(pDst
, srcPixel
); break;
573 case R32G32B32_SSCALED
: ConvertPixelFromFloat
<R32G32B32_SSCALED
>(pDst
, srcPixel
); break;
574 case R32G32B32_USCALED
: ConvertPixelFromFloat
<R32G32B32_USCALED
>(pDst
, srcPixel
); break;
575 case R16G16B16A16_UNORM
: ConvertPixelFromFloat
<R16G16B16A16_UNORM
>(pDst
, srcPixel
); break;
576 case R16G16B16A16_SNORM
: ConvertPixelFromFloat
<R16G16B16A16_SNORM
>(pDst
, srcPixel
); break;
577 case R16G16B16A16_SINT
: ConvertPixelFromFloat
<R16G16B16A16_SINT
>(pDst
, srcPixel
); break;
578 case R16G16B16A16_UINT
: ConvertPixelFromFloat
<R16G16B16A16_UINT
>(pDst
, srcPixel
); break;
579 case R16G16B16A16_FLOAT
: ConvertPixelFromFloat
<R16G16B16A16_FLOAT
>(pDst
, srcPixel
); break;
580 case R32G32_FLOAT
: ConvertPixelFromFloat
<R32G32_FLOAT
>(pDst
, srcPixel
); break;
581 case R32G32_SINT
: ConvertPixelFromFloat
<R32G32_SINT
>(pDst
, srcPixel
); break;
582 case R32G32_UINT
: ConvertPixelFromFloat
<R32G32_UINT
>(pDst
, srcPixel
); break;
583 case R32_FLOAT_X8X24_TYPELESS
: ConvertPixelFromFloat
<R32_FLOAT_X8X24_TYPELESS
>(pDst
, srcPixel
); break;
584 case X32_TYPELESS_G8X24_UINT
: ConvertPixelFromFloat
<X32_TYPELESS_G8X24_UINT
>(pDst
, srcPixel
); break;
585 case L32A32_FLOAT
: ConvertPixelFromFloat
<L32A32_FLOAT
>(pDst
, srcPixel
); break;
586 case R16G16B16X16_UNORM
: ConvertPixelFromFloat
<R16G16B16X16_UNORM
>(pDst
, srcPixel
); break;
587 case R16G16B16X16_FLOAT
: ConvertPixelFromFloat
<R16G16B16X16_FLOAT
>(pDst
, srcPixel
); break;
588 case L32X32_FLOAT
: ConvertPixelFromFloat
<L32X32_FLOAT
>(pDst
, srcPixel
); break;
589 case I32X32_FLOAT
: ConvertPixelFromFloat
<I32X32_FLOAT
>(pDst
, srcPixel
); break;
590 case R16G16B16A16_SSCALED
: ConvertPixelFromFloat
<R16G16B16A16_SSCALED
>(pDst
, srcPixel
); break;
591 case R16G16B16A16_USCALED
: ConvertPixelFromFloat
<R16G16B16A16_USCALED
>(pDst
, srcPixel
); break;
592 case R32G32_SSCALED
: ConvertPixelFromFloat
<R32G32_SSCALED
>(pDst
, srcPixel
); break;
593 case R32G32_USCALED
: ConvertPixelFromFloat
<R32G32_USCALED
>(pDst
, srcPixel
); break;
594 case B8G8R8A8_UNORM
: ConvertPixelFromFloat
<B8G8R8A8_UNORM
>(pDst
, srcPixel
); break;
595 case B8G8R8A8_UNORM_SRGB
: ConvertPixelFromFloat
<B8G8R8A8_UNORM_SRGB
>(pDst
, srcPixel
); break;
596 case R10G10B10A2_UNORM
: ConvertPixelFromFloat
<R10G10B10A2_UNORM
>(pDst
, srcPixel
); break;
597 case R10G10B10A2_UNORM_SRGB
: ConvertPixelFromFloat
<R10G10B10A2_UNORM_SRGB
>(pDst
, srcPixel
); break;
598 case R10G10B10A2_UINT
: ConvertPixelFromFloat
<R10G10B10A2_UINT
>(pDst
, srcPixel
); break;
599 case R8G8B8A8_UNORM
: ConvertPixelFromFloat
<R8G8B8A8_UNORM
>(pDst
, srcPixel
); break;
600 case R8G8B8A8_UNORM_SRGB
: ConvertPixelFromFloat
<R8G8B8A8_UNORM_SRGB
>(pDst
, srcPixel
); break;
601 case R8G8B8A8_SNORM
: ConvertPixelFromFloat
<R8G8B8A8_SNORM
>(pDst
, srcPixel
); break;
602 case R8G8B8A8_SINT
: ConvertPixelFromFloat
<R8G8B8A8_SINT
>(pDst
, srcPixel
); break;
603 case R8G8B8A8_UINT
: ConvertPixelFromFloat
<R8G8B8A8_UINT
>(pDst
, srcPixel
); break;
604 case R16G16_UNORM
: ConvertPixelFromFloat
<R16G16_UNORM
>(pDst
, srcPixel
); break;
605 case R16G16_SNORM
: ConvertPixelFromFloat
<R16G16_SNORM
>(pDst
, srcPixel
); break;
606 case R16G16_SINT
: ConvertPixelFromFloat
<R16G16_SINT
>(pDst
, srcPixel
); break;
607 case R16G16_UINT
: ConvertPixelFromFloat
<R16G16_UINT
>(pDst
, srcPixel
); break;
608 case R16G16_FLOAT
: ConvertPixelFromFloat
<R16G16_FLOAT
>(pDst
, srcPixel
); break;
609 case B10G10R10A2_UNORM
: ConvertPixelFromFloat
<B10G10R10A2_UNORM
>(pDst
, srcPixel
); break;
610 case B10G10R10A2_UNORM_SRGB
: ConvertPixelFromFloat
<B10G10R10A2_UNORM_SRGB
>(pDst
, srcPixel
); break;
611 case R11G11B10_FLOAT
: ConvertPixelFromFloat
<R11G11B10_FLOAT
>(pDst
, srcPixel
); break;
612 case R10G10B10_FLOAT_A2_UNORM
: ConvertPixelFromFloat
<R10G10B10_FLOAT_A2_UNORM
>(pDst
, srcPixel
); break;
613 case R32_SINT
: ConvertPixelFromFloat
<R32_SINT
>(pDst
, srcPixel
); break;
614 case R32_UINT
: ConvertPixelFromFloat
<R32_UINT
>(pDst
, srcPixel
); break;
615 case R32_FLOAT
: ConvertPixelFromFloat
<R32_FLOAT
>(pDst
, srcPixel
); break;
616 case R24_UNORM_X8_TYPELESS
: ConvertPixelFromFloat
<R24_UNORM_X8_TYPELESS
>(pDst
, srcPixel
); break;
617 case X24_TYPELESS_G8_UINT
: ConvertPixelFromFloat
<X24_TYPELESS_G8_UINT
>(pDst
, srcPixel
); break;
618 case L32_UNORM
: ConvertPixelFromFloat
<L32_UNORM
>(pDst
, srcPixel
); break;
619 case L16A16_UNORM
: ConvertPixelFromFloat
<L16A16_UNORM
>(pDst
, srcPixel
); break;
620 case I24X8_UNORM
: ConvertPixelFromFloat
<I24X8_UNORM
>(pDst
, srcPixel
); break;
621 case L24X8_UNORM
: ConvertPixelFromFloat
<L24X8_UNORM
>(pDst
, srcPixel
); break;
622 case I32_FLOAT
: ConvertPixelFromFloat
<I32_FLOAT
>(pDst
, srcPixel
); break;
623 case L32_FLOAT
: ConvertPixelFromFloat
<L32_FLOAT
>(pDst
, srcPixel
); break;
624 case A32_FLOAT
: ConvertPixelFromFloat
<A32_FLOAT
>(pDst
, srcPixel
); break;
625 case B8G8R8X8_UNORM
: ConvertPixelFromFloat
<B8G8R8X8_UNORM
>(pDst
, srcPixel
); break;
626 case B8G8R8X8_UNORM_SRGB
: ConvertPixelFromFloat
<B8G8R8X8_UNORM_SRGB
>(pDst
, srcPixel
); break;
627 case R8G8B8X8_UNORM
: ConvertPixelFromFloat
<R8G8B8X8_UNORM
>(pDst
, srcPixel
); break;
628 case R8G8B8X8_UNORM_SRGB
: ConvertPixelFromFloat
<R8G8B8X8_UNORM_SRGB
>(pDst
, srcPixel
); break;
629 case R9G9B9E5_SHAREDEXP
: ConvertPixelFromFloat
<R9G9B9E5_SHAREDEXP
>(pDst
, srcPixel
); break;
630 case B10G10R10X2_UNORM
: ConvertPixelFromFloat
<B10G10R10X2_UNORM
>(pDst
, srcPixel
); break;
631 case L16A16_FLOAT
: ConvertPixelFromFloat
<L16A16_FLOAT
>(pDst
, srcPixel
); break;
632 case R10G10B10X2_USCALED
: ConvertPixelFromFloat
<R10G10B10X2_USCALED
>(pDst
, srcPixel
); break;
633 case R8G8B8A8_SSCALED
: ConvertPixelFromFloat
<R8G8B8A8_SSCALED
>(pDst
, srcPixel
); break;
634 case R8G8B8A8_USCALED
: ConvertPixelFromFloat
<R8G8B8A8_USCALED
>(pDst
, srcPixel
); break;
635 case R16G16_SSCALED
: ConvertPixelFromFloat
<R16G16_SSCALED
>(pDst
, srcPixel
); break;
636 case R16G16_USCALED
: ConvertPixelFromFloat
<R16G16_USCALED
>(pDst
, srcPixel
); break;
637 case R32_SSCALED
: ConvertPixelFromFloat
<R32_SSCALED
>(pDst
, srcPixel
); break;
638 case R32_USCALED
: ConvertPixelFromFloat
<R32_USCALED
>(pDst
, srcPixel
); break;
639 case B5G6R5_UNORM
: ConvertPixelFromFloat
<B5G6R5_UNORM
>(pDst
, srcPixel
); break;
640 case B5G6R5_UNORM_SRGB
: ConvertPixelFromFloat
<B5G6R5_UNORM_SRGB
>(pDst
, srcPixel
); break;
641 case B5G5R5A1_UNORM
: ConvertPixelFromFloat
<B5G5R5A1_UNORM
>(pDst
, srcPixel
); break;
642 case B5G5R5A1_UNORM_SRGB
: ConvertPixelFromFloat
<B5G5R5A1_UNORM_SRGB
>(pDst
, srcPixel
); break;
643 case B4G4R4A4_UNORM
: ConvertPixelFromFloat
<B4G4R4A4_UNORM
>(pDst
, srcPixel
); break;
644 case B4G4R4A4_UNORM_SRGB
: ConvertPixelFromFloat
<B4G4R4A4_UNORM_SRGB
>(pDst
, srcPixel
); break;
645 case R8G8_UNORM
: ConvertPixelFromFloat
<R8G8_UNORM
>(pDst
, srcPixel
); break;
646 case R8G8_SNORM
: ConvertPixelFromFloat
<R8G8_SNORM
>(pDst
, srcPixel
); break;
647 case R8G8_SINT
: ConvertPixelFromFloat
<R8G8_SINT
>(pDst
, srcPixel
); break;
648 case R8G8_UINT
: ConvertPixelFromFloat
<R8G8_UINT
>(pDst
, srcPixel
); break;
649 case R16_UNORM
: ConvertPixelFromFloat
<R16_UNORM
>(pDst
, srcPixel
); break;
650 case R16_SNORM
: ConvertPixelFromFloat
<R16_SNORM
>(pDst
, srcPixel
); break;
651 case R16_SINT
: ConvertPixelFromFloat
<R16_SINT
>(pDst
, srcPixel
); break;
652 case R16_UINT
: ConvertPixelFromFloat
<R16_UINT
>(pDst
, srcPixel
); break;
653 case R16_FLOAT
: ConvertPixelFromFloat
<R16_FLOAT
>(pDst
, srcPixel
); break;
654 case I16_UNORM
: ConvertPixelFromFloat
<I16_UNORM
>(pDst
, srcPixel
); break;
655 case L16_UNORM
: ConvertPixelFromFloat
<L16_UNORM
>(pDst
, srcPixel
); break;
656 case A16_UNORM
: ConvertPixelFromFloat
<A16_UNORM
>(pDst
, srcPixel
); break;
657 case L8A8_UNORM
: ConvertPixelFromFloat
<L8A8_UNORM
>(pDst
, srcPixel
); break;
658 case I16_FLOAT
: ConvertPixelFromFloat
<I16_FLOAT
>(pDst
, srcPixel
); break;
659 case L16_FLOAT
: ConvertPixelFromFloat
<L16_FLOAT
>(pDst
, srcPixel
); break;
660 case A16_FLOAT
: ConvertPixelFromFloat
<A16_FLOAT
>(pDst
, srcPixel
); break;
661 case L8A8_UNORM_SRGB
: ConvertPixelFromFloat
<L8A8_UNORM_SRGB
>(pDst
, srcPixel
); break;
662 case B5G5R5X1_UNORM
: ConvertPixelFromFloat
<B5G5R5X1_UNORM
>(pDst
, srcPixel
); break;
663 case B5G5R5X1_UNORM_SRGB
: ConvertPixelFromFloat
<B5G5R5X1_UNORM_SRGB
>(pDst
, srcPixel
); break;
664 case R8G8_SSCALED
: ConvertPixelFromFloat
<R8G8_SSCALED
>(pDst
, srcPixel
); break;
665 case R8G8_USCALED
: ConvertPixelFromFloat
<R8G8_USCALED
>(pDst
, srcPixel
); break;
666 case R16_SSCALED
: ConvertPixelFromFloat
<R16_SSCALED
>(pDst
, srcPixel
); break;
667 case R16_USCALED
: ConvertPixelFromFloat
<R16_USCALED
>(pDst
, srcPixel
); break;
668 case A1B5G5R5_UNORM
: ConvertPixelFromFloat
<A1B5G5R5_UNORM
>(pDst
, srcPixel
); break;
669 case A4B4G4R4_UNORM
: ConvertPixelFromFloat
<A4B4G4R4_UNORM
>(pDst
, srcPixel
); break;
670 case L8A8_UINT
: ConvertPixelFromFloat
<L8A8_UINT
>(pDst
, srcPixel
); break;
671 case L8A8_SINT
: ConvertPixelFromFloat
<L8A8_SINT
>(pDst
, srcPixel
); break;
672 case R8_UNORM
: ConvertPixelFromFloat
<R8_UNORM
>(pDst
, srcPixel
); break;
673 case R8_SNORM
: ConvertPixelFromFloat
<R8_SNORM
>(pDst
, srcPixel
); break;
674 case R8_SINT
: ConvertPixelFromFloat
<R8_SINT
>(pDst
, srcPixel
); break;
675 case R8_UINT
: ConvertPixelFromFloat
<R8_UINT
>(pDst
, srcPixel
); break;
676 case A8_UNORM
: ConvertPixelFromFloat
<A8_UNORM
>(pDst
, srcPixel
); break;
677 case I8_UNORM
: ConvertPixelFromFloat
<I8_UNORM
>(pDst
, srcPixel
); break;
678 case L8_UNORM
: ConvertPixelFromFloat
<L8_UNORM
>(pDst
, srcPixel
); break;
679 case R8_SSCALED
: ConvertPixelFromFloat
<R8_SSCALED
>(pDst
, srcPixel
); break;
680 case R8_USCALED
: ConvertPixelFromFloat
<R8_USCALED
>(pDst
, srcPixel
); break;
681 case L8_UNORM_SRGB
: ConvertPixelFromFloat
<L8_UNORM_SRGB
>(pDst
, srcPixel
); break;
682 case L8_UINT
: ConvertPixelFromFloat
<L8_UINT
>(pDst
, srcPixel
); break;
683 case L8_SINT
: ConvertPixelFromFloat
<L8_SINT
>(pDst
, srcPixel
); break;
684 case I8_UINT
: ConvertPixelFromFloat
<I8_UINT
>(pDst
, srcPixel
); break;
685 case I8_SINT
: ConvertPixelFromFloat
<I8_SINT
>(pDst
, srcPixel
); break;
686 case YCRCB_SWAPUVY
: ConvertPixelFromFloat
<YCRCB_SWAPUVY
>(pDst
, srcPixel
); break;
687 case BC1_UNORM
: ConvertPixelFromFloat
<BC1_UNORM
>(pDst
, srcPixel
); break;
688 case BC2_UNORM
: ConvertPixelFromFloat
<BC2_UNORM
>(pDst
, srcPixel
); break;
689 case BC3_UNORM
: ConvertPixelFromFloat
<BC3_UNORM
>(pDst
, srcPixel
); break;
690 case BC4_UNORM
: ConvertPixelFromFloat
<BC4_UNORM
>(pDst
, srcPixel
); break;
691 case BC5_UNORM
: ConvertPixelFromFloat
<BC5_UNORM
>(pDst
, srcPixel
); break;
692 case BC1_UNORM_SRGB
: ConvertPixelFromFloat
<BC1_UNORM_SRGB
>(pDst
, srcPixel
); break;
693 case BC2_UNORM_SRGB
: ConvertPixelFromFloat
<BC2_UNORM_SRGB
>(pDst
, srcPixel
); break;
694 case BC3_UNORM_SRGB
: ConvertPixelFromFloat
<BC3_UNORM_SRGB
>(pDst
, srcPixel
); break;
695 case YCRCB_SWAPUV
: ConvertPixelFromFloat
<YCRCB_SWAPUV
>(pDst
, srcPixel
); break;
696 case R8G8B8_UNORM
: ConvertPixelFromFloat
<R8G8B8_UNORM
>(pDst
, srcPixel
); break;
697 case R8G8B8_SNORM
: ConvertPixelFromFloat
<R8G8B8_SNORM
>(pDst
, srcPixel
); break;
698 case R8G8B8_SSCALED
: ConvertPixelFromFloat
<R8G8B8_SSCALED
>(pDst
, srcPixel
); break;
699 case R8G8B8_USCALED
: ConvertPixelFromFloat
<R8G8B8_USCALED
>(pDst
, srcPixel
); break;
700 case BC4_SNORM
: ConvertPixelFromFloat
<BC4_SNORM
>(pDst
, srcPixel
); break;
701 case BC5_SNORM
: ConvertPixelFromFloat
<BC5_SNORM
>(pDst
, srcPixel
); break;
702 case R16G16B16_FLOAT
: ConvertPixelFromFloat
<R16G16B16_FLOAT
>(pDst
, srcPixel
); break;
703 case R16G16B16_UNORM
: ConvertPixelFromFloat
<R16G16B16_UNORM
>(pDst
, srcPixel
); break;
704 case R16G16B16_SNORM
: ConvertPixelFromFloat
<R16G16B16_SNORM
>(pDst
, srcPixel
); break;
705 case R16G16B16_SSCALED
: ConvertPixelFromFloat
<R16G16B16_SSCALED
>(pDst
, srcPixel
); break;
706 case R16G16B16_USCALED
: ConvertPixelFromFloat
<R16G16B16_USCALED
>(pDst
, srcPixel
); break;
707 case BC6H_SF16
: ConvertPixelFromFloat
<BC6H_SF16
>(pDst
, srcPixel
); break;
708 case BC7_UNORM
: ConvertPixelFromFloat
<BC7_UNORM
>(pDst
, srcPixel
); break;
709 case BC7_UNORM_SRGB
: ConvertPixelFromFloat
<BC7_UNORM_SRGB
>(pDst
, srcPixel
); break;
710 case BC6H_UF16
: ConvertPixelFromFloat
<BC6H_UF16
>(pDst
, srcPixel
); break;
711 case R8G8B8_UNORM_SRGB
: ConvertPixelFromFloat
<R8G8B8_UNORM_SRGB
>(pDst
, srcPixel
); break;
712 case R16G16B16_UINT
: ConvertPixelFromFloat
<R16G16B16_UINT
>(pDst
, srcPixel
); break;
713 case R16G16B16_SINT
: ConvertPixelFromFloat
<R16G16B16_SINT
>(pDst
, srcPixel
); break;
714 case R10G10B10A2_SNORM
: ConvertPixelFromFloat
<R10G10B10A2_SNORM
>(pDst
, srcPixel
); break;
715 case R10G10B10A2_USCALED
: ConvertPixelFromFloat
<R10G10B10A2_USCALED
>(pDst
, srcPixel
); break;
716 case R10G10B10A2_SSCALED
: ConvertPixelFromFloat
<R10G10B10A2_SSCALED
>(pDst
, srcPixel
); break;
717 case R10G10B10A2_SINT
: ConvertPixelFromFloat
<R10G10B10A2_SINT
>(pDst
, srcPixel
); break;
718 case B10G10R10A2_SNORM
: ConvertPixelFromFloat
<B10G10R10A2_SNORM
>(pDst
, srcPixel
); break;
719 case B10G10R10A2_USCALED
: ConvertPixelFromFloat
<B10G10R10A2_USCALED
>(pDst
, srcPixel
); break;
720 case B10G10R10A2_SSCALED
: ConvertPixelFromFloat
<B10G10R10A2_SSCALED
>(pDst
, srcPixel
); break;
721 case B10G10R10A2_UINT
: ConvertPixelFromFloat
<B10G10R10A2_UINT
>(pDst
, srcPixel
); break;
722 case B10G10R10A2_SINT
: ConvertPixelFromFloat
<B10G10R10A2_SINT
>(pDst
, srcPixel
); break;
723 case R8G8B8_UINT
: ConvertPixelFromFloat
<R8G8B8_UINT
>(pDst
, srcPixel
); break;
724 case R8G8B8_SINT
: ConvertPixelFromFloat
<R8G8B8_SINT
>(pDst
, srcPixel
); break;
725 case RAW
: ConvertPixelFromFloat
<RAW
>(pDst
, srcPixel
); break;
727 SWR_INVALID("Invalid format: %d", format
);