Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
DirectXTex.inl
Go to the documentation of this file.
1 //-------------------------------------------------------------------------------------
2 // DirectXTex.inl
3 //
4 // DirectX Texture Library
5 //
6 // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
7 // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
8 // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
9 // PARTICULAR PURPOSE.
10 //
11 // Copyright (c) Microsoft Corporation. All rights reserved.
12 //
13 // http://go.microsoft.com/fwlink/?LinkId=248926
14 //-------------------------------------------------------------------------------------
15 
16 #if defined(_MSC_VER) && (_MSC_VER > 1000)
17 #pragma once
18 #endif
19 
20 //=====================================================================================
21 // DXGI Format Utilities
22 //=====================================================================================
23 
24 _Use_decl_annotations_
25 inline bool IsValid( DXGI_FORMAT fmt )
26 {
27  return ( static_cast<size_t>(fmt) >= 1 && static_cast<size_t>(fmt) <= 120 );
28 }
29 
30 _Use_decl_annotations_
31 inline bool IsCompressed( DXGI_FORMAT fmt )
32 {
33  switch ( fmt )
34  {
35  case DXGI_FORMAT_BC1_TYPELESS:
36  case DXGI_FORMAT_BC1_UNORM:
37  case DXGI_FORMAT_BC1_UNORM_SRGB:
38  case DXGI_FORMAT_BC2_TYPELESS:
39  case DXGI_FORMAT_BC2_UNORM:
40  case DXGI_FORMAT_BC2_UNORM_SRGB:
41  case DXGI_FORMAT_BC3_TYPELESS:
42  case DXGI_FORMAT_BC3_UNORM:
43  case DXGI_FORMAT_BC3_UNORM_SRGB:
44  case DXGI_FORMAT_BC4_TYPELESS:
45  case DXGI_FORMAT_BC4_UNORM:
46  case DXGI_FORMAT_BC4_SNORM:
47  case DXGI_FORMAT_BC5_TYPELESS:
48  case DXGI_FORMAT_BC5_UNORM:
49  case DXGI_FORMAT_BC5_SNORM:
50  case DXGI_FORMAT_BC6H_TYPELESS:
51  case DXGI_FORMAT_BC6H_UF16:
52  case DXGI_FORMAT_BC6H_SF16:
53  case DXGI_FORMAT_BC7_TYPELESS:
54  case DXGI_FORMAT_BC7_UNORM:
55  case DXGI_FORMAT_BC7_UNORM_SRGB:
56  return true;
57 
58  default:
59  return false;
60  }
61 }
62 
63 _Use_decl_annotations_
64 inline bool IsPacked( DXGI_FORMAT fmt )
65 {
66  switch( fmt )
67  {
68  case DXGI_FORMAT_R8G8_B8G8_UNORM:
69  case DXGI_FORMAT_G8R8_G8B8_UNORM:
70  case DXGI_FORMAT_YUY2: // 4:2:2 8-bit
71  case DXGI_FORMAT_Y210: // 4:2:2 10-bit
72  case DXGI_FORMAT_Y216: // 4:2:2 16-bit
73  return true;
74 
75  default:
76  return false;
77  }
78 }
79 
80 _Use_decl_annotations_
81 inline bool IsPlanar( DXGI_FORMAT fmt )
82 {
83  switch ( static_cast<int>(fmt) )
84  {
85  case DXGI_FORMAT_NV12: // 4:2:0 8-bit
86  case DXGI_FORMAT_P010: // 4:2:0 10-bit
87  case DXGI_FORMAT_P016: // 4:2:0 16-bit
88  case DXGI_FORMAT_420_OPAQUE:// 4:2:0 8-bit
89  case DXGI_FORMAT_NV11: // 4:1:1 8-bit
90  return true;
91 
92  case 118 /* DXGI_FORMAT_D16_UNORM_S8_UINT */:
93  case 119 /* DXGI_FORMAT_R16_UNORM_X8_TYPELESS */:
94  case 120 /* DXGI_FORMAT_X16_TYPELESS_G8_UINT */:
95  // These are Xbox One platform specific types
96  return true;
97 
98  default:
99  return false;
100  }
101 }
102 
103 _Use_decl_annotations_
104 inline bool IsPalettized( DXGI_FORMAT fmt )
105 {
106  switch( fmt )
107  {
108  case DXGI_FORMAT_AI44:
109  case DXGI_FORMAT_IA44:
110  case DXGI_FORMAT_P8:
111  case DXGI_FORMAT_A8P8:
112  return true;
113 
114  default:
115  return false;
116  }
117 }
118 
119 _Use_decl_annotations_
120 inline bool IsVideo( DXGI_FORMAT fmt )
121 {
122  switch ( fmt )
123  {
124  case DXGI_FORMAT_AYUV:
125  case DXGI_FORMAT_Y410:
126  case DXGI_FORMAT_Y416:
127  case DXGI_FORMAT_NV12:
128  case DXGI_FORMAT_P010:
129  case DXGI_FORMAT_P016:
130  case DXGI_FORMAT_YUY2:
131  case DXGI_FORMAT_Y210:
132  case DXGI_FORMAT_Y216:
133  case DXGI_FORMAT_NV11:
134  // These video formats can be used with the 3D pipeline through special view mappings
135 
136  case DXGI_FORMAT_420_OPAQUE:
137  case DXGI_FORMAT_AI44:
138  case DXGI_FORMAT_IA44:
139  case DXGI_FORMAT_P8:
140  case DXGI_FORMAT_A8P8:
141  // These are limited use video formats not usable in any way by the 3D pipeline
142  return true;
143 
144  default:
145  return false;
146  }
147 }
148 
149 _Use_decl_annotations_
150 inline bool IsDepthStencil( DXGI_FORMAT fmt )
151 {
152  switch( static_cast<int>(fmt) )
153  {
154  case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
155  case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
156  case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
157  case DXGI_FORMAT_D32_FLOAT:
158  case DXGI_FORMAT_D24_UNORM_S8_UINT:
159  case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
160  case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
161  case DXGI_FORMAT_D16_UNORM:
162  case 118 /* DXGI_FORMAT_D16_UNORM_S8_UINT */:
163  case 119 /* DXGI_FORMAT_R16_UNORM_X8_TYPELESS */:
164  case 120 /* DXGI_FORMAT_X16_TYPELESS_G8_UINT */:
165  return true;
166 
167  default:
168  return false;
169  }
170 }
171 
172 _Use_decl_annotations_
173 inline bool IsSRGB( DXGI_FORMAT fmt )
174 {
175  switch( fmt )
176  {
177  case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
178  case DXGI_FORMAT_BC1_UNORM_SRGB:
179  case DXGI_FORMAT_BC2_UNORM_SRGB:
180  case DXGI_FORMAT_BC3_UNORM_SRGB:
181  case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
182  case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
183  case DXGI_FORMAT_BC7_UNORM_SRGB:
184  return true;
185 
186  default:
187  return false;
188  }
189 }
190 
191 _Use_decl_annotations_
192 inline bool IsTypeless( DXGI_FORMAT fmt, bool partialTypeless )
193 {
194  switch( static_cast<int>(fmt) )
195  {
196  case DXGI_FORMAT_R32G32B32A32_TYPELESS:
197  case DXGI_FORMAT_R32G32B32_TYPELESS:
198  case DXGI_FORMAT_R16G16B16A16_TYPELESS:
199  case DXGI_FORMAT_R32G32_TYPELESS:
200  case DXGI_FORMAT_R32G8X24_TYPELESS:
201  case DXGI_FORMAT_R10G10B10A2_TYPELESS:
202  case DXGI_FORMAT_R8G8B8A8_TYPELESS:
203  case DXGI_FORMAT_R16G16_TYPELESS:
204  case DXGI_FORMAT_R32_TYPELESS:
205  case DXGI_FORMAT_R24G8_TYPELESS:
206  case DXGI_FORMAT_R8G8_TYPELESS:
207  case DXGI_FORMAT_R16_TYPELESS:
208  case DXGI_FORMAT_R8_TYPELESS:
209  case DXGI_FORMAT_BC1_TYPELESS:
210  case DXGI_FORMAT_BC2_TYPELESS:
211  case DXGI_FORMAT_BC3_TYPELESS:
212  case DXGI_FORMAT_BC4_TYPELESS:
213  case DXGI_FORMAT_BC5_TYPELESS:
214  case DXGI_FORMAT_B8G8R8A8_TYPELESS:
215  case DXGI_FORMAT_B8G8R8X8_TYPELESS:
216  case DXGI_FORMAT_BC6H_TYPELESS:
217  case DXGI_FORMAT_BC7_TYPELESS:
218  return true;
219 
220  case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
221  case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
222  case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
223  case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
224  return partialTypeless;
225 
226  case 119 /* DXGI_FORMAT_R16_UNORM_X8_TYPELESS */:
227  case 120 /* DXGI_FORMAT_X16_TYPELESS_G8_UINT */:
228  // These are Xbox One platform specific types
229  return partialTypeless;
230 
231  default:
232  return false;
233  }
234 }
235 
236 _Use_decl_annotations_
237 inline bool HasAlpha( DXGI_FORMAT fmt )
238 {
239  switch( static_cast<int>(fmt) )
240  {
241  case DXGI_FORMAT_R32G32B32A32_TYPELESS:
242  case DXGI_FORMAT_R32G32B32A32_FLOAT:
243  case DXGI_FORMAT_R32G32B32A32_UINT:
244  case DXGI_FORMAT_R32G32B32A32_SINT:
245  case DXGI_FORMAT_R16G16B16A16_TYPELESS:
246  case DXGI_FORMAT_R16G16B16A16_FLOAT:
247  case DXGI_FORMAT_R16G16B16A16_UNORM:
248  case DXGI_FORMAT_R16G16B16A16_UINT:
249  case DXGI_FORMAT_R16G16B16A16_SNORM:
250  case DXGI_FORMAT_R16G16B16A16_SINT:
251  case DXGI_FORMAT_R10G10B10A2_TYPELESS:
252  case DXGI_FORMAT_R10G10B10A2_UNORM:
253  case DXGI_FORMAT_R10G10B10A2_UINT:
254  case DXGI_FORMAT_R8G8B8A8_TYPELESS:
255  case DXGI_FORMAT_R8G8B8A8_UNORM:
256  case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
257  case DXGI_FORMAT_R8G8B8A8_UINT:
258  case DXGI_FORMAT_R8G8B8A8_SNORM:
259  case DXGI_FORMAT_R8G8B8A8_SINT:
260  case DXGI_FORMAT_A8_UNORM:
261  case DXGI_FORMAT_BC1_TYPELESS:
262  case DXGI_FORMAT_BC1_UNORM:
263  case DXGI_FORMAT_BC1_UNORM_SRGB:
264  case DXGI_FORMAT_BC2_TYPELESS:
265  case DXGI_FORMAT_BC2_UNORM:
266  case DXGI_FORMAT_BC2_UNORM_SRGB:
267  case DXGI_FORMAT_BC3_TYPELESS:
268  case DXGI_FORMAT_BC3_UNORM:
269  case DXGI_FORMAT_BC3_UNORM_SRGB:
270  case DXGI_FORMAT_B5G5R5A1_UNORM:
271  case DXGI_FORMAT_B8G8R8A8_UNORM:
272  case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
273  case DXGI_FORMAT_B8G8R8A8_TYPELESS:
274  case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
275  case DXGI_FORMAT_BC7_TYPELESS:
276  case DXGI_FORMAT_BC7_UNORM:
277  case DXGI_FORMAT_BC7_UNORM_SRGB:
278  case DXGI_FORMAT_AYUV:
279  case DXGI_FORMAT_Y410:
280  case DXGI_FORMAT_Y416:
281  case DXGI_FORMAT_AI44:
282  case DXGI_FORMAT_IA44:
283  case DXGI_FORMAT_A8P8:
284  case DXGI_FORMAT_B4G4R4A4_UNORM:
285  return true;
286 
287  case 116 /* DXGI_FORMAT_R10G10B10_7E3_A2_FLOAT */:
288  case 117 /* DXGI_FORMAT_R10G10B10_6E4_A2_FLOAT */:
289  // These are Xbox One platform specific types
290  return true;
291 
292  default:
293  return false;
294  }
295 }
296 
297 _Use_decl_annotations_
298 inline size_t ComputeScanlines( DXGI_FORMAT fmt, size_t height )
299 {
300  if ( IsCompressed(fmt) )
301  {
302  return std::max<size_t>( 1, (height + 3) / 4 );
303  }
304  else if ( fmt == DXGI_FORMAT_NV11 )
305  {
306  // Direct3D makes this simplifying assumption, although it is larger than the 4:1:1 data
307  return height * 2;
308  }
309  else if ( IsPlanar(fmt) )
310  {
311  return height + ( ( height + 1 ) >> 1 );
312  }
313  else
314  {
315  return height;
316  }
317 }
318 
319 //=====================================================================================
320 // Image I/O
321 //=====================================================================================
322 _Use_decl_annotations_
323 inline HRESULT SaveToDDSMemory( const Image& image, DWORD flags, Blob& blob )
324 {
325  TexMetadata mdata;
326  memset( &mdata, 0, sizeof(mdata) );
327  mdata.width = image.width;
328  mdata.height = image.height;
329  mdata.depth = 1;
330  mdata.arraySize = 1;
331  mdata.mipLevels = 1;
332  mdata.format = image.format;
333  mdata.dimension = TEX_DIMENSION_TEXTURE2D;
334 
335  return SaveToDDSMemory( &image, 1, mdata, flags, blob );
336 }
337 
338 _Use_decl_annotations_
339 inline HRESULT SaveToDDSFile( const Image& image, DWORD flags, LPCWSTR szFile )
340 {
341  TexMetadata mdata;
342  memset( &mdata, 0, sizeof(mdata) );
343  mdata.width = image.width;
344  mdata.height = image.height;
345  mdata.depth = 1;
346  mdata.arraySize = 1;
347  mdata.mipLevels = 1;
348  mdata.format = image.format;
349  mdata.dimension = TEX_DIMENSION_TEXTURE2D;
350 
351  return SaveToDDSFile( &image, 1, mdata, flags, szFile );
352 }
_Use_decl_annotations_ bool IsValid(DXGI_FORMAT fmt)
Definition: DirectXTex.inl:25
_Use_decl_annotations_ HRESULT SaveToDDSMemory(const Image &image, DWORD flags, Blob &blob)
Definition: DirectXTex.inl:323
_Use_decl_annotations_ bool IsPalettized(DXGI_FORMAT fmt)
Definition: DirectXTex.inl:104
_Use_decl_annotations_ bool IsTypeless(DXGI_FORMAT fmt, bool partialTypeless)
Definition: DirectXTex.inl:192
_Use_decl_annotations_ bool HasAlpha(DXGI_FORMAT fmt)
Definition: DirectXTex.inl:237
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ DXGI_FORMAT _In_ DWORD flags
Definition: DirectXTexP.h:170
_Use_decl_annotations_ bool IsVideo(DXGI_FORMAT fmt)
Definition: DirectXTex.inl:120
_Use_decl_annotations_ bool IsDepthStencil(DXGI_FORMAT fmt)
Definition: DirectXTex.inl:150
_Use_decl_annotations_ bool IsPacked(DXGI_FORMAT fmt)
Definition: DirectXTex.inl:64
_Use_decl_annotations_ bool IsCompressed(DXGI_FORMAT fmt)
Definition: DirectXTex.inl:31
_Use_decl_annotations_ bool IsPlanar(DXGI_FORMAT fmt)
Definition: DirectXTex.inl:81
_Use_decl_annotations_ size_t ComputeScanlines(DXGI_FORMAT fmt, size_t height)
Definition: DirectXTex.inl:298
_Use_decl_annotations_ HRESULT SaveToDDSFile(const Image &image, DWORD flags, LPCWSTR szFile)
Definition: DirectXTex.inl:339
_Use_decl_annotations_ bool IsSRGB(DXGI_FORMAT fmt)
Definition: DirectXTex.inl:173