Path: blob/21.2-virgl/src/gallium/drivers/swr/rasterizer/memory/Convert.h
4574 views
/****************************************************************************1* Copyright (C) 2014-2015 Intel Corporation. All Rights Reserved.2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* the rights to use, copy, modify, merge, publish, distribute, sublicense,7* and/or sell copies of the Software, and to permit persons to whom the8* Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL17* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER18* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING19* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS20* IN THE SOFTWARE.21*22* @file Convert.h23*24* @brief Conversion utility functions25*26******************************************************************************/27#pragma once2829#if defined(_MSC_VER)30// disable "potential divide by 0"31#pragma warning(disable: 4723)32#endif3334#include <cmath>3536//////////////////////////////////////////////////////////////////////////37/// @brief Convert an IEEE 754 16-bit float to an 32-bit single precision38/// float39/// @param val - 16-bit float40/// @todo Maybe move this outside of this file into a header?41static INLINE float ConvertSmallFloatTo32(UINT val)42{43UINT result;44if ((val & 0x7fff) == 0)45{46result = ((uint32_t)(val & 0x8000)) << 16;47}48else if ((val & 0x7c00) == 0x7c00)49{50result = ((val & 0x3ff) == 0) ? 0x7f800000 : 0x7fc00000;51result |= ((uint32_t)val & 0x8000) << 16;52}53else54{55uint32_t sign = (val & 0x8000) << 16;56uint32_t mant = (val & 0x3ff) << 13;57uint32_t exp = (val >> 10) & 0x1f;58if ((exp == 0) && (mant != 0)) // Adjust exponent and mantissa for denormals59{60mant <<= 1;61while (mant < (0x400 << 13))62{63exp--;64mant <<= 1;65}66mant &= (0x3ff << 13);67}68exp = ((exp - 15 + 127) & 0xff) << 23;69result = sign | exp | mant;70}7172return *(float*)&result;73}7475//////////////////////////////////////////////////////////////////////////76/// @brief Convert an IEEE 754 32-bit single precision float to an77/// unsigned small float with 5 exponent bits and a variable78/// number of mantissa bits.79/// @param val - 32-bit float80/// @todo Maybe move this outside of this file into a header?81template<UINT numMantissaBits>82static UINT Convert32ToSmallFloat(float val)83{84uint32_t sign, exp, mant;85uint32_t roundBits;8687// Extract the sign, exponent, and mantissa88UINT uf = *(UINT*)&val;8990sign = (uf & 0x80000000) >> 31;91exp = (uf & 0x7F800000) >> 23;92mant = uf & 0x007FFFFF;9394// 10/11 bit floats are unsigned. Negative values are clamped to 0.95if (sign != 0)96{97exp = mant = 0;98}99// Check for out of range100else if ((exp == 0xFF) && (mant != 0)) // NaN101{102exp = 0x1F;103mant = 1 << numMantissaBits;104}105else if ((exp == 0xFF) && (mant == 0)) // INF106{107exp = 0x1F;108mant = 0;109}110else if (exp > (0x70 + 0x1E)) // Too big to represent111{112exp = 0x1Eu;113mant = (1 << numMantissaBits) - 1; // 0x3F for 6 bit mantissa.114}115else if ((exp <= 0x70) && (exp >= 0x66)) // It's a denorm116{117mant |= 0x00800000;118for (; exp <= 0x70; mant >>= 1, exp++)119;120exp = 0;121mant = mant >> (23 - numMantissaBits);122}123else if (exp < 0x66) // Too small to represent -> Zero124{125exp = 0;126mant = 0;127}128else129{130// Saves bits that will be shifted off for rounding131roundBits = mant & 0x1FFFu;132// convert exponent and mantissa to 16 bit format133exp = exp - 0x70u;134mant = mant >> (23 - numMantissaBits);135136// Essentially RTZ, but round up if off by only 1 lsb137if (roundBits == 0x1FFFu)138{139mant++;140// check for overflow141if ((mant & (0x3 << numMantissaBits)) != 0) // 0x60 = 0x3 << (num Mantissa Bits)142exp++;143// make sure only the needed bits are used144mant &= (1 << numMantissaBits) - 1;145}146}147148UINT tmpVal = (exp << numMantissaBits) | mant;149return tmpVal;150}151152#if KNOB_ARCH == KNOB_ARCH_AVX153//////////////////////////////////////////////////////////////////////////154/// @brief Convert an IEEE 754 32-bit single precision float to an155/// 16 bit float with 5 exponent bits and a variable156/// number of mantissa bits.157/// @param val - 32-bit float158/// @todo Maybe move this outside of this file into a header?159static uint16_t Convert32To16Float(float val)160{161uint32_t sign, exp, mant;162uint32_t roundBits;163164// Extract the sign, exponent, and mantissa165uint32_t uf = *(uint32_t*)&val;166sign = (uf & 0x80000000) >> 31;167exp = (uf & 0x7F800000) >> 23;168mant = uf & 0x007FFFFF;169170// Check for out of range171if (std::isnan(val))172{173exp = 0x1F;174mant = 0x200;175sign = 1; // set the sign bit for NANs176}177else if (std::isinf(val))178{179exp = 0x1f;180mant = 0x0;181}182else if (exp > (0x70 + 0x1E)) // Too big to represent -> max representable value183{184exp = 0x1E;185mant = 0x3FF;186}187else if ((exp <= 0x70) && (exp >= 0x66)) // It's a denorm188{189mant |= 0x00800000;190for (; exp <= 0x70; mant >>= 1, exp++)191;192exp = 0;193mant = mant >> 13;194}195else if (exp < 0x66) // Too small to represent -> Zero196{197exp = 0;198mant = 0;199}200else201{202// Saves bits that will be shifted off for rounding203roundBits = mant & 0x1FFFu;204// convert exponent and mantissa to 16 bit format205exp = exp - 0x70;206mant = mant >> 13;207208// Essentially RTZ, but round up if off by only 1 lsb209if (roundBits == 0x1FFFu)210{211mant++;212// check for overflow213if ((mant & 0xC00u) != 0)214exp++;215// make sure only the needed bits are used216mant &= 0x3FF;217}218}219220uint32_t tmpVal = (sign << 15) | (exp << 10) | mant;221return (uint16_t)tmpVal;222}223#endif224225//////////////////////////////////////////////////////////////////////////226/// @brief Retrieve color from hot tile source which is always float.227/// @param pDstPixel - Pointer to destination pixel.228/// @param srcPixel - Pointer to source pixel (pre-swizzled according to dest).229template<SWR_FORMAT DstFormat>230static void ConvertPixelFromFloat(231uint8_t* pDstPixel,232const float srcPixel[4])233{234uint32_t outColor[4] = { 0 }; // typeless bits235236// Store component237for (UINT comp = 0; comp < FormatTraits<DstFormat>::numComps; ++comp)238{239SWR_TYPE type = FormatTraits<DstFormat>::GetType(comp);240241float src = srcPixel[comp];242243switch (type)244{245case SWR_TYPE_UNORM:246{247// Force NaN to 0. IEEE standard, comparisons involving NaN always evaluate to false.248src = (src != src) ? 0.0f : src;249250// Clamp [0, 1]251src = std::max(src, 0.0f);252src = std::min(src, 1.0f);253254// SRGB255if (FormatTraits<DstFormat>::isSRGB && comp != 3)256{257src = (src <= 0.0031308f) ? (12.92f * src) : (1.055f * powf(src, (1.0f / 2.4f)) - 0.055f);258}259260// Float scale to integer scale.261UINT scale = (1 << FormatTraits<DstFormat>::GetBPC(comp)) - 1;262src = (float)scale * src;263src = roundf(src);264outColor[comp] = (UINT)src; // Drop fractional part.265break;266}267case SWR_TYPE_SNORM:268{269SWR_ASSERT(!FormatTraits<DstFormat>::isSRGB);270271// Force NaN to 0. IEEE standard, comparisons involving NaN always evaluate to false.272src = (src != src) ? 0.0f : src;273274// Clamp [-1, 1]275src = std::max(src, -1.0f);276src = std::min(src, 1.0f);277278// Float scale to integer scale.279UINT scale = (1 << (FormatTraits<DstFormat>::GetBPC(comp) - 1)) - 1;280src = (float)scale * src;281282// Round283src += (src >= 0) ? 0.5f : -0.5f;284285INT out = (INT)src;286287outColor[comp] = *(UINT*)&out;288289break;290}291case SWR_TYPE_UINT:292{293///@note The *(UINT*)& is currently necessary as the hot tile appears to always be float.294// However, the number in the hot tile should be unsigned integer. So doing this295// to preserve bits intead of doing a float -> integer conversion.296if (FormatTraits<DstFormat>::GetBPC(comp) == 32)297{298outColor[comp] = *(UINT*)&src;299}300else301{302outColor[comp] = *(UINT*)&src;303UINT max = (1 << FormatTraits<DstFormat>::GetBPC(comp)) - 1; // 2^numBits - 1304305outColor[comp] = std::min(max, outColor[comp]);306}307break;308}309case SWR_TYPE_SINT:310{311if (FormatTraits<DstFormat>::GetBPC(comp) == 32)312{313outColor[comp] = *(UINT*)&src;314}315else316{317INT out = *(INT*)&src; // Hot tile format is SINT?318INT max = (1 << (FormatTraits<DstFormat>::GetBPC(comp) - 1)) - 1;319INT min = -1 - max;320321///@note The output is unsigned integer (bag of bits) and so performing322// the clamping here based on range of output component. Also, manually adding323// the sign bit in the appropriate spot. Maybe a better way?324out = std::max(out, min);325out = std::min(out, max);326327outColor[comp] = *(UINT*)&out;328}329break;330}331case SWR_TYPE_FLOAT:332{333if (FormatTraits<DstFormat>::GetBPC(comp) == 16)334{335// Convert from 32-bit float to 16-bit float using _mm_cvtps_ph336// @todo 16bit float instruction support is orthogonal to avx support. need to337// add check for F16C support instead.338#if KNOB_ARCH >= KNOB_ARCH_AVX2339__m128 src128 = _mm_set1_ps(src);340__m128i srci128 = _mm_cvtps_ph(src128, _MM_FROUND_TRUNC);341UINT value = _mm_extract_epi16(srci128, 0);342#else343UINT value = Convert32To16Float(src);344#endif345346outColor[comp] = value;347}348else if (FormatTraits<DstFormat>::GetBPC(comp) == 11)349{350outColor[comp] = Convert32ToSmallFloat<6>(src);351}352else if (FormatTraits<DstFormat>::GetBPC(comp) == 10)353{354outColor[comp] = Convert32ToSmallFloat<5>(src);355}356else357{358outColor[comp] = *(UINT*)&src;359}360361break;362}363default:364SWR_INVALID("Invalid type: %d", type);365break;366}367}368369typename FormatTraits<DstFormat>::FormatT* pPixel = (typename FormatTraits<DstFormat>::FormatT*)pDstPixel;370371switch (FormatTraits<DstFormat>::numComps)372{373case 4:374pPixel->a = outColor[3];375case 3:376pPixel->b = outColor[2];377case 2:378pPixel->g = outColor[1];379case 1:380pPixel->r = outColor[0];381break;382default:383SWR_INVALID("Invalid # of comps: %d", FormatTraits<DstFormat>::numComps);384}385}386387//////////////////////////////////////////////////////////////////////////388/// @brief Convert pixel in any format to float32389/// @param pDstPixel - Pointer to destination pixel.390/// @param srcPixel - Pointer to source pixel391template<SWR_FORMAT SrcFormat>392INLINE static void ConvertPixelToFloat(393float dstPixel[4],394const uint8_t* pSrc)395{396uint32_t srcColor[4]; // typeless bits397398// unpack src pixel399typename FormatTraits<SrcFormat>::FormatT* pPixel = (typename FormatTraits<SrcFormat>::FormatT*)pSrc;400401// apply format defaults402for (uint32_t comp = 0; comp < 4; ++comp)403{404uint32_t def = FormatTraits<SrcFormat>::GetDefault(comp);405dstPixel[comp] = *(float*)&def;406}407408// load format data409switch (FormatTraits<SrcFormat>::numComps)410{411case 4:412srcColor[3] = pPixel->a;413case 3:414srcColor[2] = pPixel->b;415case 2:416srcColor[1] = pPixel->g;417case 1:418srcColor[0] = pPixel->r;419break;420default:421SWR_INVALID("Invalid # of comps: %d", FormatTraits<SrcFormat>::numComps);422}423424// Convert components425for (uint32_t comp = 0; comp < FormatTraits<SrcFormat>::numComps; ++comp)426{427SWR_TYPE type = FormatTraits<SrcFormat>::GetType(comp);428429uint32_t src = srcColor[comp];430431switch (type)432{433case SWR_TYPE_UNORM:434{435float dst;436if (FormatTraits<SrcFormat>::isSRGB && comp != 3)437{438dst = *(float*)&srgb8Table[src];439}440else441{442// component sizes > 16 must use fp divide to maintain ulp requirements443if (FormatTraits<SrcFormat>::GetBPC(comp) > 16)444{445dst = (float)src / (float)((1 << FormatTraits<SrcFormat>::GetBPC(comp)) - 1);446}447else448{449const float scale = (1.0f / (float)((1 << FormatTraits<SrcFormat>::GetBPC(comp)) - 1));450dst = (float)src * scale;451}452}453dstPixel[FormatTraits<SrcFormat>::swizzle(comp)] = dst;454break;455}456case SWR_TYPE_SNORM:457{458SWR_ASSERT(!FormatTraits<SrcFormat>::isSRGB);459460float dst;461if (src == 0x10)462{463dst = -1.0f;464}465else466{467switch (FormatTraits<SrcFormat>::GetBPC(comp))468{469case 8:470dst = (float)((int8_t)src);471break;472case 16:473dst = (float)((int16_t)src);474break;475case 32:476dst = (float)((int32_t)src);477break;478default:479assert(0 && "attempted to load from SNORM with unsupported bpc");480dst = 0.0f;481break;482}483dst = dst * (1.0f / ((1 << (FormatTraits<SrcFormat>::GetBPC(comp) - 1)) - 1));484}485dstPixel[FormatTraits<SrcFormat>::swizzle(comp)] = dst;486break;487}488case SWR_TYPE_UINT:489{490uint32_t dst = (uint32_t)src;491dstPixel[FormatTraits<SrcFormat>::swizzle(comp)] = *(float*)&dst;492break;493}494case SWR_TYPE_SINT:495{496int dst;497switch (FormatTraits<SrcFormat>::GetBPC(comp))498{499case 8:500dst = (int8_t)src;501break;502case 16:503dst = (int16_t)src;504break;505case 32:506dst = (int32_t)src;507break;508default:509assert(0 && "attempted to load from SINT with unsupported bpc");510dst = 0;511break;512}513dstPixel[FormatTraits<SrcFormat>::swizzle(comp)] = *(float*)&dst;514break;515}516case SWR_TYPE_FLOAT:517{518float dst;519if (FormatTraits<SrcFormat>::GetBPC(comp) == 16)520{521#if KNOB_ARCH >= KNOB_ARCH_AVX2522// Convert from 16-bit float to 32-bit float using _mm_cvtph_ps523// @todo 16bit float instruction support is orthogonal to avx support. need to524// add check for F16C support instead.525__m128i src128 = _mm_set1_epi32(src);526__m128 res = _mm_cvtph_ps(src128);527_mm_store_ss(&dst, res);528#else529dst = ConvertSmallFloatTo32(src);530#endif531}532else if (FormatTraits<SrcFormat>::GetBPC(comp) == 11)533{534dst = ConvertSmallFloatTo32(src << 4);535}536else if (FormatTraits<SrcFormat>::GetBPC(comp) == 10)537{538dst = ConvertSmallFloatTo32(src << 5);539}540else541{542dst = *(float*)&src;543}544545dstPixel[FormatTraits<SrcFormat>::swizzle(comp)] = *(float*)&dst;546break;547}548default:549SWR_INVALID("Invalid type: %d", type);550break;551}552}553}554555// non-templated version of conversion functions556INLINE static void ConvertPixelFromFloat(557SWR_FORMAT format,558uint8_t* pDst,559const float srcPixel[4])560{561switch (format)562{563case R32G32B32A32_FLOAT: ConvertPixelFromFloat<R32G32B32A32_FLOAT>(pDst, srcPixel); break;564case R32G32B32A32_SINT: ConvertPixelFromFloat<R32G32B32A32_SINT>(pDst, srcPixel); break;565case R32G32B32A32_UINT: ConvertPixelFromFloat<R32G32B32A32_UINT>(pDst, srcPixel); break;566case R32G32B32X32_FLOAT: ConvertPixelFromFloat<R32G32B32X32_FLOAT>(pDst, srcPixel); break;567case R32G32B32A32_SSCALED: ConvertPixelFromFloat<R32G32B32A32_SSCALED>(pDst, srcPixel); break;568case R32G32B32A32_USCALED: ConvertPixelFromFloat<R32G32B32A32_USCALED>(pDst, srcPixel); break;569case R32G32B32_FLOAT: ConvertPixelFromFloat<R32G32B32_FLOAT>(pDst, srcPixel); break;570case R32G32B32_SINT: ConvertPixelFromFloat<R32G32B32_SINT>(pDst, srcPixel); break;571case R32G32B32_UINT: ConvertPixelFromFloat<R32G32B32_UINT>(pDst, srcPixel); break;572case R32G32B32_SSCALED: ConvertPixelFromFloat<R32G32B32_SSCALED>(pDst, srcPixel); break;573case R32G32B32_USCALED: ConvertPixelFromFloat<R32G32B32_USCALED>(pDst, srcPixel); break;574case R16G16B16A16_UNORM: ConvertPixelFromFloat<R16G16B16A16_UNORM>(pDst, srcPixel); break;575case R16G16B16A16_SNORM: ConvertPixelFromFloat<R16G16B16A16_SNORM>(pDst, srcPixel); break;576case R16G16B16A16_SINT: ConvertPixelFromFloat<R16G16B16A16_SINT>(pDst, srcPixel); break;577case R16G16B16A16_UINT: ConvertPixelFromFloat<R16G16B16A16_UINT>(pDst, srcPixel); break;578case R16G16B16A16_FLOAT: ConvertPixelFromFloat<R16G16B16A16_FLOAT>(pDst, srcPixel); break;579case R32G32_FLOAT: ConvertPixelFromFloat<R32G32_FLOAT>(pDst, srcPixel); break;580case R32G32_SINT: ConvertPixelFromFloat<R32G32_SINT>(pDst, srcPixel); break;581case R32G32_UINT: ConvertPixelFromFloat<R32G32_UINT>(pDst, srcPixel); break;582case R32_FLOAT_X8X24_TYPELESS: ConvertPixelFromFloat<R32_FLOAT_X8X24_TYPELESS>(pDst, srcPixel); break;583case X32_TYPELESS_G8X24_UINT: ConvertPixelFromFloat<X32_TYPELESS_G8X24_UINT>(pDst, srcPixel); break;584case L32A32_FLOAT: ConvertPixelFromFloat<L32A32_FLOAT>(pDst, srcPixel); break;585case R16G16B16X16_UNORM: ConvertPixelFromFloat<R16G16B16X16_UNORM>(pDst, srcPixel); break;586case R16G16B16X16_FLOAT: ConvertPixelFromFloat<R16G16B16X16_FLOAT>(pDst, srcPixel); break;587case L32X32_FLOAT: ConvertPixelFromFloat<L32X32_FLOAT>(pDst, srcPixel); break;588case I32X32_FLOAT: ConvertPixelFromFloat<I32X32_FLOAT>(pDst, srcPixel); break;589case R16G16B16A16_SSCALED: ConvertPixelFromFloat<R16G16B16A16_SSCALED>(pDst, srcPixel); break;590case R16G16B16A16_USCALED: ConvertPixelFromFloat<R16G16B16A16_USCALED>(pDst, srcPixel); break;591case R32G32_SSCALED: ConvertPixelFromFloat<R32G32_SSCALED>(pDst, srcPixel); break;592case R32G32_USCALED: ConvertPixelFromFloat<R32G32_USCALED>(pDst, srcPixel); break;593case B8G8R8A8_UNORM: ConvertPixelFromFloat<B8G8R8A8_UNORM>(pDst, srcPixel); break;594case B8G8R8A8_UNORM_SRGB: ConvertPixelFromFloat<B8G8R8A8_UNORM_SRGB>(pDst, srcPixel); break;595case R10G10B10A2_UNORM: ConvertPixelFromFloat<R10G10B10A2_UNORM>(pDst, srcPixel); break;596case R10G10B10A2_UNORM_SRGB: ConvertPixelFromFloat<R10G10B10A2_UNORM_SRGB>(pDst, srcPixel); break;597case R10G10B10A2_UINT: ConvertPixelFromFloat<R10G10B10A2_UINT>(pDst, srcPixel); break;598case R8G8B8A8_UNORM: ConvertPixelFromFloat<R8G8B8A8_UNORM>(pDst, srcPixel); break;599case R8G8B8A8_UNORM_SRGB: ConvertPixelFromFloat<R8G8B8A8_UNORM_SRGB>(pDst, srcPixel); break;600case R8G8B8A8_SNORM: ConvertPixelFromFloat<R8G8B8A8_SNORM>(pDst, srcPixel); break;601case R8G8B8A8_SINT: ConvertPixelFromFloat<R8G8B8A8_SINT>(pDst, srcPixel); break;602case R8G8B8A8_UINT: ConvertPixelFromFloat<R8G8B8A8_UINT>(pDst, srcPixel); break;603case R16G16_UNORM: ConvertPixelFromFloat<R16G16_UNORM>(pDst, srcPixel); break;604case R16G16_SNORM: ConvertPixelFromFloat<R16G16_SNORM>(pDst, srcPixel); break;605case R16G16_SINT: ConvertPixelFromFloat<R16G16_SINT>(pDst, srcPixel); break;606case R16G16_UINT: ConvertPixelFromFloat<R16G16_UINT>(pDst, srcPixel); break;607case R16G16_FLOAT: ConvertPixelFromFloat<R16G16_FLOAT>(pDst, srcPixel); break;608case B10G10R10A2_UNORM: ConvertPixelFromFloat<B10G10R10A2_UNORM>(pDst, srcPixel); break;609case B10G10R10A2_UNORM_SRGB: ConvertPixelFromFloat<B10G10R10A2_UNORM_SRGB>(pDst, srcPixel); break;610case R11G11B10_FLOAT: ConvertPixelFromFloat<R11G11B10_FLOAT>(pDst, srcPixel); break;611case R10G10B10_FLOAT_A2_UNORM: ConvertPixelFromFloat<R10G10B10_FLOAT_A2_UNORM>(pDst, srcPixel); break;612case R32_SINT: ConvertPixelFromFloat<R32_SINT>(pDst, srcPixel); break;613case R32_UINT: ConvertPixelFromFloat<R32_UINT>(pDst, srcPixel); break;614case R32_FLOAT: ConvertPixelFromFloat<R32_FLOAT>(pDst, srcPixel); break;615case R24_UNORM_X8_TYPELESS: ConvertPixelFromFloat<R24_UNORM_X8_TYPELESS>(pDst, srcPixel); break;616case X24_TYPELESS_G8_UINT: ConvertPixelFromFloat<X24_TYPELESS_G8_UINT>(pDst, srcPixel); break;617case L32_UNORM: ConvertPixelFromFloat<L32_UNORM>(pDst, srcPixel); break;618case L16A16_UNORM: ConvertPixelFromFloat<L16A16_UNORM>(pDst, srcPixel); break;619case I24X8_UNORM: ConvertPixelFromFloat<I24X8_UNORM>(pDst, srcPixel); break;620case L24X8_UNORM: ConvertPixelFromFloat<L24X8_UNORM>(pDst, srcPixel); break;621case I32_FLOAT: ConvertPixelFromFloat<I32_FLOAT>(pDst, srcPixel); break;622case L32_FLOAT: ConvertPixelFromFloat<L32_FLOAT>(pDst, srcPixel); break;623case A32_FLOAT: ConvertPixelFromFloat<A32_FLOAT>(pDst, srcPixel); break;624case B8G8R8X8_UNORM: ConvertPixelFromFloat<B8G8R8X8_UNORM>(pDst, srcPixel); break;625case B8G8R8X8_UNORM_SRGB: ConvertPixelFromFloat<B8G8R8X8_UNORM_SRGB>(pDst, srcPixel); break;626case R8G8B8X8_UNORM: ConvertPixelFromFloat<R8G8B8X8_UNORM>(pDst, srcPixel); break;627case R8G8B8X8_UNORM_SRGB: ConvertPixelFromFloat<R8G8B8X8_UNORM_SRGB>(pDst, srcPixel); break;628case R9G9B9E5_SHAREDEXP: ConvertPixelFromFloat<R9G9B9E5_SHAREDEXP>(pDst, srcPixel); break;629case B10G10R10X2_UNORM: ConvertPixelFromFloat<B10G10R10X2_UNORM>(pDst, srcPixel); break;630case L16A16_FLOAT: ConvertPixelFromFloat<L16A16_FLOAT>(pDst, srcPixel); break;631case R10G10B10X2_USCALED: ConvertPixelFromFloat<R10G10B10X2_USCALED>(pDst, srcPixel); break;632case R8G8B8A8_SSCALED: ConvertPixelFromFloat<R8G8B8A8_SSCALED>(pDst, srcPixel); break;633case R8G8B8A8_USCALED: ConvertPixelFromFloat<R8G8B8A8_USCALED>(pDst, srcPixel); break;634case R16G16_SSCALED: ConvertPixelFromFloat<R16G16_SSCALED>(pDst, srcPixel); break;635case R16G16_USCALED: ConvertPixelFromFloat<R16G16_USCALED>(pDst, srcPixel); break;636case R32_SSCALED: ConvertPixelFromFloat<R32_SSCALED>(pDst, srcPixel); break;637case R32_USCALED: ConvertPixelFromFloat<R32_USCALED>(pDst, srcPixel); break;638case B5G6R5_UNORM: ConvertPixelFromFloat<B5G6R5_UNORM>(pDst, srcPixel); break;639case B5G6R5_UNORM_SRGB: ConvertPixelFromFloat<B5G6R5_UNORM_SRGB>(pDst, srcPixel); break;640case B5G5R5A1_UNORM: ConvertPixelFromFloat<B5G5R5A1_UNORM>(pDst, srcPixel); break;641case B5G5R5A1_UNORM_SRGB: ConvertPixelFromFloat<B5G5R5A1_UNORM_SRGB>(pDst, srcPixel); break;642case B4G4R4A4_UNORM: ConvertPixelFromFloat<B4G4R4A4_UNORM>(pDst, srcPixel); break;643case B4G4R4A4_UNORM_SRGB: ConvertPixelFromFloat<B4G4R4A4_UNORM_SRGB>(pDst, srcPixel); break;644case R8G8_UNORM: ConvertPixelFromFloat<R8G8_UNORM>(pDst, srcPixel); break;645case R8G8_SNORM: ConvertPixelFromFloat<R8G8_SNORM>(pDst, srcPixel); break;646case R8G8_SINT: ConvertPixelFromFloat<R8G8_SINT>(pDst, srcPixel); break;647case R8G8_UINT: ConvertPixelFromFloat<R8G8_UINT>(pDst, srcPixel); break;648case R16_UNORM: ConvertPixelFromFloat<R16_UNORM>(pDst, srcPixel); break;649case R16_SNORM: ConvertPixelFromFloat<R16_SNORM>(pDst, srcPixel); break;650case R16_SINT: ConvertPixelFromFloat<R16_SINT>(pDst, srcPixel); break;651case R16_UINT: ConvertPixelFromFloat<R16_UINT>(pDst, srcPixel); break;652case R16_FLOAT: ConvertPixelFromFloat<R16_FLOAT>(pDst, srcPixel); break;653case I16_UNORM: ConvertPixelFromFloat<I16_UNORM>(pDst, srcPixel); break;654case L16_UNORM: ConvertPixelFromFloat<L16_UNORM>(pDst, srcPixel); break;655case A16_UNORM: ConvertPixelFromFloat<A16_UNORM>(pDst, srcPixel); break;656case L8A8_UNORM: ConvertPixelFromFloat<L8A8_UNORM>(pDst, srcPixel); break;657case I16_FLOAT: ConvertPixelFromFloat<I16_FLOAT>(pDst, srcPixel); break;658case L16_FLOAT: ConvertPixelFromFloat<L16_FLOAT>(pDst, srcPixel); break;659case A16_FLOAT: ConvertPixelFromFloat<A16_FLOAT>(pDst, srcPixel); break;660case L8A8_UNORM_SRGB: ConvertPixelFromFloat<L8A8_UNORM_SRGB>(pDst, srcPixel); break;661case B5G5R5X1_UNORM: ConvertPixelFromFloat<B5G5R5X1_UNORM>(pDst, srcPixel); break;662case B5G5R5X1_UNORM_SRGB: ConvertPixelFromFloat<B5G5R5X1_UNORM_SRGB>(pDst, srcPixel); break;663case R8G8_SSCALED: ConvertPixelFromFloat<R8G8_SSCALED>(pDst, srcPixel); break;664case R8G8_USCALED: ConvertPixelFromFloat<R8G8_USCALED>(pDst, srcPixel); break;665case R16_SSCALED: ConvertPixelFromFloat<R16_SSCALED>(pDst, srcPixel); break;666case R16_USCALED: ConvertPixelFromFloat<R16_USCALED>(pDst, srcPixel); break;667case A1B5G5R5_UNORM: ConvertPixelFromFloat<A1B5G5R5_UNORM>(pDst, srcPixel); break;668case A4B4G4R4_UNORM: ConvertPixelFromFloat<A4B4G4R4_UNORM>(pDst, srcPixel); break;669case L8A8_UINT: ConvertPixelFromFloat<L8A8_UINT>(pDst, srcPixel); break;670case L8A8_SINT: ConvertPixelFromFloat<L8A8_SINT>(pDst, srcPixel); break;671case R8_UNORM: ConvertPixelFromFloat<R8_UNORM>(pDst, srcPixel); break;672case R8_SNORM: ConvertPixelFromFloat<R8_SNORM>(pDst, srcPixel); break;673case R8_SINT: ConvertPixelFromFloat<R8_SINT>(pDst, srcPixel); break;674case R8_UINT: ConvertPixelFromFloat<R8_UINT>(pDst, srcPixel); break;675case A8_UNORM: ConvertPixelFromFloat<A8_UNORM>(pDst, srcPixel); break;676case I8_UNORM: ConvertPixelFromFloat<I8_UNORM>(pDst, srcPixel); break;677case L8_UNORM: ConvertPixelFromFloat<L8_UNORM>(pDst, srcPixel); break;678case R8_SSCALED: ConvertPixelFromFloat<R8_SSCALED>(pDst, srcPixel); break;679case R8_USCALED: ConvertPixelFromFloat<R8_USCALED>(pDst, srcPixel); break;680case L8_UNORM_SRGB: ConvertPixelFromFloat<L8_UNORM_SRGB>(pDst, srcPixel); break;681case L8_UINT: ConvertPixelFromFloat<L8_UINT>(pDst, srcPixel); break;682case L8_SINT: ConvertPixelFromFloat<L8_SINT>(pDst, srcPixel); break;683case I8_UINT: ConvertPixelFromFloat<I8_UINT>(pDst, srcPixel); break;684case I8_SINT: ConvertPixelFromFloat<I8_SINT>(pDst, srcPixel); break;685case YCRCB_SWAPUVY: ConvertPixelFromFloat<YCRCB_SWAPUVY>(pDst, srcPixel); break;686case BC1_UNORM: ConvertPixelFromFloat<BC1_UNORM>(pDst, srcPixel); break;687case BC2_UNORM: ConvertPixelFromFloat<BC2_UNORM>(pDst, srcPixel); break;688case BC3_UNORM: ConvertPixelFromFloat<BC3_UNORM>(pDst, srcPixel); break;689case BC4_UNORM: ConvertPixelFromFloat<BC4_UNORM>(pDst, srcPixel); break;690case BC5_UNORM: ConvertPixelFromFloat<BC5_UNORM>(pDst, srcPixel); break;691case BC1_UNORM_SRGB: ConvertPixelFromFloat<BC1_UNORM_SRGB>(pDst, srcPixel); break;692case BC2_UNORM_SRGB: ConvertPixelFromFloat<BC2_UNORM_SRGB>(pDst, srcPixel); break;693case BC3_UNORM_SRGB: ConvertPixelFromFloat<BC3_UNORM_SRGB>(pDst, srcPixel); break;694case YCRCB_SWAPUV: ConvertPixelFromFloat<YCRCB_SWAPUV>(pDst, srcPixel); break;695case R8G8B8_UNORM: ConvertPixelFromFloat<R8G8B8_UNORM>(pDst, srcPixel); break;696case R8G8B8_SNORM: ConvertPixelFromFloat<R8G8B8_SNORM>(pDst, srcPixel); break;697case R8G8B8_SSCALED: ConvertPixelFromFloat<R8G8B8_SSCALED>(pDst, srcPixel); break;698case R8G8B8_USCALED: ConvertPixelFromFloat<R8G8B8_USCALED>(pDst, srcPixel); break;699case BC4_SNORM: ConvertPixelFromFloat<BC4_SNORM>(pDst, srcPixel); break;700case BC5_SNORM: ConvertPixelFromFloat<BC5_SNORM>(pDst, srcPixel); break;701case R16G16B16_FLOAT: ConvertPixelFromFloat<R16G16B16_FLOAT>(pDst, srcPixel); break;702case R16G16B16_UNORM: ConvertPixelFromFloat<R16G16B16_UNORM>(pDst, srcPixel); break;703case R16G16B16_SNORM: ConvertPixelFromFloat<R16G16B16_SNORM>(pDst, srcPixel); break;704case R16G16B16_SSCALED: ConvertPixelFromFloat<R16G16B16_SSCALED>(pDst, srcPixel); break;705case R16G16B16_USCALED: ConvertPixelFromFloat<R16G16B16_USCALED>(pDst, srcPixel); break;706case BC6H_SF16: ConvertPixelFromFloat<BC6H_SF16>(pDst, srcPixel); break;707case BC7_UNORM: ConvertPixelFromFloat<BC7_UNORM>(pDst, srcPixel); break;708case BC7_UNORM_SRGB: ConvertPixelFromFloat<BC7_UNORM_SRGB>(pDst, srcPixel); break;709case BC6H_UF16: ConvertPixelFromFloat<BC6H_UF16>(pDst, srcPixel); break;710case R8G8B8_UNORM_SRGB: ConvertPixelFromFloat<R8G8B8_UNORM_SRGB>(pDst, srcPixel); break;711case R16G16B16_UINT: ConvertPixelFromFloat<R16G16B16_UINT>(pDst, srcPixel); break;712case R16G16B16_SINT: ConvertPixelFromFloat<R16G16B16_SINT>(pDst, srcPixel); break;713case R10G10B10A2_SNORM: ConvertPixelFromFloat<R10G10B10A2_SNORM>(pDst, srcPixel); break;714case R10G10B10A2_USCALED: ConvertPixelFromFloat<R10G10B10A2_USCALED>(pDst, srcPixel); break;715case R10G10B10A2_SSCALED: ConvertPixelFromFloat<R10G10B10A2_SSCALED>(pDst, srcPixel); break;716case R10G10B10A2_SINT: ConvertPixelFromFloat<R10G10B10A2_SINT>(pDst, srcPixel); break;717case B10G10R10A2_SNORM: ConvertPixelFromFloat<B10G10R10A2_SNORM>(pDst, srcPixel); break;718case B10G10R10A2_USCALED: ConvertPixelFromFloat<B10G10R10A2_USCALED>(pDst, srcPixel); break;719case B10G10R10A2_SSCALED: ConvertPixelFromFloat<B10G10R10A2_SSCALED>(pDst, srcPixel); break;720case B10G10R10A2_UINT: ConvertPixelFromFloat<B10G10R10A2_UINT>(pDst, srcPixel); break;721case B10G10R10A2_SINT: ConvertPixelFromFloat<B10G10R10A2_SINT>(pDst, srcPixel); break;722case R8G8B8_UINT: ConvertPixelFromFloat<R8G8B8_UINT>(pDst, srcPixel); break;723case R8G8B8_SINT: ConvertPixelFromFloat<R8G8B8_SINT>(pDst, srcPixel); break;724case RAW: ConvertPixelFromFloat<RAW>(pDst, srcPixel); break;725default:726SWR_INVALID("Invalid format: %d", format);727break;728}729}730731732