1 /**************************************************************************
2  *
3  * Copyright 2010 Luca Barbieri
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice (including the
14  * next paragraph) shall be included in all copies or substantial
15  * portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20  * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  *
25  **************************************************************************/
26 
27 #include <d3d1xstutil.h>
28 
29 /* D3D has to keep binary compatibility, so these tables will always work
30  * However, Gallium -> D3D conversion must use .[PIPE_xxx] = D3D11_xxx syntax */
31 
32 pipe_format dxgi_to_pipe_format[DXGI_FORMAT_COUNT] =
33 {
34 	PIPE_FORMAT_NONE,
35 	PIPE_FORMAT_R32G32B32A32_UINT, /* TYPELESS */
36 	PIPE_FORMAT_R32G32B32A32_FLOAT,
37 	PIPE_FORMAT_R32G32B32A32_UINT,
38 	PIPE_FORMAT_R32G32B32A32_SINT,
39 	PIPE_FORMAT_R32G32B32_UINT, /* TYPELESS */
40 	PIPE_FORMAT_R32G32B32_FLOAT,
41 	PIPE_FORMAT_R32G32B32_UINT,
42 	PIPE_FORMAT_R32G32B32_SINT,
43 	PIPE_FORMAT_R16G16B16A16_UINT, /* TYPELESS */
44 	PIPE_FORMAT_R16G16B16A16_FLOAT,
45 	PIPE_FORMAT_R16G16B16A16_UNORM,
46 	PIPE_FORMAT_R16G16B16A16_UINT,
47 	PIPE_FORMAT_R16G16B16A16_SNORM,
48 	PIPE_FORMAT_R16G16B16A16_SINT,
49 	PIPE_FORMAT_R32G32_UINT, /* TYPELESS */
50 	PIPE_FORMAT_R32G32_FLOAT,
51 	PIPE_FORMAT_R32G32_UINT,
52 	PIPE_FORMAT_R32G32_SINT,
53 	PIPE_FORMAT_Z32_FLOAT_S8X24_UINT, /* PIPE_FORMAT_R32_G8X24_TYPELESS */
54 	PIPE_FORMAT_Z32_FLOAT_S8X24_UINT,
55 	PIPE_FORMAT_Z32_FLOAT_S8X24_UINT, /* PIPE_FORMAT_R32_X8X24_FLOAT */
56 	PIPE_FORMAT_Z32_FLOAT_S8X24_UINT, /* PIPE_FORMAT_X32_G8X24_UINT */
57 	PIPE_FORMAT_R10G10B10A2_UNORM, /* TYPELESS */
58 	PIPE_FORMAT_R10G10B10A2_UNORM,
59 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_R10G10B10A2_UINT */
60 	PIPE_FORMAT_R11G11B10_FLOAT,
61 	PIPE_FORMAT_R8G8B8A8_UINT, /* TYPELESS */
62 	PIPE_FORMAT_R8G8B8A8_UNORM,
63 	PIPE_FORMAT_R8G8B8A8_SRGB,
64 	PIPE_FORMAT_R8G8B8A8_UINT,
65 	PIPE_FORMAT_R8G8B8A8_SNORM,
66 	PIPE_FORMAT_R8G8B8A8_SINT,
67 	PIPE_FORMAT_R16G16_UINT, /* TYPELESS */
68 	PIPE_FORMAT_R16G16_FLOAT,
69 	PIPE_FORMAT_R16G16_UNORM,
70 	PIPE_FORMAT_R16G16_UINT,
71 	PIPE_FORMAT_R16G16_SNORM,
72 	PIPE_FORMAT_R16G16_SINT,
73 	PIPE_FORMAT_R32_UINT, /* TYPELESS */
74 	PIPE_FORMAT_Z32_FLOAT,
75 	PIPE_FORMAT_R32_FLOAT,
76 	PIPE_FORMAT_R32_UINT,
77 	PIPE_FORMAT_R32_SINT,
78 	PIPE_FORMAT_Z24_UNORM_S8_UINT, /* PIPE_FORMAT_R24G8_TYPELESS */
79 	PIPE_FORMAT_Z24_UNORM_S8_UINT,
80 	PIPE_FORMAT_Z24X8_UNORM, /* PIPE_FORMAT_R24X8_UNORM */
81 	PIPE_FORMAT_Z24_UNORM_S8_UINT, /* PIPE_FORMAT_X24G8_UINT */
82 	PIPE_FORMAT_R8G8_UINT, /* TYPELESS */
83 	PIPE_FORMAT_R8G8_UNORM,
84 	PIPE_FORMAT_R8G8_UINT,
85 	PIPE_FORMAT_R8G8_SNORM,
86 	PIPE_FORMAT_R8G8_SINT,
87 	PIPE_FORMAT_R16_UINT, /* TYPELESS */
88 	PIPE_FORMAT_R16_FLOAT,
89 	PIPE_FORMAT_Z16_UNORM,
90 	PIPE_FORMAT_R16_UNORM,
91 	PIPE_FORMAT_R16_UINT,
92 	PIPE_FORMAT_R16_SNORM,
93 	PIPE_FORMAT_R16_SINT,
94 	PIPE_FORMAT_R8_UINT, /* TYPELESS */
95 	PIPE_FORMAT_R8_UNORM,
96 	PIPE_FORMAT_R8_UINT,
97 	PIPE_FORMAT_R8_SNORM,
98 	PIPE_FORMAT_R8_SINT,
99 	PIPE_FORMAT_A8_UNORM,
100 	PIPE_FORMAT_R1_UNORM,
101 	PIPE_FORMAT_R9G9B9E5_FLOAT,
102 	PIPE_FORMAT_R8G8_B8G8_UNORM,
103 	PIPE_FORMAT_G8R8_G8B8_UNORM,
104 	PIPE_FORMAT_DXT1_RGBA, /* TYPELESS */
105 	PIPE_FORMAT_DXT1_RGBA,
106 	PIPE_FORMAT_DXT1_SRGBA,
107 	PIPE_FORMAT_DXT3_RGBA, /* TYPELESS */
108 	PIPE_FORMAT_DXT3_RGBA,
109 	PIPE_FORMAT_DXT3_SRGBA,
110 	PIPE_FORMAT_DXT5_RGBA, /* TYPELESS */
111 	PIPE_FORMAT_DXT5_RGBA,
112 	PIPE_FORMAT_DXT5_SRGBA,
113 	PIPE_FORMAT_RGTC1_UNORM, /* TYPELESS */
114 	PIPE_FORMAT_RGTC1_UNORM,
115 	PIPE_FORMAT_RGTC1_SNORM,
116 	PIPE_FORMAT_RGTC2_UNORM, /* TYPELESS */
117 	PIPE_FORMAT_RGTC2_UNORM,
118 	PIPE_FORMAT_RGTC2_SNORM,
119 	PIPE_FORMAT_B5G6R5_UNORM,
120 	PIPE_FORMAT_B5G5R5A1_UNORM,
121 	PIPE_FORMAT_B8G8R8A8_UNORM,
122 	PIPE_FORMAT_B8G8R8X8_UNORM,
123 	PIPE_FORMAT_R10SG10SB10SA2U_NORM,
124 	PIPE_FORMAT_B8G8R8A8_UNORM, /* TYPELESS */
125 	PIPE_FORMAT_B8G8R8A8_SRGB,
126 	PIPE_FORMAT_B8G8R8X8_UNORM, /* TYPELESS */
127 	PIPE_FORMAT_B8G8R8X8_SRGB,
128 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_BC6H_TYPELESS */
129 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_BC6H_UF16 */
130 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_BC6H_SF16 */
131 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_BC7_TYPELESS */
132 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_BC7_UNORM */
133 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_BC7_UNORM_SRGB */
134 	PIPE_FORMAT_A8R8G8B8_UNORM, /* PIPE_FORMAT_AYUV */
135 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_Y410 */
136 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_Y416 */
137 	PIPE_FORMAT_NV12,
138 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_P010 */
139 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_P016 */
140 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_420_OPAQUE */
141 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_YUV2 */
142 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_Y210 */
143 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_Y216 */
144 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_NV11 */
145 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_AI44 (palettized) */
146 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_IA44 (palettized) */
147 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_P8 (palettized) */
148 	PIPE_FORMAT_NONE, /* PIPE_FORMAT_A8P8 (palettized) */
149 	PIPE_FORMAT_B4G4R4A4_UNORM,
150 };
151 
152 DXGI_FORMAT pipe_to_dxgi_format[PIPE_FORMAT_COUNT];
153 static int pipe_to_dxgi_format_initialized;
init_pipe_to_dxgi_format()154 void init_pipe_to_dxgi_format()
155 {
156 	if(!pipe_to_dxgi_format_initialized)
157 	{
158 		for(unsigned i = 0; i < DXGI_FORMAT_COUNT; ++i)
159 			pipe_to_dxgi_format[dxgi_to_pipe_format[i]] = (DXGI_FORMAT)i;
160 		pipe_to_dxgi_format[PIPE_FORMAT_NONE] = DXGI_FORMAT_UNKNOWN;
161 		pipe_to_dxgi_format[PIPE_FORMAT_Z32_FLOAT_S8X24_UINT] = DXGI_FORMAT_D32_FLOAT_S8X24_UINT;
162 		pipe_to_dxgi_format[PIPE_FORMAT_Z24_UNORM_S8_UINT] = DXGI_FORMAT_D24_UNORM_S8_UINT;
163 		pipe_to_dxgi_format_initialized = 1;
164 	}
165 }
166