ddsData.h 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2016 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22. ////////////////////////////////////////////////////////////////////////////////
  23. // Portions Copyright (c) Microsoft Corporation. All rights reserved.
  24. // https://github.com/Microsoft/DirectXTex
  25. ////////////////////////////////////////////////////////////////////////////////
  26. #ifndef _DDSDATA_H_
  27. #define _DDSDATA_H_
  28. #ifndef _TORQUE_TYPES_H_
  29. #include "platform/types.h"
  30. #endif
  31. #include "core/util/fourcc.h"
  32. #ifdef TORQUE_OS_WIN
  33. #include <dxgiformat.h>
  34. #endif
  35. namespace dds
  36. {
  37. ///////////////////////////////////////////////////////////////////////////////////
  38. // DXGI Formats //
  39. ///////////////////////////////////////////////////////////////////////////////////
  40. #ifndef TORQUE_OS_WIN
  41. //From directx SDK
  42. typedef enum DXGI_FORMAT
  43. {
  44. DXGI_FORMAT_UNKNOWN = 0,
  45. DXGI_FORMAT_R32G32B32A32_TYPELESS = 1,
  46. DXGI_FORMAT_R32G32B32A32_FLOAT = 2,
  47. DXGI_FORMAT_R32G32B32A32_UINT = 3,
  48. DXGI_FORMAT_R32G32B32A32_SINT = 4,
  49. DXGI_FORMAT_R32G32B32_TYPELESS = 5,
  50. DXGI_FORMAT_R32G32B32_FLOAT = 6,
  51. DXGI_FORMAT_R32G32B32_UINT = 7,
  52. DXGI_FORMAT_R32G32B32_SINT = 8,
  53. DXGI_FORMAT_R16G16B16A16_TYPELESS = 9,
  54. DXGI_FORMAT_R16G16B16A16_FLOAT = 10,
  55. DXGI_FORMAT_R16G16B16A16_UNORM = 11,
  56. DXGI_FORMAT_R16G16B16A16_UINT = 12,
  57. DXGI_FORMAT_R16G16B16A16_SNORM = 13,
  58. DXGI_FORMAT_R16G16B16A16_SINT = 14,
  59. DXGI_FORMAT_R32G32_TYPELESS = 15,
  60. DXGI_FORMAT_R32G32_FLOAT = 16,
  61. DXGI_FORMAT_R32G32_UINT = 17,
  62. DXGI_FORMAT_R32G32_SINT = 18,
  63. DXGI_FORMAT_R32G8X24_TYPELESS = 19,
  64. DXGI_FORMAT_D32_FLOAT_S8X24_UINT = 20,
  65. DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS = 21,
  66. DXGI_FORMAT_X32_TYPELESS_G8X24_UINT = 22,
  67. DXGI_FORMAT_R10G10B10A2_TYPELESS = 23,
  68. DXGI_FORMAT_R10G10B10A2_UNORM = 24,
  69. DXGI_FORMAT_R10G10B10A2_UINT = 25,
  70. DXGI_FORMAT_R11G11B10_FLOAT = 26,
  71. DXGI_FORMAT_R8G8B8A8_TYPELESS = 27,
  72. DXGI_FORMAT_R8G8B8A8_UNORM = 28,
  73. DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29,
  74. DXGI_FORMAT_R8G8B8A8_UINT = 30,
  75. DXGI_FORMAT_R8G8B8A8_SNORM = 31,
  76. DXGI_FORMAT_R8G8B8A8_SINT = 32,
  77. DXGI_FORMAT_R16G16_TYPELESS = 33,
  78. DXGI_FORMAT_R16G16_FLOAT = 34,
  79. DXGI_FORMAT_R16G16_UNORM = 35,
  80. DXGI_FORMAT_R16G16_UINT = 36,
  81. DXGI_FORMAT_R16G16_SNORM = 37,
  82. DXGI_FORMAT_R16G16_SINT = 38,
  83. DXGI_FORMAT_R32_TYPELESS = 39,
  84. DXGI_FORMAT_D32_FLOAT = 40,
  85. DXGI_FORMAT_R32_FLOAT = 41,
  86. DXGI_FORMAT_R32_UINT = 42,
  87. DXGI_FORMAT_R32_SINT = 43,
  88. DXGI_FORMAT_R24G8_TYPELESS = 44,
  89. DXGI_FORMAT_D24_UNORM_S8_UINT = 45,
  90. DXGI_FORMAT_R24_UNORM_X8_TYPELESS = 46,
  91. DXGI_FORMAT_X24_TYPELESS_G8_UINT = 47,
  92. DXGI_FORMAT_R8G8_TYPELESS = 48,
  93. DXGI_FORMAT_R8G8_UNORM = 49,
  94. DXGI_FORMAT_R8G8_UINT = 50,
  95. DXGI_FORMAT_R8G8_SNORM = 51,
  96. DXGI_FORMAT_R8G8_SINT = 52,
  97. DXGI_FORMAT_R16_TYPELESS = 53,
  98. DXGI_FORMAT_R16_FLOAT = 54,
  99. DXGI_FORMAT_D16_UNORM = 55,
  100. DXGI_FORMAT_R16_UNORM = 56,
  101. DXGI_FORMAT_R16_UINT = 57,
  102. DXGI_FORMAT_R16_SNORM = 58,
  103. DXGI_FORMAT_R16_SINT = 59,
  104. DXGI_FORMAT_R8_TYPELESS = 60,
  105. DXGI_FORMAT_R8_UNORM = 61,
  106. DXGI_FORMAT_R8_UINT = 62,
  107. DXGI_FORMAT_R8_SNORM = 63,
  108. DXGI_FORMAT_R8_SINT = 64,
  109. DXGI_FORMAT_A8_UNORM = 65,
  110. DXGI_FORMAT_R1_UNORM = 66,
  111. DXGI_FORMAT_R9G9B9E5_SHAREDEXP = 67,
  112. DXGI_FORMAT_R8G8_B8G8_UNORM = 68,
  113. DXGI_FORMAT_G8R8_G8B8_UNORM = 69,
  114. DXGI_FORMAT_BC1_TYPELESS = 70,
  115. DXGI_FORMAT_BC1_UNORM = 71,
  116. DXGI_FORMAT_BC1_UNORM_SRGB = 72,
  117. DXGI_FORMAT_BC2_TYPELESS = 73,
  118. DXGI_FORMAT_BC2_UNORM = 74,
  119. DXGI_FORMAT_BC2_UNORM_SRGB = 75,
  120. DXGI_FORMAT_BC3_TYPELESS = 76,
  121. DXGI_FORMAT_BC3_UNORM = 77,
  122. DXGI_FORMAT_BC3_UNORM_SRGB = 78,
  123. DXGI_FORMAT_BC4_TYPELESS = 79,
  124. DXGI_FORMAT_BC4_UNORM = 80,
  125. DXGI_FORMAT_BC4_SNORM = 81,
  126. DXGI_FORMAT_BC5_TYPELESS = 82,
  127. DXGI_FORMAT_BC5_UNORM = 83,
  128. DXGI_FORMAT_BC5_SNORM = 84,
  129. DXGI_FORMAT_B5G6R5_UNORM = 85,
  130. DXGI_FORMAT_B5G5R5A1_UNORM = 86,
  131. DXGI_FORMAT_B8G8R8A8_UNORM = 87,
  132. DXGI_FORMAT_B8G8R8X8_UNORM = 88,
  133. DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM = 89,
  134. DXGI_FORMAT_B8G8R8A8_TYPELESS = 90,
  135. DXGI_FORMAT_B8G8R8A8_UNORM_SRGB = 91,
  136. DXGI_FORMAT_B8G8R8X8_TYPELESS = 92,
  137. DXGI_FORMAT_B8G8R8X8_UNORM_SRGB = 93,
  138. DXGI_FORMAT_BC6H_TYPELESS = 94,
  139. DXGI_FORMAT_BC6H_UF16 = 95,
  140. DXGI_FORMAT_BC6H_SF16 = 96,
  141. DXGI_FORMAT_BC7_TYPELESS = 97,
  142. DXGI_FORMAT_BC7_UNORM = 98,
  143. DXGI_FORMAT_BC7_UNORM_SRGB = 99,
  144. DXGI_FORMAT_AYUV = 100,
  145. DXGI_FORMAT_Y410 = 101,
  146. DXGI_FORMAT_Y416 = 102,
  147. DXGI_FORMAT_NV12 = 103,
  148. DXGI_FORMAT_P010 = 104,
  149. DXGI_FORMAT_P016 = 105,
  150. DXGI_FORMAT_420_OPAQUE = 106,
  151. DXGI_FORMAT_YUY2 = 107,
  152. DXGI_FORMAT_Y210 = 108,
  153. DXGI_FORMAT_Y216 = 109,
  154. DXGI_FORMAT_NV11 = 110,
  155. DXGI_FORMAT_AI44 = 111,
  156. DXGI_FORMAT_IA44 = 112,
  157. DXGI_FORMAT_P8 = 113,
  158. DXGI_FORMAT_A8P8 = 114,
  159. DXGI_FORMAT_B4G4R4A4_UNORM = 115,
  160. DXGI_FORMAT_FORCE_UINT = 0xffffffff
  161. } DXGI_FORMAT;
  162. #endif
  163. ///////////////////////////////////////////////////////////////////////////////////
  164. // D3DFMT Formats //
  165. ///////////////////////////////////////////////////////////////////////////////////
  166. enum D3DFMT
  167. {
  168. D3DFMT_UNKNOWN = 0,
  169. D3DFMT_R8G8B8 = 20,
  170. D3DFMT_A8R8G8B8 = 21,
  171. D3DFMT_X8R8G8B8 = 22,
  172. D3DFMT_R5G6B5 = 23,
  173. D3DFMT_X1R5G5B5 = 24,
  174. D3DFMT_A1R5G5B5 = 25,
  175. D3DFMT_A4R4G4B4 = 26,
  176. D3DFMT_R3G3B2 = 27,
  177. D3DFMT_A8 = 28,
  178. D3DFMT_A8R3G3B2 = 29,
  179. D3DFMT_X4R4G4B4 = 30,
  180. D3DFMT_A2B10G10R10 = 31,
  181. D3DFMT_A8B8G8R8 = 32,
  182. D3DFMT_X8B8G8R8 = 33,
  183. D3DFMT_G16R16 = 34,
  184. D3DFMT_A2R10G10B10 = 35,
  185. D3DFMT_A16B16G16R16 = 36,
  186. D3DFMT_A8P8 = 40,
  187. D3DFMT_P8 = 41,
  188. D3DFMT_L8 = 50,
  189. D3DFMT_A8L8 = 51,
  190. D3DFMT_A4L4 = 52,
  191. D3DFMT_V8U8 = 60,
  192. D3DFMT_L6V5U5 = 61,
  193. D3DFMT_X8L8V8U8 = 62,
  194. D3DFMT_Q8W8V8U8 = 63,
  195. D3DFMT_V16U16 = 64,
  196. D3DFMT_A2W10V10U10 = 67,
  197. D3DFMT_UYVY = MakeFourCC('U', 'Y', 'V', 'Y'),
  198. D3DFMT_R8G8_B8G8 = MakeFourCC('R', 'G', 'B', 'G'),
  199. D3DFMT_YUY2 = MakeFourCC('Y', 'U', 'Y', '2'),
  200. D3DFMT_G8R8_G8B8 = MakeFourCC('G', 'R', 'G', 'B'),
  201. D3DFMT_DXT1 = MakeFourCC('D', 'X', 'T', '1'),
  202. D3DFMT_DXT2 = MakeFourCC('D', 'X', 'T', '2'),
  203. D3DFMT_DXT3 = MakeFourCC('D', 'X', 'T', '3'),
  204. D3DFMT_DXT4 = MakeFourCC('D', 'X', 'T', '4'),
  205. D3DFMT_DXT5 = MakeFourCC('D', 'X', 'T', '5'),
  206. D3DFMT_ATI1 = MakeFourCC('A', 'T', 'I', '1'),
  207. D3DFMT_AT1N = MakeFourCC('A', 'T', '1', 'N'),
  208. D3DFMT_ATI2 = MakeFourCC('A', 'T', 'I', '2'),
  209. D3DFMT_AT2N = MakeFourCC('A', 'T', '2', 'N'),
  210. D3DFMT_BC4U = MakeFourCC('B', 'C', '4', 'U'),
  211. D3DFMT_BC4S = MakeFourCC('B', 'C', '4', 'S'),
  212. D3DFMT_BC5U = MakeFourCC('B', 'C', '5', 'U'),
  213. D3DFMT_BC5S = MakeFourCC('B', 'C', '5', 'S'),
  214. D3DFMT_ETC = MakeFourCC('E', 'T', 'C', ' '),
  215. D3DFMT_ETC1 = MakeFourCC('E', 'T', 'C', '1'),
  216. D3DFMT_ATC = MakeFourCC('A', 'T', 'C', ' '),
  217. D3DFMT_ATCA = MakeFourCC('A', 'T', 'C', 'A'),
  218. D3DFMT_ATCI = MakeFourCC('A', 'T', 'C', 'I'),
  219. D3DFMT_POWERVR_2BPP = MakeFourCC('P', 'T', 'C', '2'),
  220. D3DFMT_POWERVR_4BPP = MakeFourCC('P', 'T', 'C', '4'),
  221. D3DFMT_D16_LOCKABLE = 70,
  222. D3DFMT_D32 = 71,
  223. D3DFMT_D15S1 = 73,
  224. D3DFMT_D24S8 = 75,
  225. D3DFMT_D24X8 = 77,
  226. D3DFMT_D24X4S4 = 79,
  227. D3DFMT_D16 = 80,
  228. D3DFMT_D32F_LOCKABLE = 82,
  229. D3DFMT_D24FS8 = 83,
  230. D3DFMT_L16 = 81,
  231. D3DFMT_VERTEXDATA = 100,
  232. D3DFMT_INDEX16 = 101,
  233. D3DFMT_INDEX32 = 102,
  234. D3DFMT_Q16W16V16U16 = 110,
  235. D3DFMT_MULTI2_ARGB8 = MakeFourCC('M', 'E', 'T', '1'),
  236. D3DFMT_R16F = 111,
  237. D3DFMT_G16R16F = 112,
  238. D3DFMT_A16B16G16R16F = 113,
  239. D3DFMT_R32F = 114,
  240. D3DFMT_G32R32F = 115,
  241. D3DFMT_A32B32G32R32F = 116,
  242. D3DFMT_CxV8U8 = 117,
  243. D3DFMT_DX10 = MakeFourCC('D', 'X', '1', '0'),
  244. D3DFMT_FORCE_DWORD = 0x7fffffff
  245. };
  246. ///////////////////////////////////////////////////////////////////////////////////
  247. // Defines //
  248. ///////////////////////////////////////////////////////////////////////////////////
  249. #pragma pack(push,1)
  250. #define DDS_HEADER_SIZE 124
  251. #define DDS_HEADER_DX10_SIZE 20
  252. #define DDS_MAGIC 0x20534444 // "DDS "
  253. #define DDS_FOURCC 0x00000004 // DDPF_FOURCC
  254. #define DDS_RGB 0x00000040 // DDPF_RGB
  255. #define DDS_RGBA 0x00000041 // DDPF_RGB | DDPF_ALPHAPIXELS
  256. #define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE
  257. #define DDS_LUMINANCEA 0x00020001 // DDPF_LUMINANCE | DDPF_ALPHAPIXELS
  258. #define DDS_ALPHAPIXELS 0x00000001 // DDPF_ALPHAPIXELS
  259. #define DDS_ALPHA 0x00000002 // DDPF_ALPHA
  260. #define DDS_PAL8 0x00000020 // DDPF_PALETTEINDEXED8
  261. #define DDS_BUMPDUDV 0x00080000 // DDPF_BUMPDUDV
  262. #define DDS_YUV 0x00000200 //DDPF_YUV
  263. #define DDS_HEADER_FLAGS_TEXTURE 0x00001007 // DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT
  264. #define DDS_HEADER_FLAGS_MIPMAP 0x00020000 // DDSD_MIPMAPCOUNT
  265. #define DDS_HEADER_FLAGS_VOLUME 0x00800000 // DDSD_DEPTH
  266. #define DDS_HEADER_FLAGS_PITCH 0x00000008 // DDSD_PITCH
  267. #define DDS_HEADER_FLAGS_LINEARSIZE 0x00080000 // DDSD_LINEARSIZE
  268. #define DDS_HEIGHT 0x00000002 // DDSD_HEIGHT
  269. #define DDS_WIDTH 0x00000004 // DDSD_WIDTH
  270. #define DDS_SURFACE_FLAGS_TEXTURE 0x00001000 // DDSCAPS_TEXTURE
  271. #define DDS_SURFACE_FLAGS_MIPMAP 0x00400008 // DDSCAPS_COMPLEX | DDSCAPS_MIPMAP
  272. #define DDS_SURFACE_FLAGS_CUBEMAP 0x00000008 // DDSCAPS_COMPLEX
  273. #define DDS_CUBEMAP 0x00000200 // DDSCAPS2_CUBEMAP
  274. #define DDS_CUBEMAP_POSITIVEX 0x00000400 // DDSCAPS2_CUBEMAP_POSITIVEX
  275. #define DDS_CUBEMAP_NEGATIVEX 0x00000800 // DDSCAPS2_CUBEMAP_NEGATIVEX
  276. #define DDS_CUBEMAP_POSITIVEY 0x00001000 // DDSCAPS2_CUBEMAP_POSITIVEY
  277. #define DDS_CUBEMAP_NEGATIVEY 0x00002000 // DDSCAPS2_CUBEMAP_NEGATIVEY
  278. #define DDS_CUBEMAP_POSITIVEZ 0x00004000 // DDSCAPS2_CUBEMAP_POSITIVEZ
  279. #define DDS_CUBEMAP_NEGATIVEZ 0x00008000 // DDSCAPS2_CUBEMAP_NEGATIVEZ
  280. #define DDS_CUBEMAP_ALLFACES ( DDS_CUBEMAP | DDS_CUBEMAP_POSITIVEX | DDS_CUBEMAP_NEGATIVEX |\
  281. DDS_CUBEMAP_POSITIVEY | DDS_CUBEMAP_NEGATIVEY |\
  282. DDS_CUBEMAP_POSITIVEZ | DDS_CUBEMAP_NEGATIVEZ )
  283. #define DDS_FLAGS_VOLUME 0x00200000 // DDSCAPS2_VOLUME
  284. ///////////////////////////////////////////////////////////////////////////////////
  285. // Enums //
  286. ///////////////////////////////////////////////////////////////////////////////////
  287. // Subset here matches D3D10_RESOURCE_DIMENSION and D3D11_RESOURCE_DIMENSION
  288. enum DDS_RESOURCE_DIMENSION
  289. {
  290. DDS_DIMENSION_TEXTURE1D = 2,
  291. DDS_DIMENSION_TEXTURE2D = 3,
  292. DDS_DIMENSION_TEXTURE3D = 4,
  293. };
  294. // Subset here matches D3D10_RESOURCE_MISC_FLAG and D3D11_RESOURCE_MISC_FLAG
  295. enum DDS_RESOURCE_MISC_FLAG
  296. {
  297. DDS_RESOURCE_MISC_TEXTURECUBE = 0x4L,
  298. };
  299. enum DDS_MISC_FLAGS2
  300. {
  301. DDS_MISC_FLAGS2_ALPHA_MODE_MASK = 0x7L,
  302. };
  303. enum DDS_ALPHA_MODE
  304. {
  305. DDS_ALPHA_MODE_UNKNOWN = 0,
  306. DDS_ALPHA_MODE_STRAIGHT = 1,
  307. DDS_ALPHA_MODE_PREMULTIPLIED = 2,
  308. DDS_ALPHA_MODE_OPAQUE = 3,
  309. DDS_ALPHA_MODE_CUSTOM = 4,
  310. };
  311. enum D3D10_RESOURCE_DIMENSION
  312. {
  313. D3D10_RESOURCE_DIMENSION_UNKNOWN = 0,
  314. D3D10_RESOURCE_DIMENSION_BUFFER = 1,
  315. D3D10_RESOURCE_DIMENSION_TEXTURE1D = 2,
  316. D3D10_RESOURCE_DIMENSION_TEXTURE2D = 3,
  317. D3D10_RESOURCE_DIMENSION_TEXTURE3D = 4
  318. };
  319. enum D3D10_RESOURCE_MISC_FLAG
  320. {
  321. D3D10_RESOURCE_MISC_GENERATE_MIPS = 0x1L,
  322. D3D10_RESOURCE_MISC_SHARED = 0x2L,
  323. D3D10_RESOURCE_MISC_TEXTURECUBE = 0x4L,
  324. D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX = 0x10L,
  325. D3D10_RESOURCE_MISC_GDI_COMPATIBLE = 0x20L,
  326. };
  327. ///////////////////////////////////////////////////////////////////////////////////
  328. // Structs //
  329. ///////////////////////////////////////////////////////////////////////////////////
  330. struct DDS_PIXELFORMAT
  331. {
  332. U32 size;
  333. U32 flags;
  334. U32 fourCC;
  335. U32 bpp;
  336. U32 RBitMask;
  337. U32 GBitMask;
  338. U32 BBitMask;
  339. U32 ABitMask;
  340. bool operator==(const DDS_PIXELFORMAT& _test) const
  341. {
  342. return ( size == _test.size &&
  343. flags == _test.flags &&
  344. fourCC == _test.fourCC &&
  345. bpp == _test.bpp &&
  346. RBitMask == _test.RBitMask &&
  347. GBitMask == _test.GBitMask &&
  348. BBitMask == _test.BBitMask &&
  349. ABitMask == _test.ABitMask);
  350. }
  351. };
  352. struct DDS_HEADER
  353. {
  354. U32 size;
  355. U32 flags;
  356. U32 height;
  357. U32 width;
  358. U32 pitchOrLinearSize;
  359. U32 depth; // only if DDS_HEADER_FLAGS_VOLUME is set in dwFlags
  360. U32 mipMapCount;
  361. U32 reserved1[11];
  362. DDS_PIXELFORMAT ddspf;
  363. U32 surfaceFlags;
  364. U32 cubemapFlags;
  365. U32 reserved2[3];
  366. };
  367. struct DDS_HEADER_DXT10
  368. {
  369. DXGI_FORMAT dxgiFormat;
  370. U32 resourceDimension;
  371. U32 miscFlag; // see DDS_RESOURCE_MISC_FLAG
  372. U32 arraySize;
  373. U32 miscFlags2; // see DDS_MISC_FLAGS2
  374. };
  375. ///////////////////////////////////////////////////////////////////////////////////
  376. // Pixel Formats //
  377. ///////////////////////////////////////////////////////////////////////////////////
  378. const DDS_PIXELFORMAT DDSPF_DXT1 =
  379. { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, D3DFMT_DXT1, 0, 0, 0, 0, 0 };
  380. const DDS_PIXELFORMAT DDSPF_DXT2 =
  381. { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, D3DFMT_DXT2, 0, 0, 0, 0, 0 };
  382. const DDS_PIXELFORMAT DDSPF_DXT3 =
  383. { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, D3DFMT_DXT3, 0, 0, 0, 0, 0 };
  384. const DDS_PIXELFORMAT DDSPF_DXT4 =
  385. { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, D3DFMT_DXT4, 0, 0, 0, 0, 0 };
  386. const DDS_PIXELFORMAT DDSPF_DXT5 =
  387. { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, D3DFMT_DXT5, 0, 0, 0, 0, 0 };
  388. const DDS_PIXELFORMAT DDSPF_BC4_UNORM =
  389. { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, D3DFMT_BC4U, 0, 0, 0, 0, 0 };
  390. const DDS_PIXELFORMAT DDSPF_BC4_SNORM =
  391. { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, D3DFMT_BC4S, 0, 0, 0, 0, 0 };
  392. //todo check diff between this and ('B','C','5','U')
  393. const DDS_PIXELFORMAT DDSPF_ATI2 =
  394. { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, D3DFMT_ATI2, 0, 0, 0, 0, 0 };
  395. const DDS_PIXELFORMAT DDSPF_ATI1 =
  396. { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, D3DFMT_ATI1, 0, 0, 0, 0, 0 };
  397. const DDS_PIXELFORMAT DDSPF_BC5_UNORM =
  398. { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, D3DFMT_BC5U, 0, 0, 0, 0, 0 };
  399. const DDS_PIXELFORMAT DDSPF_BC5_SNORM =
  400. { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, D3DFMT_BC5S, 0, 0, 0, 0, 0 };
  401. const DDS_PIXELFORMAT DDSPF_R8G8_B8G8 =
  402. { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, D3DFMT_R8G8_B8G8, 0, 0, 0, 0, 0 };
  403. const DDS_PIXELFORMAT DDSPF_G8R8_G8B8 =
  404. { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, D3DFMT_G8R8_G8B8, 0, 0, 0, 0, 0 };
  405. const DDS_PIXELFORMAT DDSPF_YUY2 =
  406. { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, D3DFMT_YUY2, 0, 0, 0, 0, 0 };
  407. const DDS_PIXELFORMAT DDSPF_A8R8G8B8 =
  408. { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 };
  409. const DDS_PIXELFORMAT DDSPF_X8R8G8B8 =
  410. { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000 };
  411. const DDS_PIXELFORMAT DDSPF_A8B8G8R8 =
  412. { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 };
  413. const DDS_PIXELFORMAT DDSPF_X8B8G8R8 =
  414. { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0x00000000 };
  415. const DDS_PIXELFORMAT DDSPF_G16R16 =
  416. { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x0000ffff, 0xffff0000, 0x00000000, 0x00000000 };
  417. const DDS_PIXELFORMAT DDSPF_R5G6B5 =
  418. { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 16, 0x0000f800, 0x000007e0, 0x0000001f, 0x00000000 };
  419. const DDS_PIXELFORMAT DDSPF_A1R5G5B5 =
  420. { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x00007c00, 0x000003e0, 0x0000001f, 0x00008000 };
  421. const DDS_PIXELFORMAT DDSPF_A4R4G4B4 =
  422. { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x00000f00, 0x000000f0, 0x0000000f, 0x0000f000 };
  423. const DDS_PIXELFORMAT DDSPF_R8G8B8 =
  424. { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 24, 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000 };
  425. const DDS_PIXELFORMAT DDSPF_L8 =
  426. { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCE, 0, 8, 0xff, 0x00, 0x00, 0x00 };
  427. const DDS_PIXELFORMAT DDSPF_L16 =
  428. { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCE, 0, 16, 0xffff, 0x0000, 0x0000, 0x0000 };
  429. const DDS_PIXELFORMAT DDSPF_A8L8 =
  430. { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCEA, 0, 16, 0x00ff, 0x0000, 0x0000, 0xff00 };
  431. const DDS_PIXELFORMAT DDSPF_A4L4 =
  432. { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCEA, 0, 8, 0x0000000f, 0x0000, 0x0000, 0x000000f0 };
  433. const DDS_PIXELFORMAT DDSPF_A8 =
  434. { sizeof(DDS_PIXELFORMAT), DDS_ALPHA, 0, 8, 0x00, 0x00, 0x00, 0xff };
  435. const DDS_PIXELFORMAT DDSPF_V8U8 =
  436. { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 16, 0x00ff, 0xff00, 0x0000, 0x0000 };
  437. const DDS_PIXELFORMAT DDSPF_Q8W8V8U8 =
  438. { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 };
  439. const DDS_PIXELFORMAT DDSPF_V16U16 =
  440. { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 32, 0x0000ffff, 0xffff0000, 0x00000000, 0x00000000 };
  441. // D3DFMT_A2R10G10B10/D3DFMT_A2B10G10R10 should be written using DX10 extension to avoid D3DX 10:10:10:2 reversal issue
  442. // This indicates the DDS_HEADER_DXT10 extension is present (the format is in dxgiFormat)
  443. const DDS_PIXELFORMAT DDSPF_DX10 =
  444. { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, D3DFMT_DX10, 0, 0, 0, 0, 0 };
  445. #pragma pack(pop)
  446. ///////////////////////////////////////////////////////////////////////////////////
  447. // Functions //
  448. ///////////////////////////////////////////////////////////////////////////////////
  449. //get DDS_PIXELFORMAT struct from GFXFormat - todo more formats
  450. const DDS_PIXELFORMAT getDDSFormat(const GFXFormat format)
  451. {
  452. switch (format)
  453. {
  454. case GFXFormatA4L4: return DDSPF_A4L4;
  455. case GFXFormatL8: return DDSPF_L8;
  456. case GFXFormatA8: return DDSPF_A8;
  457. case GFXFormatA8L8: return DDSPF_A8L8;
  458. case GFXFormatL16: return DDSPF_L16;
  459. case GFXFormatR5G6B5: return DDSPF_R5G6B5;
  460. case GFXFormatR5G5B5A1: return DDSPF_A1R5G5B5;
  461. case GFXFormatR8G8B8: return DDSPF_R8G8B8;
  462. case GFXFormatR8G8B8A8: return DDSPF_A8R8G8B8;
  463. case GFXFormatR8G8B8X8: return DDSPF_X8R8G8B8;
  464. case GFXFormatB8G8R8A8: return DDSPF_A8B8G8R8;
  465. case GFXFormatR16G16B16A16F:
  466. case GFXFormatR32G32B32A32F: return DDSPF_DX10;
  467. //compressed
  468. case GFXFormatBC1: return DDSPF_DXT1;
  469. case GFXFormatBC2: return DDSPF_DXT3;
  470. case GFXFormatBC3: return DDSPF_DXT5;
  471. case GFXFormatBC4: return DDSPF_ATI1;
  472. case GFXFormatBC5: return DDSPF_ATI2;
  473. default:
  474. {
  475. Con::errorf("dds::getDDSFormat: unknown format");
  476. return DDSPF_A8R8G8B8;
  477. }
  478. }
  479. }
  480. //get DXGI_FORMAT from GFXFormat - todo more formats
  481. const DXGI_FORMAT getDXGIFormat(const GFXFormat format)
  482. {
  483. switch (format)
  484. {
  485. //byte
  486. case GFXFormatR5G6B5: return DXGI_FORMAT_B5G6R5_UNORM;
  487. case GFXFormatR5G5B5A1: return DXGI_FORMAT_B5G5R5A1_UNORM;
  488. case GFXFormatB8G8R8A8: return DXGI_FORMAT_R8G8B8A8_UNORM;
  489. case GFXFormatR8G8B8A8: return DXGI_FORMAT_B8G8R8A8_UNORM;
  490. case GFXFormatR8G8B8X8: return DXGI_FORMAT_B8G8R8X8_UNORM;
  491. case GFXFormatR10G10B10A2: return DXGI_FORMAT_R10G10B10A2_UNORM;
  492. //uint
  493. case GFXFormatR16G16: return DXGI_FORMAT_R16G16_UINT;
  494. case GFXFormatR16G16B16A16: return DXGI_FORMAT_R16G16B16A16_UINT;
  495. //float
  496. case GFXFormatR16F: return DXGI_FORMAT_R16_FLOAT;
  497. case GFXFormatR32F: return DXGI_FORMAT_R32_FLOAT;
  498. case GFXFormatR16G16B16A16F: return DXGI_FORMAT_R16G16B16A16_FLOAT;
  499. case GFXFormatR32G32B32A32F: return DXGI_FORMAT_R32G32B32A32_FLOAT;
  500. //compressed
  501. case GFXFormatBC1: return DXGI_FORMAT_BC1_UNORM;
  502. case GFXFormatBC2: return DXGI_FORMAT_BC2_UNORM;
  503. case GFXFormatBC3: return DXGI_FORMAT_BC3_UNORM;
  504. case GFXFormatBC4: return DXGI_FORMAT_BC4_UNORM;
  505. case GFXFormatBC5: return DXGI_FORMAT_BC5_UNORM;
  506. default:
  507. {
  508. Con::errorf("dds::getDXGIFormat: unknown format");
  509. return DXGI_FORMAT_UNKNOWN;
  510. }
  511. }
  512. }
  513. //get GFXFormat from D3DFMT - todo more formats
  514. const GFXFormat getGFXFormat(const D3DFMT format)
  515. {
  516. switch (format)
  517. {
  518. //byte
  519. case D3DFMT_A4L4: return GFXFormatA4L4;
  520. case D3DFMT_L8: return GFXFormatL8;
  521. case D3DFMT_A8: return GFXFormatA8;
  522. case D3DFMT_A8L8: return GFXFormatA8L8;
  523. case D3DFMT_L16: return GFXFormatL16;
  524. case D3DFMT_R5G6B5: return GFXFormatR5G6B5;
  525. case D3DFMT_A1R5G5B5: return GFXFormatR5G5B5A1;
  526. case D3DFMT_R8G8B8: return GFXFormatR8G8B8;
  527. case D3DFMT_A8R8G8B8: return GFXFormatR8G8B8A8;
  528. case D3DFMT_X8R8G8B8: return GFXFormatR8G8B8A8;
  529. case D3DFMT_A8B8G8R8: return GFXFormatB8G8R8A8;
  530. case D3DFMT_X8B8G8R8: return GFXFormatB8G8R8A8;
  531. //uint
  532. case D3DFMT_G16R16: return GFXFormatR16G16;
  533. case D3DFMT_A16B16G16R16: return GFXFormatR16G16B16A16;
  534. //float
  535. case D3DFMT_R16F: return GFXFormatR16F;
  536. case D3DFMT_R32F: return GFXFormatR32F;
  537. case D3DFMT_G16R16F: return GFXFormatR16G16F;
  538. case D3DFMT_A16B16G16R16F: return GFXFormatR16G16B16A16F;
  539. case D3DFMT_A32B32G32R32F: return GFXFormatR32G32B32A32F;
  540. //compressed
  541. case D3DFMT_DXT1: return GFXFormatBC1;
  542. case D3DFMT_DXT2:
  543. case D3DFMT_DXT3: return GFXFormatBC2;
  544. case D3DFMT_DXT4:
  545. case D3DFMT_DXT5: return GFXFormatBC3;
  546. case D3DFMT_ATI1: return GFXFormatBC4;
  547. case D3DFMT_ATI2: return GFXFormatBC5;
  548. default:
  549. {
  550. Con::errorf("dds::getGFXFormat: unknown format");
  551. return GFXFormat_FIRST;
  552. }
  553. }
  554. }
  555. //get GFXFormat from DXGI_FORMAT - todo more formats
  556. const GFXFormat getGFXFormat(const DXGI_FORMAT format)
  557. {
  558. switch (format)
  559. {
  560. //byte
  561. case DXGI_FORMAT_B5G6R5_UNORM: return GFXFormatR5G6B5;
  562. case DXGI_FORMAT_B5G5R5A1_UNORM: return GFXFormatR5G5B5A1;
  563. case DXGI_FORMAT_R8G8B8A8_UNORM: return GFXFormatB8G8R8A8;
  564. case DXGI_FORMAT_B8G8R8A8_UNORM: return GFXFormatR8G8B8A8;
  565. case DXGI_FORMAT_B8G8R8X8_UNORM: return GFXFormatR8G8B8X8;
  566. case DXGI_FORMAT_R10G10B10A2_UNORM: return GFXFormatR10G10B10A2;
  567. //uint
  568. case DXGI_FORMAT_R16G16_UINT: return GFXFormatR16G16;
  569. case DXGI_FORMAT_R16G16B16A16_UINT: return GFXFormatR16G16B16A16;
  570. //float
  571. case DXGI_FORMAT_R16_FLOAT: return GFXFormatR16F;
  572. case DXGI_FORMAT_R32_FLOAT: return GFXFormatR32F;
  573. case DXGI_FORMAT_R16G16_FLOAT: return GFXFormatR16G16F;
  574. case DXGI_FORMAT_R16G16B16A16_FLOAT: return GFXFormatR16G16B16A16F;
  575. case DXGI_FORMAT_R32G32B32A32_FLOAT: return GFXFormatR32G32B32A32F;
  576. //compressed
  577. case DXGI_FORMAT_BC1_UNORM: return GFXFormatBC1;
  578. case DXGI_FORMAT_BC2_UNORM: return GFXFormatBC2;
  579. case DXGI_FORMAT_BC3_UNORM: return GFXFormatBC3;
  580. case DXGI_FORMAT_BC4_UNORM: return GFXFormatBC4;
  581. case DXGI_FORMAT_BC5_UNORM: return GFXFormatBC5;
  582. default:
  583. {
  584. Con::errorf("dds::getGFXFormatDxgi: unknown format");
  585. return GFXFormat_FIRST;
  586. }
  587. }
  588. }
  589. //get GFXFormat from DDS_PIXELFORMAT struct - todo more formats
  590. const GFXFormat getGFXFormat(const DDS_PIXELFORMAT &format)
  591. {
  592. if (format == DDSPF_DXT1)
  593. return GFXFormatBC1;
  594. else if (format == DDSPF_DXT2)
  595. return GFXFormatBC2;
  596. else if (format == DDSPF_DXT3)
  597. return GFXFormatBC2;
  598. else if (format == DDSPF_DXT4)
  599. return GFXFormatBC3;
  600. else if (format == DDSPF_DXT5)
  601. return GFXFormatBC3;
  602. else if (format == DDSPF_ATI1)
  603. return GFXFormatBC4;
  604. else if (format == DDSPF_ATI2)
  605. return GFXFormatBC5;
  606. else if (format == DDSPF_A8R8G8B8)
  607. return GFXFormatR8G8B8A8;
  608. else if (format == DDSPF_X8R8G8B8)
  609. return GFXFormatR8G8B8A8;
  610. else if (format == DDSPF_A8B8G8R8)
  611. return GFXFormatB8G8R8A8;
  612. else if (format == DDSPF_X8B8G8R8)
  613. return GFXFormatB8G8R8A8;
  614. else if (format == DDSPF_R8G8B8)
  615. return GFXFormatR8G8B8;
  616. else if (format == DDSPF_A8L8)
  617. return GFXFormatA8L8;
  618. else if (format == DDSPF_A4L4)
  619. return GFXFormatA4L4;
  620. else if (format == DDSPF_A8)
  621. return GFXFormatA8;
  622. else if (format == DDSPF_L8)
  623. return GFXFormatL8;
  624. else if (format == DDSPF_R5G6B5)
  625. return GFXFormatR5G6B5;
  626. else if (format == DDSPF_A1R5G5B5)
  627. return GFXFormatR5G5B5A1;
  628. else
  629. {
  630. Con::errorf("dds::getGFXFormat: unknown format");
  631. return GFXFormat_FIRST;
  632. }
  633. }
  634. //get GFXFormat from fourcc value - todo more formats
  635. const GFXFormat getGFXFormat(const U32 fourcc)
  636. {
  637. switch (fourcc)
  638. {
  639. case D3DFMT_DXT1: return GFXFormatBC1;
  640. case D3DFMT_DXT2:
  641. case D3DFMT_DXT3: return GFXFormatBC2;
  642. case D3DFMT_DXT4:
  643. case D3DFMT_DXT5: return GFXFormatBC3;
  644. case D3DFMT_ATI1: return GFXFormatBC4;
  645. case D3DFMT_ATI2: return GFXFormatBC5;
  646. case D3DFMT_A16B16G16R16F: return GFXFormatR16G16B16A16F;
  647. case D3DFMT_A32B32G32R32F: return GFXFormatR32G32B32A32F;
  648. case D3DFMT_G16R16F: return GFXFormatR16G16F;
  649. default:
  650. {
  651. Con::errorf("dds::getGFXFormatFourcc: unknown format");
  652. return GFXFormat_FIRST;
  653. }
  654. }
  655. }
  656. const U32 getBitsPerPixel(DXGI_FORMAT fmt)
  657. {
  658. switch (fmt)
  659. {
  660. case DXGI_FORMAT_R32G32B32A32_TYPELESS:
  661. case DXGI_FORMAT_R32G32B32A32_FLOAT:
  662. case DXGI_FORMAT_R32G32B32A32_UINT:
  663. case DXGI_FORMAT_R32G32B32A32_SINT:
  664. return 128;
  665. case DXGI_FORMAT_R32G32B32_TYPELESS:
  666. case DXGI_FORMAT_R32G32B32_FLOAT:
  667. case DXGI_FORMAT_R32G32B32_UINT:
  668. case DXGI_FORMAT_R32G32B32_SINT:
  669. return 96;
  670. case DXGI_FORMAT_R16G16B16A16_TYPELESS:
  671. case DXGI_FORMAT_R16G16B16A16_FLOAT:
  672. case DXGI_FORMAT_R16G16B16A16_UNORM:
  673. case DXGI_FORMAT_R16G16B16A16_UINT:
  674. case DXGI_FORMAT_R16G16B16A16_SNORM:
  675. case DXGI_FORMAT_R16G16B16A16_SINT:
  676. case DXGI_FORMAT_R32G32_TYPELESS:
  677. case DXGI_FORMAT_R32G32_FLOAT:
  678. case DXGI_FORMAT_R32G32_UINT:
  679. case DXGI_FORMAT_R32G32_SINT:
  680. case DXGI_FORMAT_R32G8X24_TYPELESS:
  681. case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
  682. case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
  683. case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
  684. return 64;
  685. case DXGI_FORMAT_R10G10B10A2_TYPELESS:
  686. case DXGI_FORMAT_R10G10B10A2_UNORM:
  687. case DXGI_FORMAT_R10G10B10A2_UINT:
  688. case DXGI_FORMAT_R11G11B10_FLOAT:
  689. case DXGI_FORMAT_R8G8B8A8_TYPELESS:
  690. case DXGI_FORMAT_R8G8B8A8_UNORM:
  691. case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
  692. case DXGI_FORMAT_R8G8B8A8_UINT:
  693. case DXGI_FORMAT_R8G8B8A8_SNORM:
  694. case DXGI_FORMAT_R8G8B8A8_SINT:
  695. case DXGI_FORMAT_R16G16_TYPELESS:
  696. case DXGI_FORMAT_R16G16_FLOAT:
  697. case DXGI_FORMAT_R16G16_UNORM:
  698. case DXGI_FORMAT_R16G16_UINT:
  699. case DXGI_FORMAT_R16G16_SNORM:
  700. case DXGI_FORMAT_R16G16_SINT:
  701. case DXGI_FORMAT_R32_TYPELESS:
  702. case DXGI_FORMAT_D32_FLOAT:
  703. case DXGI_FORMAT_R32_FLOAT:
  704. case DXGI_FORMAT_R32_UINT:
  705. case DXGI_FORMAT_R32_SINT:
  706. case DXGI_FORMAT_R24G8_TYPELESS:
  707. case DXGI_FORMAT_D24_UNORM_S8_UINT:
  708. case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
  709. case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
  710. case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
  711. case DXGI_FORMAT_R8G8_B8G8_UNORM:
  712. case DXGI_FORMAT_G8R8_G8B8_UNORM:
  713. case DXGI_FORMAT_B8G8R8A8_UNORM:
  714. case DXGI_FORMAT_B8G8R8X8_UNORM:
  715. case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
  716. case DXGI_FORMAT_B8G8R8A8_TYPELESS:
  717. case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
  718. case DXGI_FORMAT_B8G8R8X8_TYPELESS:
  719. case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
  720. return 32;
  721. case DXGI_FORMAT_R8G8_TYPELESS:
  722. case DXGI_FORMAT_R8G8_UNORM:
  723. case DXGI_FORMAT_R8G8_UINT:
  724. case DXGI_FORMAT_R8G8_SNORM:
  725. case DXGI_FORMAT_R8G8_SINT:
  726. case DXGI_FORMAT_R16_TYPELESS:
  727. case DXGI_FORMAT_R16_FLOAT:
  728. case DXGI_FORMAT_D16_UNORM:
  729. case DXGI_FORMAT_R16_UNORM:
  730. case DXGI_FORMAT_R16_UINT:
  731. case DXGI_FORMAT_R16_SNORM:
  732. case DXGI_FORMAT_R16_SINT:
  733. case DXGI_FORMAT_B5G6R5_UNORM:
  734. case DXGI_FORMAT_B5G5R5A1_UNORM:
  735. return 16;
  736. case DXGI_FORMAT_R8_TYPELESS:
  737. case DXGI_FORMAT_R8_UNORM:
  738. case DXGI_FORMAT_R8_UINT:
  739. case DXGI_FORMAT_R8_SNORM:
  740. case DXGI_FORMAT_R8_SINT:
  741. case DXGI_FORMAT_A8_UNORM:
  742. return 8;
  743. case DXGI_FORMAT_R1_UNORM:
  744. return 1;
  745. case DXGI_FORMAT_BC1_TYPELESS:
  746. case DXGI_FORMAT_BC1_UNORM:
  747. case DXGI_FORMAT_BC1_UNORM_SRGB:
  748. case DXGI_FORMAT_BC4_TYPELESS:
  749. case DXGI_FORMAT_BC4_UNORM:
  750. case DXGI_FORMAT_BC4_SNORM:
  751. return 4;
  752. case DXGI_FORMAT_BC2_TYPELESS:
  753. case DXGI_FORMAT_BC2_UNORM:
  754. case DXGI_FORMAT_BC2_UNORM_SRGB:
  755. case DXGI_FORMAT_BC3_TYPELESS:
  756. case DXGI_FORMAT_BC3_UNORM:
  757. case DXGI_FORMAT_BC3_UNORM_SRGB:
  758. case DXGI_FORMAT_BC5_TYPELESS:
  759. case DXGI_FORMAT_BC5_UNORM:
  760. case DXGI_FORMAT_BC5_SNORM:
  761. case DXGI_FORMAT_BC6H_TYPELESS:
  762. case DXGI_FORMAT_BC6H_UF16:
  763. case DXGI_FORMAT_BC6H_SF16:
  764. case DXGI_FORMAT_BC7_TYPELESS:
  765. case DXGI_FORMAT_BC7_UNORM:
  766. case DXGI_FORMAT_BC7_UNORM_SRGB:
  767. return 8;
  768. default:
  769. return 0;
  770. }
  771. }
  772. const bool validateHeader(const DDS_HEADER &header)
  773. {
  774. if (header.size != DDS_HEADER_SIZE)
  775. {
  776. Con::errorf("DDS_HEADER - incorrect header size. Expected 124 bytes.");
  777. return false;
  778. }
  779. if (!(header.flags & DDS_HEADER_FLAGS_TEXTURE))
  780. {
  781. Con::errorf("DDS_HEADER - incorrect surface description flags.");
  782. return false;
  783. }
  784. if ((header.flags & (DDS_HEADER_FLAGS_LINEARSIZE | DDS_HEADER_FLAGS_PITCH)) == (DDS_HEADER_FLAGS_LINEARSIZE | DDS_HEADER_FLAGS_PITCH))
  785. {
  786. // Both are invalid!
  787. Con::errorf("DDS_HEADER - encountered both DDSD_LINEARSIZE and DDSD_PITCH!");
  788. return false;
  789. }
  790. return true;
  791. }
  792. const bool validateHeaderDx10(const DDS_HEADER_DXT10 &header)
  793. {
  794. if (sizeof(DDS_HEADER_DXT10) != DDS_HEADER_DX10_SIZE)
  795. {
  796. Con::errorf("DDS_HEADER_DXT10 - incorrect header size. Expected 20 bytes.");
  797. return false;
  798. }
  799. return true;
  800. }
  801. }
  802. #endif