Path: blob/21.2-virgl/src/gallium/frontends/d3d10umd/Format.cpp
4565 views
/**************************************************************************1*2* Copyright 2012-2021 VMware, Inc.3* All Rights Reserved.4*5* Permission is hereby granted, free of charge, to any person obtaining a6* copy of this software and associated documentation files (the7* "Software"), to deal in the Software without restriction, including8* without limitation the rights to use, copy, modify, merge, publish,9* distribute, sub license, and/or sell copies of the Software, and to10* permit persons to whom the Software is furnished to do so, subject to11* the following conditions:12*13* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR14* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,15* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL16* THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,17* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR18* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE19* USE OR OTHER DEALINGS IN THE SOFTWARE.20*21* The above copyright notice and this permission notice (including the22* next paragraph) shall be included in all copies or substantial portions23* of the Software.24*25**************************************************************************/2627/*28* Format.h --29* Functions for format manipulation.30*/313233#include <stdint.h>3435#include "Format.h"36#include "State.h"3738#include "Debug.h"394041/* XXX: for a time llvmpipe didn't support SRGB */42#define HAVE_SRGB 1434445enum pipe_format46FormatTranslate(DXGI_FORMAT Format, BOOL depth)47{48switch (Format) {4950case DXGI_FORMAT_UNKNOWN:51return PIPE_FORMAT_NONE;5253case DXGI_FORMAT_R32G32B32A32_FLOAT:54return PIPE_FORMAT_R32G32B32A32_FLOAT;55case DXGI_FORMAT_R32G32B32A32_UINT:56return PIPE_FORMAT_R32G32B32A32_UINT;57case DXGI_FORMAT_R32G32B32A32_SINT:58return PIPE_FORMAT_R32G32B32A32_SINT;59case DXGI_FORMAT_R32G32B32_FLOAT:60return PIPE_FORMAT_R32G32B32_FLOAT;61case DXGI_FORMAT_R32G32B32_UINT:62return PIPE_FORMAT_R32G32B32_UINT;63case DXGI_FORMAT_R32G32B32_SINT:64return PIPE_FORMAT_R32G32B32_SINT;65case DXGI_FORMAT_R16G16B16A16_UNORM:66return PIPE_FORMAT_R16G16B16A16_UNORM;67case DXGI_FORMAT_R16G16B16A16_UINT:68return PIPE_FORMAT_R16G16B16A16_UINT;69case DXGI_FORMAT_R16G16B16A16_SNORM:70return PIPE_FORMAT_R16G16B16A16_SNORM;71case DXGI_FORMAT_R16G16B16A16_SINT:72return PIPE_FORMAT_R16G16B16A16_SINT;73case DXGI_FORMAT_R32G32_FLOAT:74return PIPE_FORMAT_R32G32_FLOAT;75case DXGI_FORMAT_R32G32_UINT:76return PIPE_FORMAT_R32G32_UINT;77case DXGI_FORMAT_R32G32_SINT:78return PIPE_FORMAT_R32G32_SINT;79case DXGI_FORMAT_R8G8B8A8_UNORM:80return PIPE_FORMAT_R8G8B8A8_UNORM;81case DXGI_FORMAT_R8G8B8A8_UINT:82return PIPE_FORMAT_R8G8B8A8_UINT;83case DXGI_FORMAT_R8G8B8A8_SNORM:84return PIPE_FORMAT_R8G8B8A8_SNORM;85case DXGI_FORMAT_R8G8B8A8_SINT:86return PIPE_FORMAT_R8G8B8A8_SINT;87case DXGI_FORMAT_R16G16_UNORM:88return PIPE_FORMAT_R16G16_UNORM;89case DXGI_FORMAT_R16G16_UINT:90return PIPE_FORMAT_R16G16_UINT;91case DXGI_FORMAT_R16G16_SNORM:92return PIPE_FORMAT_R16G16_SNORM;93case DXGI_FORMAT_R16G16_SINT:94return PIPE_FORMAT_R16G16_SINT;95case DXGI_FORMAT_D32_FLOAT:96return PIPE_FORMAT_Z32_FLOAT;97case DXGI_FORMAT_R32_FLOAT:98return PIPE_FORMAT_R32_FLOAT;99case DXGI_FORMAT_R32_UINT:100return PIPE_FORMAT_R32_UINT;101case DXGI_FORMAT_R32_SINT:102return PIPE_FORMAT_R32_SINT;103case DXGI_FORMAT_D24_UNORM_S8_UINT:104return PIPE_FORMAT_Z24_UNORM_S8_UINT;105case DXGI_FORMAT_R8G8_UNORM:106return PIPE_FORMAT_R8G8_UNORM;107case DXGI_FORMAT_R8G8_UINT:108return PIPE_FORMAT_R8G8_UINT;109case DXGI_FORMAT_R8G8_SNORM:110return PIPE_FORMAT_R8G8_SNORM;111case DXGI_FORMAT_R8G8_SINT:112return PIPE_FORMAT_R8G8_SINT;113case DXGI_FORMAT_D16_UNORM:114return PIPE_FORMAT_Z16_UNORM;115case DXGI_FORMAT_R16_UNORM:116return PIPE_FORMAT_R16_UNORM;117case DXGI_FORMAT_R16_UINT:118return PIPE_FORMAT_R16_UINT;119case DXGI_FORMAT_R16_SNORM:120return PIPE_FORMAT_R16_SNORM;121case DXGI_FORMAT_R16_SINT:122return PIPE_FORMAT_R16_SINT;123case DXGI_FORMAT_R8_UNORM:124return PIPE_FORMAT_R8_UNORM;125case DXGI_FORMAT_R8_UINT:126return PIPE_FORMAT_R8_UINT;127case DXGI_FORMAT_R8_SNORM:128return PIPE_FORMAT_R8_SNORM;129case DXGI_FORMAT_R8_SINT:130return PIPE_FORMAT_R8_SINT;131case DXGI_FORMAT_A8_UNORM:132return PIPE_FORMAT_A8_UNORM;133case DXGI_FORMAT_BC1_UNORM:134return PIPE_FORMAT_DXT1_RGBA;135case DXGI_FORMAT_BC1_UNORM_SRGB:136#if HAVE_SRGB137return PIPE_FORMAT_DXT1_SRGBA;138#else139return PIPE_FORMAT_DXT1_RGBA;140#endif141case DXGI_FORMAT_BC2_UNORM:142return PIPE_FORMAT_DXT3_RGBA;143case DXGI_FORMAT_BC2_UNORM_SRGB:144#if HAVE_SRGB145return PIPE_FORMAT_DXT3_SRGBA;146#else147return PIPE_FORMAT_DXT3_RGBA;148#endif149case DXGI_FORMAT_BC3_UNORM:150return PIPE_FORMAT_DXT5_RGBA;151case DXGI_FORMAT_BC3_UNORM_SRGB:152#if HAVE_SRGB153return PIPE_FORMAT_DXT5_SRGBA;154#else155return PIPE_FORMAT_DXT5_RGBA;156#endif157case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:158#if HAVE_SRGB159return PIPE_FORMAT_R8G8B8A8_SRGB;160#else161return PIPE_FORMAT_R8G8B8A8_UNORM;162#endif163164/* Gallium has no typeless formats. We simply use an equivalent165* typed format.166*/167case DXGI_FORMAT_R8G8B8A8_TYPELESS:168return PIPE_FORMAT_R8G8B8A8_UNORM;169case DXGI_FORMAT_BC1_TYPELESS:170return PIPE_FORMAT_DXT1_RGBA;171case DXGI_FORMAT_BC2_TYPELESS:172return PIPE_FORMAT_DXT3_RGBA;173case DXGI_FORMAT_BC3_TYPELESS:174return PIPE_FORMAT_DXT5_RGBA;175case DXGI_FORMAT_R8_TYPELESS:176return PIPE_FORMAT_R8_UNORM;177case DXGI_FORMAT_R32G32B32A32_TYPELESS:178return PIPE_FORMAT_R32G32B32A32_UNORM;179case DXGI_FORMAT_R32G32B32_TYPELESS:180return PIPE_FORMAT_R32G32B32_UNORM;181case DXGI_FORMAT_R16G16B16A16_TYPELESS:182return PIPE_FORMAT_R16G16B16A16_UNORM;183case DXGI_FORMAT_R32G32_TYPELESS:184return PIPE_FORMAT_R32G32_UNORM;185case DXGI_FORMAT_R8G8_TYPELESS:186return PIPE_FORMAT_R8G8_UNORM;187case DXGI_FORMAT_R16_TYPELESS:188return depth ? PIPE_FORMAT_Z16_UNORM : PIPE_FORMAT_R16_UNORM;189case DXGI_FORMAT_R16G16_TYPELESS:190return PIPE_FORMAT_R16G16_UNORM;191case DXGI_FORMAT_R32_TYPELESS:192return depth ? PIPE_FORMAT_Z32_FLOAT : PIPE_FORMAT_R32_FLOAT;193case DXGI_FORMAT_R24G8_TYPELESS:194return PIPE_FORMAT_Z24_UNORM_S8_UINT;195case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:196return PIPE_FORMAT_Z24X8_UNORM;197case DXGI_FORMAT_X24_TYPELESS_G8_UINT:198return PIPE_FORMAT_Z24_UNORM_S8_UINT;199200case DXGI_FORMAT_R8G8_B8G8_UNORM:201return PIPE_FORMAT_R8G8_B8G8_UNORM;202case DXGI_FORMAT_G8R8_G8B8_UNORM:203return PIPE_FORMAT_G8R8_G8B8_UNORM;204205case DXGI_FORMAT_R16G16B16A16_FLOAT:206return PIPE_FORMAT_R16G16B16A16_FLOAT;207case DXGI_FORMAT_R16G16_FLOAT:208return PIPE_FORMAT_R16G16_FLOAT;209case DXGI_FORMAT_R16_FLOAT:210return PIPE_FORMAT_R16_FLOAT;211case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:212return PIPE_FORMAT_R9G9B9E5_FLOAT;213case DXGI_FORMAT_R1_UNORM:214return PIPE_FORMAT_R1_UNORM;215216case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:217case DXGI_FORMAT_R32G8X24_TYPELESS:218case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:219case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:220return PIPE_FORMAT_Z32_FLOAT_S8X24_UINT;221222case DXGI_FORMAT_R10G10B10A2_TYPELESS:223case DXGI_FORMAT_R10G10B10A2_UNORM:224return PIPE_FORMAT_R10G10B10A2_UNORM;225case DXGI_FORMAT_R10G10B10A2_UINT:226return PIPE_FORMAT_R10G10B10A2_UINT;227case DXGI_FORMAT_R11G11B10_FLOAT:228return PIPE_FORMAT_R11G11B10_FLOAT;229230case DXGI_FORMAT_BC4_TYPELESS:231case DXGI_FORMAT_BC4_UNORM:232return PIPE_FORMAT_RGTC1_UNORM;233case DXGI_FORMAT_BC4_SNORM:234return PIPE_FORMAT_RGTC1_SNORM;235236case DXGI_FORMAT_BC5_TYPELESS:237case DXGI_FORMAT_BC5_UNORM:238return PIPE_FORMAT_RGTC2_UNORM;239case DXGI_FORMAT_BC5_SNORM:240return PIPE_FORMAT_RGTC2_SNORM;241242case DXGI_FORMAT_B5G6R5_UNORM:243return PIPE_FORMAT_B5G6R5_UNORM;244case DXGI_FORMAT_B5G5R5A1_UNORM:245return PIPE_FORMAT_B5G5R5A1_UNORM;246case DXGI_FORMAT_B8G8R8A8_UNORM:247return PIPE_FORMAT_B8G8R8A8_UNORM;248case DXGI_FORMAT_B8G8R8X8_UNORM:249return PIPE_FORMAT_B8G8R8X8_UNORM;250case DXGI_FORMAT_B8G8R8A8_TYPELESS:251return PIPE_FORMAT_B8G8R8A8_UNORM;252case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:253#if HAVE_SRGB254return PIPE_FORMAT_B8G8R8A8_SRGB;255#else256return PIPE_FORMAT_B8G8R8A8_UNORM;257#endif258case DXGI_FORMAT_B8G8R8X8_TYPELESS:259return PIPE_FORMAT_B8G8R8X8_UNORM;260case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:261#if HAVE_SRGB262return PIPE_FORMAT_B8G8R8X8_SRGB;263#else264return PIPE_FORMAT_B8G8R8X8_UNORM;265#endif266267case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:268return PIPE_FORMAT_R10G10B10A2_UNORM;269270default:271DebugPrintf("%s: unsupported format %s\n",272__FUNCTION__, FormatToName(Format));273return PIPE_FORMAT_NONE;274}275}276277278279#define CASE(fmt) case fmt: return #fmt280281const char *282FormatToName(DXGI_FORMAT Format)283{284switch (Format) {285CASE(DXGI_FORMAT_UNKNOWN);286CASE(DXGI_FORMAT_R32G32B32A32_TYPELESS);287CASE(DXGI_FORMAT_R32G32B32A32_FLOAT);288CASE(DXGI_FORMAT_R32G32B32A32_UINT);289CASE(DXGI_FORMAT_R32G32B32A32_SINT);290CASE(DXGI_FORMAT_R32G32B32_TYPELESS);291CASE(DXGI_FORMAT_R32G32B32_FLOAT);292CASE(DXGI_FORMAT_R32G32B32_UINT);293CASE(DXGI_FORMAT_R32G32B32_SINT);294CASE(DXGI_FORMAT_R16G16B16A16_TYPELESS);295CASE(DXGI_FORMAT_R16G16B16A16_FLOAT);296CASE(DXGI_FORMAT_R16G16B16A16_UNORM);297CASE(DXGI_FORMAT_R16G16B16A16_UINT);298CASE(DXGI_FORMAT_R16G16B16A16_SNORM);299CASE(DXGI_FORMAT_R16G16B16A16_SINT);300CASE(DXGI_FORMAT_R32G32_TYPELESS);301CASE(DXGI_FORMAT_R32G32_FLOAT);302CASE(DXGI_FORMAT_R32G32_UINT);303CASE(DXGI_FORMAT_R32G32_SINT);304CASE(DXGI_FORMAT_R32G8X24_TYPELESS);305CASE(DXGI_FORMAT_D32_FLOAT_S8X24_UINT);306CASE(DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS);307CASE(DXGI_FORMAT_X32_TYPELESS_G8X24_UINT);308CASE(DXGI_FORMAT_R10G10B10A2_TYPELESS);309CASE(DXGI_FORMAT_R10G10B10A2_UNORM);310CASE(DXGI_FORMAT_R10G10B10A2_UINT);311CASE(DXGI_FORMAT_R11G11B10_FLOAT);312CASE(DXGI_FORMAT_R8G8B8A8_TYPELESS);313CASE(DXGI_FORMAT_R8G8B8A8_UNORM);314CASE(DXGI_FORMAT_R8G8B8A8_UNORM_SRGB);315CASE(DXGI_FORMAT_R8G8B8A8_UINT);316CASE(DXGI_FORMAT_R8G8B8A8_SNORM);317CASE(DXGI_FORMAT_R8G8B8A8_SINT);318CASE(DXGI_FORMAT_R16G16_TYPELESS);319CASE(DXGI_FORMAT_R16G16_FLOAT);320CASE(DXGI_FORMAT_R16G16_UNORM);321CASE(DXGI_FORMAT_R16G16_UINT);322CASE(DXGI_FORMAT_R16G16_SNORM);323CASE(DXGI_FORMAT_R16G16_SINT);324CASE(DXGI_FORMAT_R32_TYPELESS);325CASE(DXGI_FORMAT_D32_FLOAT);326CASE(DXGI_FORMAT_R32_FLOAT);327CASE(DXGI_FORMAT_R32_UINT);328CASE(DXGI_FORMAT_R32_SINT);329CASE(DXGI_FORMAT_R24G8_TYPELESS);330CASE(DXGI_FORMAT_D24_UNORM_S8_UINT);331CASE(DXGI_FORMAT_R24_UNORM_X8_TYPELESS);332CASE(DXGI_FORMAT_X24_TYPELESS_G8_UINT);333CASE(DXGI_FORMAT_R8G8_TYPELESS);334CASE(DXGI_FORMAT_R8G8_UNORM);335CASE(DXGI_FORMAT_R8G8_UINT);336CASE(DXGI_FORMAT_R8G8_SNORM);337CASE(DXGI_FORMAT_R8G8_SINT);338CASE(DXGI_FORMAT_R16_TYPELESS);339CASE(DXGI_FORMAT_R16_FLOAT);340CASE(DXGI_FORMAT_D16_UNORM);341CASE(DXGI_FORMAT_R16_UNORM);342CASE(DXGI_FORMAT_R16_UINT);343CASE(DXGI_FORMAT_R16_SNORM);344CASE(DXGI_FORMAT_R16_SINT);345CASE(DXGI_FORMAT_R8_TYPELESS);346CASE(DXGI_FORMAT_R8_UNORM);347CASE(DXGI_FORMAT_R8_UINT);348CASE(DXGI_FORMAT_R8_SNORM);349CASE(DXGI_FORMAT_R8_SINT);350CASE(DXGI_FORMAT_A8_UNORM);351CASE(DXGI_FORMAT_R1_UNORM);352CASE(DXGI_FORMAT_R9G9B9E5_SHAREDEXP);353CASE(DXGI_FORMAT_R8G8_B8G8_UNORM);354CASE(DXGI_FORMAT_G8R8_G8B8_UNORM);355CASE(DXGI_FORMAT_BC1_TYPELESS);356CASE(DXGI_FORMAT_BC1_UNORM);357CASE(DXGI_FORMAT_BC1_UNORM_SRGB);358CASE(DXGI_FORMAT_BC2_TYPELESS);359CASE(DXGI_FORMAT_BC2_UNORM);360CASE(DXGI_FORMAT_BC2_UNORM_SRGB);361CASE(DXGI_FORMAT_BC3_TYPELESS);362CASE(DXGI_FORMAT_BC3_UNORM);363CASE(DXGI_FORMAT_BC3_UNORM_SRGB);364CASE(DXGI_FORMAT_BC4_TYPELESS);365CASE(DXGI_FORMAT_BC4_UNORM);366CASE(DXGI_FORMAT_BC4_SNORM);367CASE(DXGI_FORMAT_BC5_TYPELESS);368CASE(DXGI_FORMAT_BC5_UNORM);369CASE(DXGI_FORMAT_BC5_SNORM);370CASE(DXGI_FORMAT_B5G6R5_UNORM);371CASE(DXGI_FORMAT_B5G5R5A1_UNORM);372CASE(DXGI_FORMAT_B8G8R8A8_UNORM);373CASE(DXGI_FORMAT_B8G8R8X8_UNORM);374CASE(DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM);375CASE(DXGI_FORMAT_B8G8R8A8_TYPELESS);376CASE(DXGI_FORMAT_B8G8R8A8_UNORM_SRGB);377CASE(DXGI_FORMAT_B8G8R8X8_TYPELESS);378CASE(DXGI_FORMAT_B8G8R8X8_UNORM_SRGB);379CASE(DXGI_FORMAT_BC6H_TYPELESS);380CASE(DXGI_FORMAT_BC6H_UF16);381CASE(DXGI_FORMAT_BC6H_SF16);382CASE(DXGI_FORMAT_BC7_TYPELESS);383CASE(DXGI_FORMAT_BC7_UNORM);384CASE(DXGI_FORMAT_BC7_UNORM_SRGB);385default:386return "???";387}388}389390391