|
1 #include "precompiled.h" |
|
2 // |
|
3 // Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. |
|
4 // Use of this source code is governed by a BSD-style license that can be |
|
5 // found in the LICENSE file. |
|
6 // |
|
7 |
|
8 // renderer11_utils.cpp: Conversion functions and other utility routines |
|
9 // specific to the D3D11 renderer. |
|
10 |
|
11 #include "libGLESv2/renderer/renderer11_utils.h" |
|
12 |
|
13 #include "common/debug.h" |
|
14 |
|
15 namespace gl_d3d11 |
|
16 { |
|
17 |
|
18 D3D11_BLEND ConvertBlendFunc(GLenum glBlend, bool isAlpha) |
|
19 { |
|
20 D3D11_BLEND d3dBlend = D3D11_BLEND_ZERO; |
|
21 |
|
22 switch (glBlend) |
|
23 { |
|
24 case GL_ZERO: d3dBlend = D3D11_BLEND_ZERO; break; |
|
25 case GL_ONE: d3dBlend = D3D11_BLEND_ONE; break; |
|
26 case GL_SRC_COLOR: d3dBlend = (isAlpha ? D3D11_BLEND_SRC_ALPHA : D3D11_BLEND_SRC_COLOR); break; |
|
27 case GL_ONE_MINUS_SRC_COLOR: d3dBlend = (isAlpha ? D3D11_BLEND_INV_SRC_ALPHA : D3D11_BLEND_INV_SRC_COLOR); break; |
|
28 case GL_DST_COLOR: d3dBlend = (isAlpha ? D3D11_BLEND_DEST_ALPHA : D3D11_BLEND_DEST_COLOR); break; |
|
29 case GL_ONE_MINUS_DST_COLOR: d3dBlend = (isAlpha ? D3D11_BLEND_INV_DEST_ALPHA : D3D11_BLEND_INV_DEST_COLOR); break; |
|
30 case GL_SRC_ALPHA: d3dBlend = D3D11_BLEND_SRC_ALPHA; break; |
|
31 case GL_ONE_MINUS_SRC_ALPHA: d3dBlend = D3D11_BLEND_INV_SRC_ALPHA; break; |
|
32 case GL_DST_ALPHA: d3dBlend = D3D11_BLEND_DEST_ALPHA; break; |
|
33 case GL_ONE_MINUS_DST_ALPHA: d3dBlend = D3D11_BLEND_INV_DEST_ALPHA; break; |
|
34 case GL_CONSTANT_COLOR: d3dBlend = D3D11_BLEND_BLEND_FACTOR; break; |
|
35 case GL_ONE_MINUS_CONSTANT_COLOR: d3dBlend = D3D11_BLEND_INV_BLEND_FACTOR; break; |
|
36 case GL_CONSTANT_ALPHA: d3dBlend = D3D11_BLEND_BLEND_FACTOR; break; |
|
37 case GL_ONE_MINUS_CONSTANT_ALPHA: d3dBlend = D3D11_BLEND_INV_BLEND_FACTOR; break; |
|
38 case GL_SRC_ALPHA_SATURATE: d3dBlend = D3D11_BLEND_SRC_ALPHA_SAT; break; |
|
39 default: UNREACHABLE(); |
|
40 } |
|
41 |
|
42 return d3dBlend; |
|
43 } |
|
44 |
|
45 D3D11_BLEND_OP ConvertBlendOp(GLenum glBlendOp) |
|
46 { |
|
47 D3D11_BLEND_OP d3dBlendOp = D3D11_BLEND_OP_ADD; |
|
48 |
|
49 switch (glBlendOp) |
|
50 { |
|
51 case GL_FUNC_ADD: d3dBlendOp = D3D11_BLEND_OP_ADD; break; |
|
52 case GL_FUNC_SUBTRACT: d3dBlendOp = D3D11_BLEND_OP_SUBTRACT; break; |
|
53 case GL_FUNC_REVERSE_SUBTRACT: d3dBlendOp = D3D11_BLEND_OP_REV_SUBTRACT; break; |
|
54 default: UNREACHABLE(); |
|
55 } |
|
56 |
|
57 return d3dBlendOp; |
|
58 } |
|
59 |
|
60 UINT8 ConvertColorMask(bool red, bool green, bool blue, bool alpha) |
|
61 { |
|
62 UINT8 mask = 0; |
|
63 if (red) |
|
64 { |
|
65 mask |= D3D11_COLOR_WRITE_ENABLE_RED; |
|
66 } |
|
67 if (green) |
|
68 { |
|
69 mask |= D3D11_COLOR_WRITE_ENABLE_GREEN; |
|
70 } |
|
71 if (blue) |
|
72 { |
|
73 mask |= D3D11_COLOR_WRITE_ENABLE_BLUE; |
|
74 } |
|
75 if (alpha) |
|
76 { |
|
77 mask |= D3D11_COLOR_WRITE_ENABLE_ALPHA; |
|
78 } |
|
79 return mask; |
|
80 } |
|
81 |
|
82 D3D11_CULL_MODE ConvertCullMode(bool cullEnabled, GLenum cullMode) |
|
83 { |
|
84 D3D11_CULL_MODE cull = D3D11_CULL_NONE; |
|
85 |
|
86 if (cullEnabled) |
|
87 { |
|
88 switch (cullMode) |
|
89 { |
|
90 case GL_FRONT: cull = D3D11_CULL_FRONT; break; |
|
91 case GL_BACK: cull = D3D11_CULL_BACK; break; |
|
92 case GL_FRONT_AND_BACK: cull = D3D11_CULL_NONE; break; |
|
93 default: UNREACHABLE(); |
|
94 } |
|
95 } |
|
96 else |
|
97 { |
|
98 cull = D3D11_CULL_NONE; |
|
99 } |
|
100 |
|
101 return cull; |
|
102 } |
|
103 |
|
104 D3D11_COMPARISON_FUNC ConvertComparison(GLenum comparison) |
|
105 { |
|
106 D3D11_COMPARISON_FUNC d3dComp = D3D11_COMPARISON_NEVER; |
|
107 switch (comparison) |
|
108 { |
|
109 case GL_NEVER: d3dComp = D3D11_COMPARISON_NEVER; break; |
|
110 case GL_ALWAYS: d3dComp = D3D11_COMPARISON_ALWAYS; break; |
|
111 case GL_LESS: d3dComp = D3D11_COMPARISON_LESS; break; |
|
112 case GL_LEQUAL: d3dComp = D3D11_COMPARISON_LESS_EQUAL; break; |
|
113 case GL_EQUAL: d3dComp = D3D11_COMPARISON_EQUAL; break; |
|
114 case GL_GREATER: d3dComp = D3D11_COMPARISON_GREATER; break; |
|
115 case GL_GEQUAL: d3dComp = D3D11_COMPARISON_GREATER_EQUAL; break; |
|
116 case GL_NOTEQUAL: d3dComp = D3D11_COMPARISON_NOT_EQUAL; break; |
|
117 default: UNREACHABLE(); |
|
118 } |
|
119 |
|
120 return d3dComp; |
|
121 } |
|
122 |
|
123 D3D11_DEPTH_WRITE_MASK ConvertDepthMask(bool depthWriteEnabled) |
|
124 { |
|
125 return depthWriteEnabled ? D3D11_DEPTH_WRITE_MASK_ALL : D3D11_DEPTH_WRITE_MASK_ZERO; |
|
126 } |
|
127 |
|
128 UINT8 ConvertStencilMask(GLuint stencilmask) |
|
129 { |
|
130 return static_cast<UINT8>(stencilmask); |
|
131 } |
|
132 |
|
133 D3D11_STENCIL_OP ConvertStencilOp(GLenum stencilOp) |
|
134 { |
|
135 D3D11_STENCIL_OP d3dStencilOp = D3D11_STENCIL_OP_KEEP; |
|
136 |
|
137 switch (stencilOp) |
|
138 { |
|
139 case GL_ZERO: d3dStencilOp = D3D11_STENCIL_OP_ZERO; break; |
|
140 case GL_KEEP: d3dStencilOp = D3D11_STENCIL_OP_KEEP; break; |
|
141 case GL_REPLACE: d3dStencilOp = D3D11_STENCIL_OP_REPLACE; break; |
|
142 case GL_INCR: d3dStencilOp = D3D11_STENCIL_OP_INCR_SAT; break; |
|
143 case GL_DECR: d3dStencilOp = D3D11_STENCIL_OP_DECR_SAT; break; |
|
144 case GL_INVERT: d3dStencilOp = D3D11_STENCIL_OP_INVERT; break; |
|
145 case GL_INCR_WRAP: d3dStencilOp = D3D11_STENCIL_OP_INCR; break; |
|
146 case GL_DECR_WRAP: d3dStencilOp = D3D11_STENCIL_OP_DECR; break; |
|
147 default: UNREACHABLE(); |
|
148 } |
|
149 |
|
150 return d3dStencilOp; |
|
151 } |
|
152 |
|
153 D3D11_FILTER ConvertFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy) |
|
154 { |
|
155 if (maxAnisotropy > 1.0f) |
|
156 { |
|
157 return D3D11_ENCODE_ANISOTROPIC_FILTER(false); |
|
158 } |
|
159 else |
|
160 { |
|
161 D3D11_FILTER_TYPE dxMin = D3D11_FILTER_TYPE_POINT; |
|
162 D3D11_FILTER_TYPE dxMip = D3D11_FILTER_TYPE_POINT; |
|
163 switch (minFilter) |
|
164 { |
|
165 case GL_NEAREST: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_POINT; break; |
|
166 case GL_LINEAR: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_POINT; break; |
|
167 case GL_NEAREST_MIPMAP_NEAREST: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_POINT; break; |
|
168 case GL_LINEAR_MIPMAP_NEAREST: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_POINT; break; |
|
169 case GL_NEAREST_MIPMAP_LINEAR: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_LINEAR; break; |
|
170 case GL_LINEAR_MIPMAP_LINEAR: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_LINEAR; break; |
|
171 default: UNREACHABLE(); |
|
172 } |
|
173 |
|
174 D3D11_FILTER_TYPE dxMag = D3D11_FILTER_TYPE_POINT; |
|
175 switch (magFilter) |
|
176 { |
|
177 case GL_NEAREST: dxMag = D3D11_FILTER_TYPE_POINT; break; |
|
178 case GL_LINEAR: dxMag = D3D11_FILTER_TYPE_LINEAR; break; |
|
179 default: UNREACHABLE(); |
|
180 } |
|
181 |
|
182 return D3D11_ENCODE_BASIC_FILTER(dxMin, dxMag, dxMip, false); |
|
183 } |
|
184 } |
|
185 |
|
186 D3D11_TEXTURE_ADDRESS_MODE ConvertTextureWrap(GLenum wrap) |
|
187 { |
|
188 switch (wrap) |
|
189 { |
|
190 case GL_REPEAT: return D3D11_TEXTURE_ADDRESS_WRAP; |
|
191 case GL_CLAMP_TO_EDGE: return D3D11_TEXTURE_ADDRESS_CLAMP; |
|
192 case GL_MIRRORED_REPEAT: return D3D11_TEXTURE_ADDRESS_MIRROR; |
|
193 default: UNREACHABLE(); |
|
194 } |
|
195 |
|
196 return D3D11_TEXTURE_ADDRESS_WRAP; |
|
197 } |
|
198 |
|
199 FLOAT ConvertMinLOD(GLenum minFilter, unsigned int lodOffset) |
|
200 { |
|
201 return (minFilter == GL_NEAREST || minFilter == GL_LINEAR) ? static_cast<float>(lodOffset) : -FLT_MAX; |
|
202 } |
|
203 |
|
204 FLOAT ConvertMaxLOD(GLenum minFilter, unsigned int lodOffset) |
|
205 { |
|
206 return (minFilter == GL_NEAREST || minFilter == GL_LINEAR) ? static_cast<float>(lodOffset) : FLT_MAX; |
|
207 } |
|
208 |
|
209 } |
|
210 |
|
211 namespace d3d11_gl |
|
212 { |
|
213 |
|
214 GLenum ConvertBackBufferFormat(DXGI_FORMAT format) |
|
215 { |
|
216 switch (format) |
|
217 { |
|
218 case DXGI_FORMAT_R8G8B8A8_UNORM: return GL_RGBA8_OES; |
|
219 case DXGI_FORMAT_B8G8R8A8_UNORM: return GL_BGRA8_EXT; |
|
220 default: |
|
221 UNREACHABLE(); |
|
222 } |
|
223 |
|
224 return GL_RGBA8_OES; |
|
225 } |
|
226 |
|
227 GLenum ConvertDepthStencilFormat(DXGI_FORMAT format) |
|
228 { |
|
229 switch (format) |
|
230 { |
|
231 case DXGI_FORMAT_UNKNOWN: return GL_NONE; |
|
232 case DXGI_FORMAT_D16_UNORM: return GL_DEPTH_COMPONENT16; |
|
233 case DXGI_FORMAT_D24_UNORM_S8_UINT: return GL_DEPTH24_STENCIL8_OES; |
|
234 default: |
|
235 UNREACHABLE(); |
|
236 } |
|
237 |
|
238 return GL_DEPTH24_STENCIL8_OES; |
|
239 } |
|
240 |
|
241 GLenum ConvertRenderbufferFormat(DXGI_FORMAT format) |
|
242 { |
|
243 switch (format) |
|
244 { |
|
245 case DXGI_FORMAT_B8G8R8A8_UNORM: |
|
246 return GL_BGRA8_EXT; |
|
247 case DXGI_FORMAT_R8G8B8A8_UNORM: |
|
248 return GL_RGBA8_OES; |
|
249 case DXGI_FORMAT_D16_UNORM: |
|
250 return GL_DEPTH_COMPONENT16; |
|
251 case DXGI_FORMAT_D24_UNORM_S8_UINT: |
|
252 return GL_DEPTH24_STENCIL8_OES; |
|
253 default: |
|
254 UNREACHABLE(); |
|
255 } |
|
256 |
|
257 return GL_RGBA8_OES; |
|
258 } |
|
259 |
|
260 GLenum ConvertTextureInternalFormat(DXGI_FORMAT format) |
|
261 { |
|
262 switch (format) |
|
263 { |
|
264 case DXGI_FORMAT_R8G8B8A8_UNORM: |
|
265 return GL_RGBA8_OES; |
|
266 case DXGI_FORMAT_A8_UNORM: |
|
267 return GL_ALPHA8_EXT; |
|
268 case DXGI_FORMAT_BC1_UNORM: |
|
269 return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; |
|
270 case DXGI_FORMAT_BC2_UNORM: |
|
271 return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE; |
|
272 case DXGI_FORMAT_BC3_UNORM: |
|
273 return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE; |
|
274 case DXGI_FORMAT_R32G32B32A32_FLOAT: |
|
275 return GL_RGBA32F_EXT; |
|
276 case DXGI_FORMAT_R32G32B32_FLOAT: |
|
277 return GL_RGB32F_EXT; |
|
278 case DXGI_FORMAT_R16G16B16A16_FLOAT: |
|
279 return GL_RGBA16F_EXT; |
|
280 case DXGI_FORMAT_B8G8R8A8_UNORM: |
|
281 return GL_BGRA8_EXT; |
|
282 case DXGI_FORMAT_R8_UNORM: |
|
283 return GL_R8_EXT; |
|
284 case DXGI_FORMAT_R8G8_UNORM: |
|
285 return GL_RG8_EXT; |
|
286 case DXGI_FORMAT_R16_FLOAT: |
|
287 return GL_R16F_EXT; |
|
288 case DXGI_FORMAT_R16G16_FLOAT: |
|
289 return GL_RG16F_EXT; |
|
290 case DXGI_FORMAT_D16_UNORM: |
|
291 return GL_DEPTH_COMPONENT16; |
|
292 case DXGI_FORMAT_D24_UNORM_S8_UINT: |
|
293 return GL_DEPTH24_STENCIL8_OES; |
|
294 case DXGI_FORMAT_UNKNOWN: |
|
295 return GL_NONE; |
|
296 default: |
|
297 UNREACHABLE(); |
|
298 } |
|
299 |
|
300 return GL_RGBA8_OES; |
|
301 } |
|
302 |
|
303 } |
|
304 |
|
305 namespace gl_d3d11 |
|
306 { |
|
307 |
|
308 DXGI_FORMAT ConvertRenderbufferFormat(GLenum format) |
|
309 { |
|
310 switch (format) |
|
311 { |
|
312 case GL_RGBA4: |
|
313 case GL_RGB5_A1: |
|
314 case GL_RGBA8_OES: |
|
315 case GL_RGB565: |
|
316 case GL_RGB8_OES: |
|
317 return DXGI_FORMAT_R8G8B8A8_UNORM; |
|
318 case GL_BGRA8_EXT: |
|
319 return DXGI_FORMAT_B8G8R8A8_UNORM; |
|
320 case GL_DEPTH_COMPONENT16: |
|
321 return DXGI_FORMAT_D16_UNORM; |
|
322 case GL_STENCIL_INDEX8: |
|
323 case GL_DEPTH24_STENCIL8_OES: |
|
324 return DXGI_FORMAT_D24_UNORM_S8_UINT; |
|
325 default: |
|
326 UNREACHABLE(); |
|
327 } |
|
328 |
|
329 return DXGI_FORMAT_R8G8B8A8_UNORM; |
|
330 } |
|
331 |
|
332 DXGI_FORMAT ConvertTextureFormat(GLenum internalformat) |
|
333 { |
|
334 switch (internalformat) |
|
335 { |
|
336 case GL_RGB565: |
|
337 case GL_RGBA4: |
|
338 case GL_RGB5_A1: |
|
339 case GL_RGB8_OES: |
|
340 case GL_RGBA8_OES: |
|
341 case GL_LUMINANCE8_EXT: |
|
342 case GL_LUMINANCE8_ALPHA8_EXT: |
|
343 return DXGI_FORMAT_R8G8B8A8_UNORM; |
|
344 case GL_ALPHA8_EXT: |
|
345 return DXGI_FORMAT_A8_UNORM; |
|
346 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: |
|
347 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: |
|
348 return DXGI_FORMAT_BC1_UNORM; |
|
349 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: |
|
350 return DXGI_FORMAT_BC2_UNORM; |
|
351 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: |
|
352 return DXGI_FORMAT_BC3_UNORM; |
|
353 case GL_RGBA32F_EXT: |
|
354 case GL_ALPHA32F_EXT: |
|
355 case GL_LUMINANCE_ALPHA32F_EXT: |
|
356 return DXGI_FORMAT_R32G32B32A32_FLOAT; |
|
357 case GL_RGB32F_EXT: |
|
358 case GL_LUMINANCE32F_EXT: |
|
359 return DXGI_FORMAT_R32G32B32A32_FLOAT; |
|
360 case GL_RGBA16F_EXT: |
|
361 case GL_ALPHA16F_EXT: |
|
362 case GL_LUMINANCE_ALPHA16F_EXT: |
|
363 case GL_RGB16F_EXT: |
|
364 case GL_LUMINANCE16F_EXT: |
|
365 return DXGI_FORMAT_R16G16B16A16_FLOAT; |
|
366 case GL_BGRA8_EXT: |
|
367 return DXGI_FORMAT_B8G8R8A8_UNORM; |
|
368 case GL_R8_EXT: |
|
369 return DXGI_FORMAT_R8_UNORM; |
|
370 case GL_RG8_EXT: |
|
371 return DXGI_FORMAT_R8G8_UNORM; |
|
372 case GL_R16F_EXT: |
|
373 return DXGI_FORMAT_R16_FLOAT; |
|
374 case GL_RG16F_EXT: |
|
375 return DXGI_FORMAT_R16G16_FLOAT; |
|
376 case GL_DEPTH_COMPONENT16: |
|
377 return DXGI_FORMAT_D16_UNORM; |
|
378 case GL_DEPTH_COMPONENT32_OES: |
|
379 case GL_DEPTH24_STENCIL8_OES: |
|
380 return DXGI_FORMAT_D24_UNORM_S8_UINT; |
|
381 case GL_NONE: |
|
382 return DXGI_FORMAT_UNKNOWN; |
|
383 default: |
|
384 UNREACHABLE(); |
|
385 } |
|
386 |
|
387 return DXGI_FORMAT_R8G8B8A8_UNORM; |
|
388 } |
|
389 |
|
390 } |
|
391 |
|
392 namespace d3d11 |
|
393 { |
|
394 |
|
395 void SetPositionTexCoordVertex(PositionTexCoordVertex* vertex, float x, float y, float u, float v) |
|
396 { |
|
397 vertex->x = x; |
|
398 vertex->y = y; |
|
399 vertex->u = u; |
|
400 vertex->v = v; |
|
401 } |
|
402 |
|
403 void SetPositionDepthColorVertex(PositionDepthColorVertex* vertex, float x, float y, float z, |
|
404 const gl::Color &color) |
|
405 { |
|
406 vertex->x = x; |
|
407 vertex->y = y; |
|
408 vertex->z = z; |
|
409 vertex->r = color.red; |
|
410 vertex->g = color.green; |
|
411 vertex->b = color.blue; |
|
412 vertex->a = color.alpha; |
|
413 } |
|
414 |
|
415 size_t ComputePixelSizeBits(DXGI_FORMAT format) |
|
416 { |
|
417 switch (format) |
|
418 { |
|
419 case DXGI_FORMAT_R1_UNORM: |
|
420 return 1; |
|
421 |
|
422 case DXGI_FORMAT_A8_UNORM: |
|
423 case DXGI_FORMAT_R8_SINT: |
|
424 case DXGI_FORMAT_R8_SNORM: |
|
425 case DXGI_FORMAT_R8_TYPELESS: |
|
426 case DXGI_FORMAT_R8_UINT: |
|
427 case DXGI_FORMAT_R8_UNORM: |
|
428 return 8; |
|
429 |
|
430 case DXGI_FORMAT_B5G5R5A1_UNORM: |
|
431 case DXGI_FORMAT_B5G6R5_UNORM: |
|
432 case DXGI_FORMAT_D16_UNORM: |
|
433 case DXGI_FORMAT_R16_FLOAT: |
|
434 case DXGI_FORMAT_R16_SINT: |
|
435 case DXGI_FORMAT_R16_SNORM: |
|
436 case DXGI_FORMAT_R16_TYPELESS: |
|
437 case DXGI_FORMAT_R16_UINT: |
|
438 case DXGI_FORMAT_R16_UNORM: |
|
439 case DXGI_FORMAT_R8G8_SINT: |
|
440 case DXGI_FORMAT_R8G8_SNORM: |
|
441 case DXGI_FORMAT_R8G8_TYPELESS: |
|
442 case DXGI_FORMAT_R8G8_UINT: |
|
443 case DXGI_FORMAT_R8G8_UNORM: |
|
444 return 16; |
|
445 |
|
446 case DXGI_FORMAT_B8G8R8X8_TYPELESS: |
|
447 case DXGI_FORMAT_B8G8R8X8_UNORM: |
|
448 case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: |
|
449 case DXGI_FORMAT_D24_UNORM_S8_UINT: |
|
450 case DXGI_FORMAT_D32_FLOAT: |
|
451 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: |
|
452 case DXGI_FORMAT_G8R8_G8B8_UNORM: |
|
453 case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: |
|
454 case DXGI_FORMAT_R10G10B10A2_TYPELESS: |
|
455 case DXGI_FORMAT_R10G10B10A2_UINT: |
|
456 case DXGI_FORMAT_R10G10B10A2_UNORM: |
|
457 case DXGI_FORMAT_R11G11B10_FLOAT: |
|
458 case DXGI_FORMAT_R16G16_FLOAT: |
|
459 case DXGI_FORMAT_R16G16_SINT: |
|
460 case DXGI_FORMAT_R16G16_SNORM: |
|
461 case DXGI_FORMAT_R16G16_TYPELESS: |
|
462 case DXGI_FORMAT_R16G16_UINT: |
|
463 case DXGI_FORMAT_R16G16_UNORM: |
|
464 case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: |
|
465 case DXGI_FORMAT_R24G8_TYPELESS: |
|
466 case DXGI_FORMAT_R32_FLOAT: |
|
467 case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: |
|
468 case DXGI_FORMAT_R32_SINT: |
|
469 case DXGI_FORMAT_R32_TYPELESS: |
|
470 case DXGI_FORMAT_R32_UINT: |
|
471 case DXGI_FORMAT_R8G8_B8G8_UNORM: |
|
472 case DXGI_FORMAT_R8G8B8A8_SINT: |
|
473 case DXGI_FORMAT_R8G8B8A8_SNORM: |
|
474 case DXGI_FORMAT_R8G8B8A8_TYPELESS: |
|
475 case DXGI_FORMAT_R8G8B8A8_UINT: |
|
476 case DXGI_FORMAT_R8G8B8A8_UNORM: |
|
477 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: |
|
478 case DXGI_FORMAT_B8G8R8A8_TYPELESS: |
|
479 case DXGI_FORMAT_B8G8R8A8_UNORM: |
|
480 case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: |
|
481 case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: |
|
482 case DXGI_FORMAT_X24_TYPELESS_G8_UINT: |
|
483 case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: |
|
484 return 32; |
|
485 |
|
486 case DXGI_FORMAT_R16G16B16A16_FLOAT: |
|
487 case DXGI_FORMAT_R16G16B16A16_SINT: |
|
488 case DXGI_FORMAT_R16G16B16A16_SNORM: |
|
489 case DXGI_FORMAT_R16G16B16A16_TYPELESS: |
|
490 case DXGI_FORMAT_R16G16B16A16_UINT: |
|
491 case DXGI_FORMAT_R16G16B16A16_UNORM: |
|
492 case DXGI_FORMAT_R32G32_FLOAT: |
|
493 case DXGI_FORMAT_R32G32_SINT: |
|
494 case DXGI_FORMAT_R32G32_TYPELESS: |
|
495 case DXGI_FORMAT_R32G32_UINT: |
|
496 case DXGI_FORMAT_R32G8X24_TYPELESS: |
|
497 return 64; |
|
498 |
|
499 case DXGI_FORMAT_R32G32B32_FLOAT: |
|
500 case DXGI_FORMAT_R32G32B32_SINT: |
|
501 case DXGI_FORMAT_R32G32B32_TYPELESS: |
|
502 case DXGI_FORMAT_R32G32B32_UINT: |
|
503 return 96; |
|
504 |
|
505 case DXGI_FORMAT_R32G32B32A32_FLOAT: |
|
506 case DXGI_FORMAT_R32G32B32A32_SINT: |
|
507 case DXGI_FORMAT_R32G32B32A32_TYPELESS: |
|
508 case DXGI_FORMAT_R32G32B32A32_UINT: |
|
509 return 128; |
|
510 |
|
511 case DXGI_FORMAT_BC1_TYPELESS: |
|
512 case DXGI_FORMAT_BC1_UNORM: |
|
513 case DXGI_FORMAT_BC1_UNORM_SRGB: |
|
514 case DXGI_FORMAT_BC4_SNORM: |
|
515 case DXGI_FORMAT_BC4_TYPELESS: |
|
516 case DXGI_FORMAT_BC4_UNORM: |
|
517 return 4; |
|
518 |
|
519 case DXGI_FORMAT_BC2_TYPELESS: |
|
520 case DXGI_FORMAT_BC2_UNORM: |
|
521 case DXGI_FORMAT_BC2_UNORM_SRGB: |
|
522 case DXGI_FORMAT_BC3_TYPELESS: |
|
523 case DXGI_FORMAT_BC3_UNORM: |
|
524 case DXGI_FORMAT_BC3_UNORM_SRGB: |
|
525 case DXGI_FORMAT_BC5_SNORM: |
|
526 case DXGI_FORMAT_BC5_TYPELESS: |
|
527 case DXGI_FORMAT_BC5_UNORM: |
|
528 case DXGI_FORMAT_BC6H_SF16: |
|
529 case DXGI_FORMAT_BC6H_TYPELESS: |
|
530 case DXGI_FORMAT_BC6H_UF16: |
|
531 case DXGI_FORMAT_BC7_TYPELESS: |
|
532 case DXGI_FORMAT_BC7_UNORM: |
|
533 case DXGI_FORMAT_BC7_UNORM_SRGB: |
|
534 return 8; |
|
535 |
|
536 default: |
|
537 return 0; |
|
538 } |
|
539 } |
|
540 |
|
541 size_t ComputeBlockSizeBits(DXGI_FORMAT format) |
|
542 { |
|
543 switch (format) |
|
544 { |
|
545 case DXGI_FORMAT_BC1_TYPELESS: |
|
546 case DXGI_FORMAT_BC1_UNORM: |
|
547 case DXGI_FORMAT_BC1_UNORM_SRGB: |
|
548 case DXGI_FORMAT_BC4_SNORM: |
|
549 case DXGI_FORMAT_BC4_TYPELESS: |
|
550 case DXGI_FORMAT_BC4_UNORM: |
|
551 case DXGI_FORMAT_BC2_TYPELESS: |
|
552 case DXGI_FORMAT_BC2_UNORM: |
|
553 case DXGI_FORMAT_BC2_UNORM_SRGB: |
|
554 case DXGI_FORMAT_BC3_TYPELESS: |
|
555 case DXGI_FORMAT_BC3_UNORM: |
|
556 case DXGI_FORMAT_BC3_UNORM_SRGB: |
|
557 case DXGI_FORMAT_BC5_SNORM: |
|
558 case DXGI_FORMAT_BC5_TYPELESS: |
|
559 case DXGI_FORMAT_BC5_UNORM: |
|
560 case DXGI_FORMAT_BC6H_SF16: |
|
561 case DXGI_FORMAT_BC6H_TYPELESS: |
|
562 case DXGI_FORMAT_BC6H_UF16: |
|
563 case DXGI_FORMAT_BC7_TYPELESS: |
|
564 case DXGI_FORMAT_BC7_UNORM: |
|
565 case DXGI_FORMAT_BC7_UNORM_SRGB: |
|
566 return ComputePixelSizeBits(format) * 16; |
|
567 default: |
|
568 UNREACHABLE(); |
|
569 return 0; |
|
570 } |
|
571 } |
|
572 |
|
573 bool IsCompressed(DXGI_FORMAT format) |
|
574 { |
|
575 switch (format) |
|
576 { |
|
577 case DXGI_FORMAT_BC1_TYPELESS: |
|
578 case DXGI_FORMAT_BC1_UNORM: |
|
579 case DXGI_FORMAT_BC1_UNORM_SRGB: |
|
580 case DXGI_FORMAT_BC4_SNORM: |
|
581 case DXGI_FORMAT_BC4_TYPELESS: |
|
582 case DXGI_FORMAT_BC4_UNORM: |
|
583 case DXGI_FORMAT_BC2_TYPELESS: |
|
584 case DXGI_FORMAT_BC2_UNORM: |
|
585 case DXGI_FORMAT_BC2_UNORM_SRGB: |
|
586 case DXGI_FORMAT_BC3_TYPELESS: |
|
587 case DXGI_FORMAT_BC3_UNORM: |
|
588 case DXGI_FORMAT_BC3_UNORM_SRGB: |
|
589 case DXGI_FORMAT_BC5_SNORM: |
|
590 case DXGI_FORMAT_BC5_TYPELESS: |
|
591 case DXGI_FORMAT_BC5_UNORM: |
|
592 case DXGI_FORMAT_BC6H_SF16: |
|
593 case DXGI_FORMAT_BC6H_TYPELESS: |
|
594 case DXGI_FORMAT_BC6H_UF16: |
|
595 case DXGI_FORMAT_BC7_TYPELESS: |
|
596 case DXGI_FORMAT_BC7_UNORM: |
|
597 case DXGI_FORMAT_BC7_UNORM_SRGB: |
|
598 return true; |
|
599 case DXGI_FORMAT_UNKNOWN: |
|
600 UNREACHABLE(); |
|
601 return false; |
|
602 default: |
|
603 return false; |
|
604 } |
|
605 } |
|
606 |
|
607 unsigned int GetTextureFormatDimensionAlignment(DXGI_FORMAT format) |
|
608 { |
|
609 switch (format) |
|
610 { |
|
611 case DXGI_FORMAT_BC1_TYPELESS: |
|
612 case DXGI_FORMAT_BC1_UNORM: |
|
613 case DXGI_FORMAT_BC1_UNORM_SRGB: |
|
614 case DXGI_FORMAT_BC4_SNORM: |
|
615 case DXGI_FORMAT_BC4_TYPELESS: |
|
616 case DXGI_FORMAT_BC4_UNORM: |
|
617 case DXGI_FORMAT_BC2_TYPELESS: |
|
618 case DXGI_FORMAT_BC2_UNORM: |
|
619 case DXGI_FORMAT_BC2_UNORM_SRGB: |
|
620 case DXGI_FORMAT_BC3_TYPELESS: |
|
621 case DXGI_FORMAT_BC3_UNORM: |
|
622 case DXGI_FORMAT_BC3_UNORM_SRGB: |
|
623 case DXGI_FORMAT_BC5_SNORM: |
|
624 case DXGI_FORMAT_BC5_TYPELESS: |
|
625 case DXGI_FORMAT_BC5_UNORM: |
|
626 case DXGI_FORMAT_BC6H_SF16: |
|
627 case DXGI_FORMAT_BC6H_TYPELESS: |
|
628 case DXGI_FORMAT_BC6H_UF16: |
|
629 case DXGI_FORMAT_BC7_TYPELESS: |
|
630 case DXGI_FORMAT_BC7_UNORM: |
|
631 case DXGI_FORMAT_BC7_UNORM_SRGB: |
|
632 return 4; |
|
633 case DXGI_FORMAT_UNKNOWN: |
|
634 UNREACHABLE(); |
|
635 return 1; |
|
636 default: |
|
637 return 1; |
|
638 } |
|
639 } |
|
640 |
|
641 bool IsDepthStencilFormat(DXGI_FORMAT format) |
|
642 { |
|
643 switch (format) |
|
644 { |
|
645 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: |
|
646 case DXGI_FORMAT_D32_FLOAT: |
|
647 case DXGI_FORMAT_D24_UNORM_S8_UINT: |
|
648 case DXGI_FORMAT_D16_UNORM: |
|
649 return true; |
|
650 default: |
|
651 return false; |
|
652 } |
|
653 } |
|
654 |
|
655 DXGI_FORMAT GetDepthTextureFormat(DXGI_FORMAT format) |
|
656 { |
|
657 switch (format) |
|
658 { |
|
659 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: return DXGI_FORMAT_R32G8X24_TYPELESS; |
|
660 case DXGI_FORMAT_D32_FLOAT: return DXGI_FORMAT_R32_TYPELESS; |
|
661 case DXGI_FORMAT_D24_UNORM_S8_UINT: return DXGI_FORMAT_R24G8_TYPELESS; |
|
662 case DXGI_FORMAT_D16_UNORM: return DXGI_FORMAT_R16_TYPELESS; |
|
663 default: UNREACHABLE(); return DXGI_FORMAT_UNKNOWN; |
|
664 } |
|
665 } |
|
666 |
|
667 DXGI_FORMAT GetDepthShaderResourceFormat(DXGI_FORMAT format) |
|
668 { |
|
669 switch (format) |
|
670 { |
|
671 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: return DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS; |
|
672 case DXGI_FORMAT_D32_FLOAT: return DXGI_FORMAT_R32_UINT; |
|
673 case DXGI_FORMAT_D24_UNORM_S8_UINT: return DXGI_FORMAT_R24_UNORM_X8_TYPELESS; |
|
674 case DXGI_FORMAT_D16_UNORM: return DXGI_FORMAT_R16_UNORM; |
|
675 default: UNREACHABLE(); return DXGI_FORMAT_UNKNOWN; |
|
676 } |
|
677 } |
|
678 |
|
679 HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name) |
|
680 { |
|
681 #if defined(_DEBUG) |
|
682 return resource->SetPrivateData(WKPDID_D3DDebugObjectName, strlen(name), name); |
|
683 #else |
|
684 return S_OK; |
|
685 #endif |
|
686 } |
|
687 |
|
688 } |