blob: 33073d1e31ac580b13abcbac1e20fa82bbfd27bb [file] [log] [blame]
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +00001//
2// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// renderer11_utils.cpp: Conversion functions and other utility routines
8// specific to the D3D11 renderer.
9
10#include "libGLESv2/renderer/renderer11_utils.h"
11
12#include "common/debug.h"
13
daniel@transgaming.com3d34a8a2013-01-11 04:07:48 +000014#include <float.h>
15
daniel@transgaming.com6b147712012-11-28 19:37:24 +000016namespace gl_d3d11
17{
18
daniel@transgaming.com90c634a2013-01-11 04:10:01 +000019D3D11_BLEND ConvertBlendFunc(GLenum glBlend, bool isAlpha)
daniel@transgaming.com6b147712012-11-28 19:37:24 +000020{
21 D3D11_BLEND d3dBlend = D3D11_BLEND_ZERO;
22
23 switch (glBlend)
24 {
25 case GL_ZERO: d3dBlend = D3D11_BLEND_ZERO; break;
26 case GL_ONE: d3dBlend = D3D11_BLEND_ONE; break;
daniel@transgaming.com90c634a2013-01-11 04:10:01 +000027 case GL_SRC_COLOR: d3dBlend = (isAlpha ? D3D11_BLEND_SRC_ALPHA : D3D11_BLEND_SRC_COLOR); break;
28 case GL_ONE_MINUS_SRC_COLOR: d3dBlend = (isAlpha ? D3D11_BLEND_INV_SRC_ALPHA : D3D11_BLEND_INV_SRC_COLOR); break;
29 case GL_DST_COLOR: d3dBlend = (isAlpha ? D3D11_BLEND_DEST_ALPHA : D3D11_BLEND_DEST_COLOR); break;
30 case GL_ONE_MINUS_DST_COLOR: d3dBlend = (isAlpha ? D3D11_BLEND_INV_DEST_ALPHA : D3D11_BLEND_INV_DEST_COLOR); break;
daniel@transgaming.com6b147712012-11-28 19:37:24 +000031 case GL_SRC_ALPHA: d3dBlend = D3D11_BLEND_SRC_ALPHA; break;
32 case GL_ONE_MINUS_SRC_ALPHA: d3dBlend = D3D11_BLEND_INV_SRC_ALPHA; break;
33 case GL_DST_ALPHA: d3dBlend = D3D11_BLEND_DEST_ALPHA; break;
34 case GL_ONE_MINUS_DST_ALPHA: d3dBlend = D3D11_BLEND_INV_DEST_ALPHA; break;
35 case GL_CONSTANT_COLOR: d3dBlend = D3D11_BLEND_BLEND_FACTOR; break;
36 case GL_ONE_MINUS_CONSTANT_COLOR: d3dBlend = D3D11_BLEND_INV_BLEND_FACTOR; break;
37 case GL_CONSTANT_ALPHA: d3dBlend = D3D11_BLEND_BLEND_FACTOR; break;
38 case GL_ONE_MINUS_CONSTANT_ALPHA: d3dBlend = D3D11_BLEND_INV_BLEND_FACTOR; break;
39 case GL_SRC_ALPHA_SATURATE: d3dBlend = D3D11_BLEND_SRC_ALPHA_SAT; break;
40 default: UNREACHABLE();
41 }
42
43 return d3dBlend;
44}
45
46D3D11_BLEND_OP ConvertBlendOp(GLenum glBlendOp)
47{
48 D3D11_BLEND_OP d3dBlendOp = D3D11_BLEND_OP_ADD;
49
50 switch (glBlendOp)
51 {
52 case GL_FUNC_ADD: d3dBlendOp = D3D11_BLEND_OP_ADD; break;
53 case GL_FUNC_SUBTRACT: d3dBlendOp = D3D11_BLEND_OP_SUBTRACT; break;
54 case GL_FUNC_REVERSE_SUBTRACT: d3dBlendOp = D3D11_BLEND_OP_REV_SUBTRACT; break;
55 default: UNREACHABLE();
56 }
57
58 return d3dBlendOp;
59}
60
61UINT8 ConvertColorMask(bool red, bool green, bool blue, bool alpha)
62{
63 UINT8 mask = 0;
64 if (red)
65 {
66 mask |= D3D11_COLOR_WRITE_ENABLE_RED;
67 }
68 if (green)
69 {
70 mask |= D3D11_COLOR_WRITE_ENABLE_GREEN;
71 }
72 if (blue)
73 {
74 mask |= D3D11_COLOR_WRITE_ENABLE_BLUE;
75 }
76 if (alpha)
77 {
78 mask |= D3D11_COLOR_WRITE_ENABLE_ALPHA;
79 }
80 return mask;
81}
82
daniel@transgaming.comfa34b342012-11-28 19:38:01 +000083D3D11_CULL_MODE ConvertCullMode(bool cullEnabled, GLenum cullMode)
84{
85 D3D11_CULL_MODE cull = D3D11_CULL_NONE;
86
87 if (cullEnabled)
88 {
89 switch (cullMode)
90 {
91 case GL_FRONT: cull = D3D11_CULL_FRONT; break;
92 case GL_BACK: cull = D3D11_CULL_BACK; break;
93 case GL_FRONT_AND_BACK: cull = D3D11_CULL_NONE; break;
94 default: UNREACHABLE();
95 }
96 }
97 else
98 {
99 cull = D3D11_CULL_NONE;
100 }
101
102 return cull;
103}
104
daniel@transgaming.comc820c122012-11-28 19:38:30 +0000105D3D11_COMPARISON_FUNC ConvertComparison(GLenum comparison)
106{
107 D3D11_COMPARISON_FUNC d3dComp = D3D11_COMPARISON_NEVER;
108 switch (comparison)
109 {
110 case GL_NEVER: d3dComp = D3D11_COMPARISON_NEVER; break;
111 case GL_ALWAYS: d3dComp = D3D11_COMPARISON_ALWAYS; break;
112 case GL_LESS: d3dComp = D3D11_COMPARISON_LESS; break;
113 case GL_LEQUAL: d3dComp = D3D11_COMPARISON_LESS_EQUAL; break;
114 case GL_EQUAL: d3dComp = D3D11_COMPARISON_EQUAL; break;
115 case GL_GREATER: d3dComp = D3D11_COMPARISON_GREATER; break;
116 case GL_GEQUAL: d3dComp = D3D11_COMPARISON_GREATER_EQUAL; break;
117 case GL_NOTEQUAL: d3dComp = D3D11_COMPARISON_NOT_EQUAL; break;
118 default: UNREACHABLE();
119 }
120
121 return d3dComp;
122}
123
124D3D11_DEPTH_WRITE_MASK ConvertDepthMask(bool depthWriteEnabled)
125{
126 return depthWriteEnabled ? D3D11_DEPTH_WRITE_MASK_ALL : D3D11_DEPTH_WRITE_MASK_ZERO;
127}
128
129UINT8 ConvertStencilMask(GLuint stencilmask)
130{
131 return static_cast<UINT8>(stencilmask);
132}
133
134D3D11_STENCIL_OP ConvertStencilOp(GLenum stencilOp)
135{
136 D3D11_STENCIL_OP d3dStencilOp = D3D11_STENCIL_OP_KEEP;
137
138 switch (stencilOp)
139 {
140 case GL_ZERO: d3dStencilOp = D3D11_STENCIL_OP_ZERO; break;
141 case GL_KEEP: d3dStencilOp = D3D11_STENCIL_OP_KEEP; break;
142 case GL_REPLACE: d3dStencilOp = D3D11_STENCIL_OP_REPLACE; break;
143 case GL_INCR: d3dStencilOp = D3D11_STENCIL_OP_INCR_SAT; break;
144 case GL_DECR: d3dStencilOp = D3D11_STENCIL_OP_DECR_SAT; break;
145 case GL_INVERT: d3dStencilOp = D3D11_STENCIL_OP_INVERT; break;
146 case GL_INCR_WRAP: d3dStencilOp = D3D11_STENCIL_OP_INCR; break;
147 case GL_DECR_WRAP: d3dStencilOp = D3D11_STENCIL_OP_DECR; break;
148 default: UNREACHABLE();
149 }
150
151 return d3dStencilOp;
152}
153
daniel@transgaming.com3d34a8a2013-01-11 04:07:48 +0000154D3D11_FILTER ConvertFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy)
155{
156 if (maxAnisotropy > 1.0f)
157 {
158 return D3D11_ENCODE_ANISOTROPIC_FILTER(false);
159 }
160 else
161 {
162 D3D11_FILTER_TYPE dxMin = D3D11_FILTER_TYPE_POINT;
163 D3D11_FILTER_TYPE dxMip = D3D11_FILTER_TYPE_POINT;
164 switch (minFilter)
165 {
166 case GL_NEAREST: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_POINT; break;
167 case GL_LINEAR: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_POINT; break;
168 case GL_NEAREST_MIPMAP_NEAREST: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_POINT; break;
169 case GL_LINEAR_MIPMAP_NEAREST: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_POINT; break;
170 case GL_NEAREST_MIPMAP_LINEAR: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_LINEAR; break;
171 case GL_LINEAR_MIPMAP_LINEAR: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_LINEAR; break;
172 default: UNREACHABLE();
173 }
174
175 D3D11_FILTER_TYPE dxMag = D3D11_FILTER_TYPE_POINT;
176 switch (magFilter)
177 {
178 case GL_NEAREST: dxMag = D3D11_FILTER_TYPE_POINT; break;
179 case GL_LINEAR: dxMag = D3D11_FILTER_TYPE_LINEAR; break;
180 default: UNREACHABLE();
181 }
182
183 return D3D11_ENCODE_BASIC_FILTER(dxMin, dxMag, dxMip, false);
184 }
185}
186
187D3D11_TEXTURE_ADDRESS_MODE ConvertTextureWrap(GLenum wrap)
188{
189 switch (wrap)
190 {
191 case GL_REPEAT: return D3D11_TEXTURE_ADDRESS_WRAP;
192 case GL_CLAMP_TO_EDGE: return D3D11_TEXTURE_ADDRESS_CLAMP;
193 case GL_MIRRORED_REPEAT: return D3D11_TEXTURE_ADDRESS_MIRROR;
194 default: UNREACHABLE();
195 }
196
197 return D3D11_TEXTURE_ADDRESS_WRAP;
198}
199
200FLOAT ConvertMinLOD(GLenum minFilter)
201{
202 return (minFilter == GL_NEAREST || minFilter == GL_LINEAR) ? 0.0f : -FLT_MAX;
203}
204
205FLOAT ConvertMaxLOD(GLenum minFilter)
206{
207 return (minFilter == GL_NEAREST || minFilter == GL_LINEAR) ? 0.0f : FLT_MAX;
208}
209
daniel@transgaming.com6b147712012-11-28 19:37:24 +0000210}
211
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000212namespace d3d11_gl
213{
214
215GLenum ConvertBackBufferFormat(DXGI_FORMAT format)
216{
217 switch (format)
218 {
219 case DXGI_FORMAT_R8G8B8A8_UNORM: return GL_RGBA8_OES;
220 default:
221 UNREACHABLE();
222 }
223
224 return GL_RGBA8_OES;
225}
226
227GLenum ConvertDepthStencilFormat(DXGI_FORMAT format)
228{
229 switch (format)
230 {
231 case DXGI_FORMAT_D24_UNORM_S8_UINT: return GL_DEPTH24_STENCIL8_OES;
232 default:
233 UNREACHABLE();
234 }
235
236 return GL_DEPTH24_STENCIL8_OES;
237}
238
239GLenum ConvertRenderbufferFormat(DXGI_FORMAT format)
240{
241 switch (format)
242 {
243 case DXGI_FORMAT_R8G8B8A8_UNORM:
244 return GL_RGBA8_OES;
245 case DXGI_FORMAT_D24_UNORM_S8_UINT:
246 return GL_DEPTH24_STENCIL8_OES;
247 default:
248 UNREACHABLE();
249 }
250
251 return GL_RGBA8_OES;
252}
253
254GLenum ConvertTextureInternalFormat(DXGI_FORMAT format)
255{
256 switch (format)
257 {
258 case DXGI_FORMAT_R8G8B8A8_UNORM:
259 return GL_RGBA8_OES;
260 case DXGI_FORMAT_A8_UNORM:
261 return GL_ALPHA8_EXT;
262 case DXGI_FORMAT_BC1_UNORM:
263 return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
264 case DXGI_FORMAT_BC2_UNORM:
265 return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
266 case DXGI_FORMAT_BC3_UNORM:
267 return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
268 case DXGI_FORMAT_R32G32B32A32_FLOAT:
269 return GL_RGBA32F_EXT;
270 case DXGI_FORMAT_R32G32B32_FLOAT:
271 return GL_RGB32F_EXT;
272 case DXGI_FORMAT_R16G16B16A16_FLOAT:
273 return GL_RGBA16F_EXT;
274 case DXGI_FORMAT_B8G8R8A8_UNORM:
275 return GL_BGRA8_EXT;
276 case DXGI_FORMAT_R8_UNORM:
277 return GL_R8_EXT;
278 case DXGI_FORMAT_R8G8_UNORM:
279 return GL_RG8_EXT;
280 case DXGI_FORMAT_R16_FLOAT:
281 return GL_R16F_EXT;
282 case DXGI_FORMAT_R16G16_FLOAT:
283 return GL_RG16F_EXT;
284 case DXGI_FORMAT_D24_UNORM_S8_UINT:
285 return GL_DEPTH24_STENCIL8_OES;
286 default:
287 UNREACHABLE();
288 }
289
290 return GL_RGBA8_OES;
291}
292
293}
294
295namespace gl_d3d11
296{
297
298DXGI_FORMAT ConvertRenderbufferFormat(GLenum format)
299{
300 switch (format)
301 {
302 case GL_RGBA4:
303 case GL_RGB5_A1:
304 case GL_RGBA8_OES:
305 case GL_RGB565:
306 case GL_RGB8_OES:
307 return DXGI_FORMAT_R8G8B8A8_UNORM;
308 case GL_DEPTH_COMPONENT16:
309 case GL_STENCIL_INDEX8:
310 case GL_DEPTH24_STENCIL8_OES:
311 return DXGI_FORMAT_D24_UNORM_S8_UINT;
312 default:
313 UNREACHABLE();
314 }
315
316 return DXGI_FORMAT_R8G8B8A8_UNORM;
317}
318
319DXGI_FORMAT ConvertTextureFormat(GLenum internalformat)
320{
321 switch (internalformat)
322 {
323 case GL_RGB565:
324 case GL_RGBA4:
325 case GL_RGB5_A1:
326 case GL_RGB8_OES:
327 case GL_RGBA8_OES:
328 case GL_LUMINANCE8_EXT:
329 case GL_LUMINANCE8_ALPHA8_EXT:
330 return DXGI_FORMAT_R8G8B8A8_UNORM;
331 case GL_ALPHA8_EXT:
332 return DXGI_FORMAT_A8_UNORM;
333 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
334 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
335 return DXGI_FORMAT_BC1_UNORM;
336 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
337 return DXGI_FORMAT_BC2_UNORM;
338 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
339 return DXGI_FORMAT_BC3_UNORM;
340 case GL_RGBA32F_EXT:
341 case GL_ALPHA32F_EXT:
342 case GL_LUMINANCE_ALPHA32F_EXT:
343 return DXGI_FORMAT_R32G32B32A32_FLOAT;
344 case GL_RGB32F_EXT:
345 case GL_LUMINANCE32F_EXT:
346 return DXGI_FORMAT_R32G32B32_FLOAT;
347 case GL_RGBA16F_EXT:
348 case GL_ALPHA16F_EXT:
349 case GL_LUMINANCE_ALPHA16F_EXT:
350 case GL_RGB16F_EXT:
351 case GL_LUMINANCE16F_EXT:
352 return DXGI_FORMAT_R16G16B16A16_FLOAT;
353 case GL_BGRA8_EXT:
354 return DXGI_FORMAT_B8G8R8A8_UNORM;
355 case GL_R8_EXT:
356 return DXGI_FORMAT_R8_UNORM;
357 case GL_RG8_EXT:
358 return DXGI_FORMAT_R8G8_UNORM;
359 case GL_R16F_EXT:
360 return DXGI_FORMAT_R16_FLOAT;
361 case GL_RG16F_EXT:
362 return DXGI_FORMAT_R16G16_FLOAT;
363 case GL_DEPTH_COMPONENT16:
364 case GL_DEPTH_COMPONENT32_OES:
365 case GL_DEPTH24_STENCIL8_OES:
366 return DXGI_FORMAT_D24_UNORM_S8_UINT;
367 default:
368 UNREACHABLE();
369 }
370
371 return DXGI_FORMAT_R8G8B8A8_UNORM;
372}
daniel@transgaming.com3d34a8a2013-01-11 04:07:48 +0000373
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000374}
daniel@transgaming.com8fb65c82012-12-20 21:07:49 +0000375
376namespace d3d11
377{
daniel@transgaming.com3d34a8a2013-01-11 04:07:48 +0000378
daniel@transgaming.com8fb65c82012-12-20 21:07:49 +0000379size_t ComputePixelSizeBits(DXGI_FORMAT format)
380{
381 switch (format)
382 {
383 case DXGI_FORMAT_R1_UNORM:
384 return 1;
385
386 case DXGI_FORMAT_A8_UNORM:
387 case DXGI_FORMAT_R8_SINT:
388 case DXGI_FORMAT_R8_SNORM:
389 case DXGI_FORMAT_R8_TYPELESS:
390 case DXGI_FORMAT_R8_UINT:
391 case DXGI_FORMAT_R8_UNORM:
392 return 8;
393
394 case DXGI_FORMAT_B5G5R5A1_UNORM:
395 case DXGI_FORMAT_B5G6R5_UNORM:
396 case DXGI_FORMAT_D16_UNORM:
397 case DXGI_FORMAT_R16_FLOAT:
398 case DXGI_FORMAT_R16_SINT:
399 case DXGI_FORMAT_R16_SNORM:
400 case DXGI_FORMAT_R16_TYPELESS:
401 case DXGI_FORMAT_R16_UINT:
402 case DXGI_FORMAT_R16_UNORM:
403 case DXGI_FORMAT_R8G8_SINT:
404 case DXGI_FORMAT_R8G8_SNORM:
405 case DXGI_FORMAT_R8G8_TYPELESS:
406 case DXGI_FORMAT_R8G8_UINT:
407 case DXGI_FORMAT_R8G8_UNORM:
408 return 16;
409
410 case DXGI_FORMAT_B8G8R8X8_TYPELESS:
411 case DXGI_FORMAT_B8G8R8X8_UNORM:
412 case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
413 case DXGI_FORMAT_D24_UNORM_S8_UINT:
414 case DXGI_FORMAT_D32_FLOAT:
415 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
416 case DXGI_FORMAT_G8R8_G8B8_UNORM:
417 case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
418 case DXGI_FORMAT_R10G10B10A2_TYPELESS:
419 case DXGI_FORMAT_R10G10B10A2_UINT:
420 case DXGI_FORMAT_R10G10B10A2_UNORM:
421 case DXGI_FORMAT_R11G11B10_FLOAT:
422 case DXGI_FORMAT_R16G16_FLOAT:
423 case DXGI_FORMAT_R16G16_SINT:
424 case DXGI_FORMAT_R16G16_SNORM:
425 case DXGI_FORMAT_R16G16_TYPELESS:
426 case DXGI_FORMAT_R16G16_UINT:
427 case DXGI_FORMAT_R16G16_UNORM:
428 case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
429 case DXGI_FORMAT_R24G8_TYPELESS:
430 case DXGI_FORMAT_R32_FLOAT:
431 case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
432 case DXGI_FORMAT_R32_SINT:
433 case DXGI_FORMAT_R32_TYPELESS:
434 case DXGI_FORMAT_R32_UINT:
435 case DXGI_FORMAT_R8G8_B8G8_UNORM:
436 case DXGI_FORMAT_R8G8B8A8_SINT:
437 case DXGI_FORMAT_R8G8B8A8_SNORM:
438 case DXGI_FORMAT_R8G8B8A8_TYPELESS:
439 case DXGI_FORMAT_R8G8B8A8_UINT:
440 case DXGI_FORMAT_R8G8B8A8_UNORM:
441 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
442 case DXGI_FORMAT_B8G8R8A8_TYPELESS:
443 case DXGI_FORMAT_B8G8R8A8_UNORM:
444 case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
445 case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
446 case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
447 case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
448 return 32;
449
450 case DXGI_FORMAT_R16G16B16A16_FLOAT:
451 case DXGI_FORMAT_R16G16B16A16_SINT:
452 case DXGI_FORMAT_R16G16B16A16_SNORM:
453 case DXGI_FORMAT_R16G16B16A16_TYPELESS:
454 case DXGI_FORMAT_R16G16B16A16_UINT:
455 case DXGI_FORMAT_R16G16B16A16_UNORM:
456 case DXGI_FORMAT_R32G32_FLOAT:
457 case DXGI_FORMAT_R32G32_SINT:
458 case DXGI_FORMAT_R32G32_TYPELESS:
459 case DXGI_FORMAT_R32G32_UINT:
460 case DXGI_FORMAT_R32G8X24_TYPELESS:
461 return 64;
462
463 case DXGI_FORMAT_R32G32B32_FLOAT:
464 case DXGI_FORMAT_R32G32B32_SINT:
465 case DXGI_FORMAT_R32G32B32_TYPELESS:
466 case DXGI_FORMAT_R32G32B32_UINT:
467 return 96;
468
469 case DXGI_FORMAT_R32G32B32A32_FLOAT:
470 case DXGI_FORMAT_R32G32B32A32_SINT:
471 case DXGI_FORMAT_R32G32B32A32_TYPELESS:
472 case DXGI_FORMAT_R32G32B32A32_UINT:
473 return 128;
474
475 case DXGI_FORMAT_BC1_TYPELESS:
476 case DXGI_FORMAT_BC1_UNORM:
477 case DXGI_FORMAT_BC1_UNORM_SRGB:
478 case DXGI_FORMAT_BC4_SNORM:
479 case DXGI_FORMAT_BC4_TYPELESS:
480 case DXGI_FORMAT_BC4_UNORM:
481 return 4;
482
483 case DXGI_FORMAT_BC2_TYPELESS:
484 case DXGI_FORMAT_BC2_UNORM:
485 case DXGI_FORMAT_BC2_UNORM_SRGB:
486 case DXGI_FORMAT_BC3_TYPELESS:
487 case DXGI_FORMAT_BC3_UNORM:
488 case DXGI_FORMAT_BC3_UNORM_SRGB:
489 case DXGI_FORMAT_BC5_SNORM:
490 case DXGI_FORMAT_BC5_TYPELESS:
491 case DXGI_FORMAT_BC5_UNORM:
492 case DXGI_FORMAT_BC6H_SF16:
493 case DXGI_FORMAT_BC6H_TYPELESS:
494 case DXGI_FORMAT_BC6H_UF16:
495 case DXGI_FORMAT_BC7_TYPELESS:
496 case DXGI_FORMAT_BC7_UNORM:
497 case DXGI_FORMAT_BC7_UNORM_SRGB:
498 return 8;
499
500 default:
501 return 0;
502 }
503}
504
505size_t ComputeBlockSizeBits(DXGI_FORMAT format)
506{
507 switch (format)
508 {
509 case DXGI_FORMAT_BC1_TYPELESS:
510 case DXGI_FORMAT_BC1_UNORM:
511 case DXGI_FORMAT_BC1_UNORM_SRGB:
512 case DXGI_FORMAT_BC4_SNORM:
513 case DXGI_FORMAT_BC4_TYPELESS:
514 case DXGI_FORMAT_BC4_UNORM:
515 case DXGI_FORMAT_BC2_TYPELESS:
516 case DXGI_FORMAT_BC2_UNORM:
517 case DXGI_FORMAT_BC2_UNORM_SRGB:
518 case DXGI_FORMAT_BC3_TYPELESS:
519 case DXGI_FORMAT_BC3_UNORM:
520 case DXGI_FORMAT_BC3_UNORM_SRGB:
521 case DXGI_FORMAT_BC5_SNORM:
522 case DXGI_FORMAT_BC5_TYPELESS:
523 case DXGI_FORMAT_BC5_UNORM:
524 case DXGI_FORMAT_BC6H_SF16:
525 case DXGI_FORMAT_BC6H_TYPELESS:
526 case DXGI_FORMAT_BC6H_UF16:
527 case DXGI_FORMAT_BC7_TYPELESS:
528 case DXGI_FORMAT_BC7_UNORM:
529 case DXGI_FORMAT_BC7_UNORM_SRGB:
530 return ComputePixelSizeBits(format) * 16;
531 default:
532 UNREACHABLE();
533 return 0;
534 }
535}
daniel@transgaming.com3d34a8a2013-01-11 04:07:48 +0000536
537}