Grindstone Game Engine v0.2.0
An open source game engine and toolkit.
Loading...
Searching...
No Matches
Dds.hpp
1#pragma once
2
3#include <stdint.h>
4
5namespace Grindstone::Formats::DDS {
6 using DWORD = unsigned long;
7
9 DWORD dwSize = 32;
10 DWORD dwFlags;
11 DWORD dwFourCC;
12 DWORD dwRGBBitCount;
13 DWORD dwRBitMask;
14 DWORD dwGBitMask;
15 DWORD dwBBitMask;
16 DWORD dwABitMask;
17 };
18
19 constexpr DWORD DDPF_ALPHAPIXELS = 0x1;
20 constexpr DWORD DDPF_ALPHA = 0x2;
21 constexpr DWORD DDPF_FOURCC = 0x4;
22 constexpr DWORD DDPF_RGB = 0x40;
23 constexpr DWORD DDPF_YUV = 0x200;
24 constexpr DWORD DDPF_LUMINANCE = 0x20000;
25
26 constexpr DWORD DDSD_CAPS = 0x1;
27 constexpr DWORD DDSD_HEIGHT = 0x2;
28 constexpr DWORD DDSD_WIDTH = 0x4;
29 constexpr DWORD DDSD_PITCH = 0x8;
30 constexpr DWORD DDSD_PIXELFORMAT = 0x1000;
31 constexpr DWORD DDSD_MIPMAPCOUNT = 0x20000;
32 constexpr DWORD DDSD_LINEARSIZE = 0x80000;
33 constexpr DWORD DDSD_DEPTH = 0x800000;
34 constexpr DWORD DDSD_REQUIRED =
35 DDSD_CAPS |
36 DDSD_HEIGHT |
37 DDSD_WIDTH |
38 DDSD_PIXELFORMAT |
39 DDSD_LINEARSIZE;
40
41 struct DDSHeader {
42 DWORD dwSize = 124;
43 DWORD dwFlags;
44 DWORD dwHeight;
45 DWORD dwWidth;
46 DWORD dwPitchOrLinearSize;
47 DWORD dwDepth;
48 DWORD dwMipMapCount;
49 DWORD dwReserved1[11];
50 DDS_PIXELFORMAT ddspf;
51 DWORD dwCaps;
52 DWORD dwCaps2;
53 DWORD dwCaps3;
54 DWORD dwCaps4;
55 DWORD dwReserved2;
56 };
57
58 enum class DxgiFormat : uint32_t {
59 UNKNOWN = 0,
60 R32G32B32A32_TYPELESS = 1,
61 R32G32B32A32_FLOAT = 2,
62 R32G32B32A32_UINT = 3,
63 R32G32B32A32_SINT = 4,
64 R32G32B32_TYPELESS = 5,
65 R32G32B32_FLOAT = 6,
66 R32G32B32_UINT = 7,
67 R32G32B32_SINT = 8,
68 R16G16B16A16_TYPELESS = 9,
69 R16G16B16A16_FLOAT = 10,
70 R16G16B16A16_UNORM = 11,
71 R16G16B16A16_UINT = 12,
72 R16G16B16A16_SNORM = 13,
73 R16G16B16A16_SINT = 14,
74 R32G32_TYPELESS = 15,
75 R32G32_FLOAT = 16,
76 R32G32_UINT = 17,
77 R32G32_SINT = 18,
78 R32G8X24_TYPELESS = 19,
79 D32_FLOAT_S8X24_UINT = 20,
80 R32_FLOAT_X8X24_TYPELESS = 21,
81 X32_TYPELESS_G8X24_UINT = 22,
82 R10G10B10A2_TYPELESS = 23,
83 R10G10B10A2_UNORM = 24,
84 R10G10B10A2_UINT = 25,
85 R11G11B10_FLOAT = 26,
86 R8G8B8A8_TYPELESS = 27,
87 R8G8B8A8_UNORM = 28,
88 R8G8B8A8_UNORM_SRGB = 29,
89 R8G8B8A8_UINT = 30,
90 R8G8B8A8_SNORM = 31,
91 R8G8B8A8_SINT = 32,
92 R16G16_TYPELESS = 33,
93 R16G16_FLOAT = 34,
94 R16G16_UNORM = 35,
95 R16G16_UINT = 36,
96 R16G16_SNORM = 37,
97 R16G16_SINT = 38,
98 R32_TYPELESS = 39,
99 D32_FLOAT = 40,
100 R32_FLOAT = 41,
101 R32_UINT = 42,
102 R32_SINT = 43,
103 R24G8_TYPELESS = 44,
104 D24_UNORM_S8_UINT = 45,
105 R24_UNORM_X8_TYPELESS = 46,
106 X24_TYPELESS_G8_UINT = 47,
107 R8G8_TYPELESS = 48,
108 R8G8_UNORM = 49,
109 R8G8_UINT = 50,
110 R8G8_SNORM = 51,
111 R8G8_SINT = 52,
112 R16_TYPELESS = 53,
113 R16_FLOAT = 54,
114 D16_UNORM = 55,
115 R16_UNORM = 56,
116 R16_UINT = 57,
117 R16_SNORM = 58,
118 R16_SINT = 59,
119 R8_TYPELESS = 60,
120 R8_UNORM = 61,
121 R8_UINT = 62,
122 R8_SNORM = 63,
123 R8_SINT = 64,
124 A8_UNORM = 65,
125 R1_UNORM = 66,
126 R9G9B9E5_SHAREDEXP = 67,
127 R8G8_B8G8_UNORM = 68,
128 G8R8_G8B8_UNORM = 69,
129 BC1_TYPELESS = 70,
130 BC1_UNORM = 71,
131 BC1_UNORM_SRGB = 72,
132 BC2_TYPELESS = 73,
133 BC2_UNORM = 74,
134 BC2_UNORM_SRGB = 75,
135 BC3_TYPELESS = 76,
136 BC3_UNORM = 77,
137 BC3_UNORM_SRGB = 78,
138 BC4_TYPELESS = 79,
139 BC4_UNORM = 80,
140 BC4_SNORM = 81,
141 BC5_TYPELESS = 82,
142 BC5_UNORM = 83,
143 BC5_SNORM = 84,
144 B5G6R5_UNORM = 85,
145 B5G5R5A1_UNORM = 86,
146 B8G8R8A8_UNORM = 87,
147 B8G8R8X8_UNORM = 88,
148 R10G10B10_XR_BIAS_A2_UNORM = 89,
149 B8G8R8A8_TYPELESS = 90,
150 B8G8R8A8_UNORM_SRGB = 91,
151 B8G8R8X8_TYPELESS = 92,
152 B8G8R8X8_UNORM_SRGB = 93,
153 BC6H_TYPELESS = 94,
154 BC6H_UF16 = 95,
155 BC6H_SF16 = 96,
156 BC7_TYPELESS = 97,
157 BC7_UNORM = 98,
158 BC7_UNORM_SRGB = 99,
159 AYUV = 100,
160 Y410 = 101,
161 Y416 = 102,
162 NV12 = 103,
163 P010 = 104,
164 P016 = 105,
165 OPAQUE_420 = 106,
166 YUY2 = 107,
167 Y210 = 108,
168 Y216 = 109,
169 NV11 = 110,
170 AI44 = 111,
171 IA44 = 112,
172 P8 = 113,
173 A8P8 = 114,
174 B4G4R4A4_UNORM = 115,
175 P208 = 130,
176 V208 = 131,
177 V408 = 132,
178 SAMPLER_FEEDBACK_MIN_MIP_OPAQUE,
179 SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE,
180 FORCE_UINT = 0xffffffff
181 };
182
183 enum class D3d10ResourceDimension : uint32_t {
184 D3D10_RESOURCE_DIMENSION_UNKNOWN = 0,
185 D3D10_RESOURCE_DIMENSION_BUFFER = 1,
186 D3D10_RESOURCE_DIMENSION_TEXTURE1D = 2,
187 D3D10_RESOURCE_DIMENSION_TEXTURE2D = 3,
188 D3D10_RESOURCE_DIMENSION_TEXTURE3D = 4
189 };
190
192 DxgiFormat dxgiFormat = DxgiFormat::UNKNOWN;
193 D3d10ResourceDimension resourceDimension = D3d10ResourceDimension::D3D10_RESOURCE_DIMENSION_TEXTURE2D;
194 uint32_t miscFlag;
195 uint32_t arraySize;
196 uint32_t miscFlags2;
197 };
198
199 constexpr DWORD MakeFourCC(char c0, char c1, char c2, char c3) {
200 return ((DWORD)(char)(c0) | ((DWORD)(char)(c1) << 8) | \
201 ((DWORD)(char)(c2) << 16) | ((DWORD)(char)(c3) << 24));
202 }
203
204 constexpr DWORD MakeFourCCStr(const char* str) {
205 return MakeFourCC(str[0], str[1], str[2], str[3]);
206 }
207
208 constexpr DWORD FOURCC_R8G8_B8G8_UNORM = MakeFourCC('R', 'G', 'B', 'G');
209 constexpr DWORD FOURCC_G8R8_G8B8_UNORM = MakeFourCC('G', 'R', 'G', 'B');
210 constexpr DWORD FOURCC_R16G16B16A16_UNORM = 36;
211 constexpr DWORD FOURCC_R16G16B16A16_SNORM = 110;
212 constexpr DWORD FOURCC_R16_SFLOAT = 111;
213 constexpr DWORD FOURCC_R16G16_SFLOAT = 112;
214 constexpr DWORD FOURCC_R16G16B16A16_SFLOAT = 113;
215 constexpr DWORD FOURCC_R32_SFLOAT = 114;
216 constexpr DWORD FOURCC_R32G32_SFLOAT = 115;
217 constexpr DWORD FOURCC_R32G32B32A32_SFLOAT = 116;
218 constexpr DWORD FOURCC_CxV8U8 = 117;
219 constexpr DWORD FOURCC_DXT2_UNORM = MakeFourCC('D', 'X', 'T', '2');
220 constexpr DWORD FOURCC_DXT4_UNORM = MakeFourCC('D', 'X', 'T', '4');
221 constexpr DWORD FOURCC_BC1_UNORM = MakeFourCC('D', 'X', 'T', '1');
222 constexpr DWORD FOURCC_BC2_UNORM = MakeFourCC('D', 'X', 'T', '3');
223 constexpr DWORD FOURCC_BC3_UNORM = MakeFourCC('D', 'X', 'T', '5');
224 constexpr DWORD FOURCC_BC4_UNORM_ATI = MakeFourCC('A', 'T', 'I', '1');
225 constexpr DWORD FOURCC_BC4_UNORM = MakeFourCC('B', 'C', '4', 'U');
226 constexpr DWORD FOURCC_BC4_SNORM = MakeFourCC('B', 'C', '4', 'S');
227 constexpr DWORD FOURCC_BC5_UNORM_ATI = MakeFourCC('A', 'T', 'I', '2');
228 constexpr DWORD FOURCC_BC5_UNORM = MakeFourCC('B', 'C', '5', 'U');
229 constexpr DWORD FOURCC_BC5_SNORM = MakeFourCC('B', 'C', '5', 'S');
230 constexpr DWORD FOURCC_UYVY = MakeFourCC('U', 'Y', 'V', 'Y');
231 constexpr DWORD FOURCC_YUY2 = MakeFourCC('Y', 'U', 'Y', '2');
232 constexpr DWORD FOURCC_DXGI = MakeFourCC('D', 'X', '1', '0');
233
234 constexpr DWORD DXGI_BC6H = 95;
235
236 constexpr DWORD DDSCAPS_COMPLEX = 0x8;
237 constexpr DWORD DDSCAPS_MIPMAP = 0x400000;
238 constexpr DWORD DDSCAPS_TEXTURE = 0x1000;
239
240 constexpr DWORD DDS_RESOURCE_MISC_TEXTURECUBE = 0x4;
241
242 constexpr DWORD DDSCAPS2_CUBEMAP = 0x200;
243 constexpr DWORD DDSCAPS2_CUBEMAP_POSITIVEX = 0x400;
244 constexpr DWORD DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800;
245 constexpr DWORD DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000;
246 constexpr DWORD DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000;
247 constexpr DWORD DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000;
248 constexpr DWORD DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000;
249 constexpr DWORD DDSCAPS2_CUBEMAP_VOLUME = 0x200000;
250
251 constexpr DWORD DDS_CUBEMAP_ALLFACES =
252 DDSCAPS2_CUBEMAP |
253 DDSCAPS2_CUBEMAP_POSITIVEX |
254 DDSCAPS2_CUBEMAP_NEGATIVEX |
255 DDSCAPS2_CUBEMAP_POSITIVEY |
256 DDSCAPS2_CUBEMAP_NEGATIVEY |
257 DDSCAPS2_CUBEMAP_POSITIVEZ |
258 DDSCAPS2_CUBEMAP_NEGATIVEZ;
259}