dds_enums.h 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. /**************************************************************************/
  2. /* dds_enums.h */
  3. /**************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /**************************************************************************/
  8. /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
  9. /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /**************************************************************************/
  30. #pragma once
  31. #include "core/io/image.h"
  32. #define PF_FOURCC(m_s) ((uint32_t)(((m_s)[3] << 24U) | ((m_s)[2] << 16U) | ((m_s)[1] << 8U) | ((m_s)[0])))
  33. // Reference: https://docs.microsoft.com/en-us/windows/win32/direct3ddds/dds-header
  34. enum {
  35. DDS_MAGIC = 0x20534444,
  36. DDS_HEADER_SIZE = 124,
  37. DDS_PIXELFORMAT_SIZE = 32,
  38. DDSD_PITCH = 0x00000008,
  39. DDSD_LINEARSIZE = 0x00080000,
  40. DDSD_MIPMAPCOUNT = 0x00020000,
  41. DDSD_CAPS = 0x1,
  42. DDSD_HEIGHT = 0x2,
  43. DDSD_WIDTH = 0x4,
  44. DDSD_PIXELFORMAT = 0x1000,
  45. DDPF_ALPHAPIXELS = 0x00000001,
  46. DDPF_ALPHAONLY = 0x00000002,
  47. DDPF_FOURCC = 0x00000004,
  48. DDPF_RGB = 0x00000040,
  49. DDPF_RG_SNORM = 0x00080000,
  50. DDSC2_CUBEMAP = 0x200,
  51. DDSC2_VOLUME = 0x200000,
  52. DX10D_1D = 2,
  53. DX10D_2D = 3,
  54. DX10D_3D = 4,
  55. };
  56. enum DDSFourCC {
  57. DDFCC_DXT1 = PF_FOURCC("DXT1"),
  58. DDFCC_DXT2 = PF_FOURCC("DXT2"),
  59. DDFCC_DXT3 = PF_FOURCC("DXT3"),
  60. DDFCC_DXT4 = PF_FOURCC("DXT4"),
  61. DDFCC_DXT5 = PF_FOURCC("DXT5"),
  62. DDFCC_ATI1 = PF_FOURCC("ATI1"),
  63. DDFCC_BC4U = PF_FOURCC("BC4U"),
  64. DDFCC_ATI2 = PF_FOURCC("ATI2"),
  65. DDFCC_BC5U = PF_FOURCC("BC5U"),
  66. DDFCC_A2XY = PF_FOURCC("A2XY"),
  67. DDFCC_DX10 = PF_FOURCC("DX10"),
  68. DDFCC_RGBA16 = 36,
  69. DDFCC_R16F = 111,
  70. DDFCC_RG16F = 112,
  71. DDFCC_RGBA16F = 113,
  72. DDFCC_R32F = 114,
  73. DDFCC_RG32F = 115,
  74. DDFCC_RGBA32F = 116,
  75. };
  76. // Reference: https://learn.microsoft.com/en-us/windows/win32/api/dxgiformat/ne-dxgiformat-dxgi_format
  77. enum DXGIFormat {
  78. DXGI_R32G32B32A32_FLOAT = 2,
  79. DXGI_R32G32B32_FLOAT = 6,
  80. DXGI_R16G16B16A16_FLOAT = 10,
  81. DXGI_R16G16B16A16_UNORM = 11,
  82. DXGI_R16G16B16A16_UINT = 12,
  83. DXGI_R32G32_FLOAT = 16,
  84. DXGI_R10G10B10A2_UNORM = 24,
  85. DXGI_R8G8B8A8_UNORM = 28,
  86. DXGI_R8G8B8A8_UNORM_SRGB = 29,
  87. DXGI_R16G16_FLOAT = 34,
  88. DXGI_R16G16_UNORM = 35,
  89. DXGI_R16G16_UINT = 36,
  90. DXGI_R32_FLOAT = 41,
  91. DXGI_R8G8_UNORM = 49,
  92. DXGI_R16_FLOAT = 54,
  93. DXGI_R16_UNORM = 56,
  94. DXGI_R16_UINT = 57,
  95. DXGI_R8_UNORM = 61,
  96. DXGI_A8_UNORM = 65,
  97. DXGI_R9G9B9E5 = 67,
  98. DXGI_BC1_UNORM = 71,
  99. DXGI_BC1_UNORM_SRGB = 72,
  100. DXGI_BC2_UNORM = 74,
  101. DXGI_BC2_UNORM_SRGB = 75,
  102. DXGI_BC3_UNORM = 77,
  103. DXGI_BC3_UNORM_SRGB = 78,
  104. DXGI_BC4_UNORM = 80,
  105. DXGI_BC5_UNORM = 83,
  106. DXGI_B5G6R5_UNORM = 85,
  107. DXGI_B5G5R5A1_UNORM = 86,
  108. DXGI_B8G8R8A8_UNORM = 87,
  109. DXGI_BC6H_UF16 = 95,
  110. DXGI_BC6H_SF16 = 96,
  111. DXGI_BC7_UNORM = 98,
  112. DXGI_BC7_UNORM_SRGB = 99,
  113. DXGI_B4G4R4A4_UNORM = 115,
  114. };
  115. // The legacy bitmasked format names here represent the actual data layout in the files,
  116. // while their official names are flipped (e.g. RGBA8 layout is officially called ABGR8).
  117. enum DDSFormat {
  118. DDS_DXT1,
  119. DDS_DXT3,
  120. DDS_DXT5,
  121. DDS_ATI1,
  122. DDS_ATI2,
  123. DDS_BC6U,
  124. DDS_BC6S,
  125. DDS_BC7,
  126. DDS_R16,
  127. DDS_RG16,
  128. DDS_RGBA16,
  129. DDS_R16I,
  130. DDS_RG16I,
  131. DDS_RGBA16I,
  132. DDS_R16F,
  133. DDS_RG16F,
  134. DDS_RGBA16F,
  135. DDS_R32F,
  136. DDS_RG32F,
  137. DDS_RGB32F,
  138. DDS_RGBA32F,
  139. DDS_RGB9E5,
  140. DDS_RGB8,
  141. DDS_RGBA8,
  142. DDS_RGBX8,
  143. DDS_BGR8,
  144. DDS_BGRA8,
  145. DDS_BGRX8,
  146. DDS_BGR5A1,
  147. DDS_BGR565,
  148. DDS_B2GR3,
  149. DDS_B2GR3A8,
  150. DDS_BGR10A2,
  151. DDS_RGB10A2,
  152. DDS_BGRA4,
  153. DDS_LUMINANCE,
  154. DDS_LUMINANCE_ALPHA,
  155. DDS_LUMINANCE_ALPHA_4,
  156. DDS_MAX
  157. };
  158. enum DDSType {
  159. DDST_2D = 1,
  160. DDST_CUBEMAP,
  161. DDST_3D,
  162. DDST_TYPE_MASK = 0x7F,
  163. DDST_ARRAY = 0x80,
  164. };
  165. struct DDSFormatInfo {
  166. const char *name = nullptr;
  167. bool compressed = false;
  168. uint32_t divisor = 0;
  169. uint32_t block_size = 0;
  170. Image::Format format = Image::Format::FORMAT_BPTC_RGBA;
  171. };
  172. static const DDSFormatInfo dds_format_info[DDS_MAX] = {
  173. { "DXT1/BC1", true, 4, 8, Image::FORMAT_DXT1 },
  174. { "DXT2/DXT3/BC2", true, 4, 16, Image::FORMAT_DXT3 },
  175. { "DXT4/DXT5/BC3", true, 4, 16, Image::FORMAT_DXT5 },
  176. { "ATI1/BC4", true, 4, 8, Image::FORMAT_RGTC_R },
  177. { "ATI2/A2XY/BC5", true, 4, 16, Image::FORMAT_RGTC_RG },
  178. { "BC6UF", true, 4, 16, Image::FORMAT_BPTC_RGBFU },
  179. { "BC6SF", true, 4, 16, Image::FORMAT_BPTC_RGBF },
  180. { "BC7", true, 4, 16, Image::FORMAT_BPTC_RGBA },
  181. { "R16", false, 1, 2, Image::FORMAT_R16 },
  182. { "RG16", false, 1, 4, Image::FORMAT_RG16 },
  183. { "RGBA16", false, 1, 8, Image::FORMAT_RGBA16 },
  184. { "R16I", false, 1, 2, Image::FORMAT_R16I },
  185. { "RG16I", false, 1, 4, Image::FORMAT_RG16I },
  186. { "RGBA16I", false, 1, 8, Image::FORMAT_RGBA16I },
  187. { "R16F", false, 1, 2, Image::FORMAT_RH },
  188. { "RG16F", false, 1, 4, Image::FORMAT_RGH },
  189. { "RGBA16F", false, 1, 8, Image::FORMAT_RGBAH },
  190. { "R32F", false, 1, 4, Image::FORMAT_RF },
  191. { "RG32F", false, 1, 8, Image::FORMAT_RGF },
  192. { "RGB32F", false, 1, 12, Image::FORMAT_RGBF },
  193. { "RGBA32F", false, 1, 16, Image::FORMAT_RGBAF },
  194. { "RGB9E5", false, 1, 4, Image::FORMAT_RGBE9995 },
  195. { "RGB8", false, 1, 3, Image::FORMAT_RGB8 },
  196. { "RGBA8", false, 1, 4, Image::FORMAT_RGBA8 },
  197. { "RGBX8", false, 1, 4, Image::FORMAT_RGB8 },
  198. { "BGR8", false, 1, 3, Image::FORMAT_RGB8 },
  199. { "BGRA8", false, 1, 4, Image::FORMAT_RGBA8 },
  200. { "BGRX8", false, 1, 4, Image::FORMAT_RGB8 },
  201. { "BGR5A1", false, 1, 2, Image::FORMAT_RGBA8 },
  202. { "BGR565", false, 1, 2, Image::FORMAT_RGB565 },
  203. { "B2GR3", false, 1, 1, Image::FORMAT_RGB8 },
  204. { "B2GR3A8", false, 1, 2, Image::FORMAT_RGBA8 },
  205. { "BGR10A2", false, 1, 4, Image::FORMAT_RGBA8 },
  206. { "RGB10A2", false, 1, 4, Image::FORMAT_RGBA8 },
  207. { "BGRA4", false, 1, 2, Image::FORMAT_RGBA4444 },
  208. { "GRAYSCALE", false, 1, 1, Image::FORMAT_L8 },
  209. { "GRAYSCALE_ALPHA", false, 1, 2, Image::FORMAT_LA8 },
  210. { "GRAYSCALE_ALPHA_4", false, 1, 1, Image::FORMAT_LA8 },
  211. };