Sat, 03 Jan 2015 20:18:00 +0100
Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.
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 //
8 // renderer11_utils.cpp: Conversion functions and other utility routines
9 // specific to the D3D11 renderer.
11 #include "libGLESv2/renderer/renderer11_utils.h"
13 #include "common/debug.h"
15 namespace gl_d3d11
16 {
18 D3D11_BLEND ConvertBlendFunc(GLenum glBlend, bool isAlpha)
19 {
20 D3D11_BLEND d3dBlend = D3D11_BLEND_ZERO;
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 }
42 return d3dBlend;
43 }
45 D3D11_BLEND_OP ConvertBlendOp(GLenum glBlendOp)
46 {
47 D3D11_BLEND_OP d3dBlendOp = D3D11_BLEND_OP_ADD;
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 }
57 return d3dBlendOp;
58 }
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 }
82 D3D11_CULL_MODE ConvertCullMode(bool cullEnabled, GLenum cullMode)
83 {
84 D3D11_CULL_MODE cull = D3D11_CULL_NONE;
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 }
101 return cull;
102 }
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 }
120 return d3dComp;
121 }
123 D3D11_DEPTH_WRITE_MASK ConvertDepthMask(bool depthWriteEnabled)
124 {
125 return depthWriteEnabled ? D3D11_DEPTH_WRITE_MASK_ALL : D3D11_DEPTH_WRITE_MASK_ZERO;
126 }
128 UINT8 ConvertStencilMask(GLuint stencilmask)
129 {
130 return static_cast<UINT8>(stencilmask);
131 }
133 D3D11_STENCIL_OP ConvertStencilOp(GLenum stencilOp)
134 {
135 D3D11_STENCIL_OP d3dStencilOp = D3D11_STENCIL_OP_KEEP;
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 }
150 return d3dStencilOp;
151 }
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 }
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 }
182 return D3D11_ENCODE_BASIC_FILTER(dxMin, dxMag, dxMip, false);
183 }
184 }
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 }
196 return D3D11_TEXTURE_ADDRESS_WRAP;
197 }
199 FLOAT ConvertMinLOD(GLenum minFilter, unsigned int lodOffset)
200 {
201 return (minFilter == GL_NEAREST || minFilter == GL_LINEAR) ? static_cast<float>(lodOffset) : -FLT_MAX;
202 }
204 FLOAT ConvertMaxLOD(GLenum minFilter, unsigned int lodOffset)
205 {
206 return (minFilter == GL_NEAREST || minFilter == GL_LINEAR) ? static_cast<float>(lodOffset) : FLT_MAX;
207 }
209 }
211 namespace d3d11_gl
212 {
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 }
224 return GL_RGBA8_OES;
225 }
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 }
238 return GL_DEPTH24_STENCIL8_OES;
239 }
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 }
257 return GL_RGBA8_OES;
258 }
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 }
300 return GL_RGBA8_OES;
301 }
303 }
305 namespace gl_d3d11
306 {
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 }
329 return DXGI_FORMAT_R8G8B8A8_UNORM;
330 }
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 }
387 return DXGI_FORMAT_R8G8B8A8_UNORM;
388 }
390 }
392 namespace d3d11
393 {
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 }
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 }
415 size_t ComputePixelSizeBits(DXGI_FORMAT format)
416 {
417 switch (format)
418 {
419 case DXGI_FORMAT_R1_UNORM:
420 return 1;
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;
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;
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;
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;
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;
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;
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;
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;
536 default:
537 return 0;
538 }
539 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
688 }