blob: 6bbf66c4d7bbf081b94d4abd7faaf70f34db3d38 [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;
shannon.woods@transgaming.com29c36412013-01-25 21:53:40 +0000286 case DXGI_FORMAT_UNKNOWN:
287 return GL_NONE;
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000288 default:
289 UNREACHABLE();
290 }
291
292 return GL_RGBA8_OES;
293}
294
295}
296
297namespace gl_d3d11
298{
299
300DXGI_FORMAT ConvertRenderbufferFormat(GLenum format)
301{
302 switch (format)
303 {
304 case GL_RGBA4:
305 case GL_RGB5_A1:
306 case GL_RGBA8_OES:
307 case GL_RGB565:
308 case GL_RGB8_OES:
309 return DXGI_FORMAT_R8G8B8A8_UNORM;
310 case GL_DEPTH_COMPONENT16:
311 case GL_STENCIL_INDEX8:
312 case GL_DEPTH24_STENCIL8_OES:
313 return DXGI_FORMAT_D24_UNORM_S8_UINT;
314 default:
315 UNREACHABLE();
316 }
317
318 return DXGI_FORMAT_R8G8B8A8_UNORM;
319}
320
321DXGI_FORMAT ConvertTextureFormat(GLenum internalformat)
322{
323 switch (internalformat)
324 {
325 case GL_RGB565:
326 case GL_RGBA4:
327 case GL_RGB5_A1:
328 case GL_RGB8_OES:
329 case GL_RGBA8_OES:
330 case GL_LUMINANCE8_EXT:
331 case GL_LUMINANCE8_ALPHA8_EXT:
332 return DXGI_FORMAT_R8G8B8A8_UNORM;
333 case GL_ALPHA8_EXT:
334 return DXGI_FORMAT_A8_UNORM;
335 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
336 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
337 return DXGI_FORMAT_BC1_UNORM;
338 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
339 return DXGI_FORMAT_BC2_UNORM;
340 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
341 return DXGI_FORMAT_BC3_UNORM;
342 case GL_RGBA32F_EXT:
343 case GL_ALPHA32F_EXT:
344 case GL_LUMINANCE_ALPHA32F_EXT:
345 return DXGI_FORMAT_R32G32B32A32_FLOAT;
346 case GL_RGB32F_EXT:
347 case GL_LUMINANCE32F_EXT:
348 return DXGI_FORMAT_R32G32B32_FLOAT;
349 case GL_RGBA16F_EXT:
350 case GL_ALPHA16F_EXT:
351 case GL_LUMINANCE_ALPHA16F_EXT:
352 case GL_RGB16F_EXT:
353 case GL_LUMINANCE16F_EXT:
354 return DXGI_FORMAT_R16G16B16A16_FLOAT;
355 case GL_BGRA8_EXT:
356 return DXGI_FORMAT_B8G8R8A8_UNORM;
357 case GL_R8_EXT:
358 return DXGI_FORMAT_R8_UNORM;
359 case GL_RG8_EXT:
360 return DXGI_FORMAT_R8G8_UNORM;
361 case GL_R16F_EXT:
362 return DXGI_FORMAT_R16_FLOAT;
363 case GL_RG16F_EXT:
364 return DXGI_FORMAT_R16G16_FLOAT;
365 case GL_DEPTH_COMPONENT16:
366 case GL_DEPTH_COMPONENT32_OES:
367 case GL_DEPTH24_STENCIL8_OES:
368 return DXGI_FORMAT_D24_UNORM_S8_UINT;
shannon.woods@transgaming.com29c36412013-01-25 21:53:40 +0000369 case GL_NONE:
370 return DXGI_FORMAT_UNKNOWN;
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000371 default:
372 UNREACHABLE();
373 }
374
375 return DXGI_FORMAT_R8G8B8A8_UNORM;
376}
daniel@transgaming.com3d34a8a2013-01-11 04:07:48 +0000377
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000378}
daniel@transgaming.com8fb65c82012-12-20 21:07:49 +0000379
380namespace d3d11
381{
daniel@transgaming.com3d34a8a2013-01-11 04:07:48 +0000382
shannon.woods@transgaming.comf3d82072013-01-25 21:50:43 +0000383void SetPositionTexCoordVertex(PositionTexCoordVertex* vertex, float x, float y, float u, float v)
384{
385 vertex->x = x;
386 vertex->y = y;
387 vertex->u = u;
388 vertex->v = v;
389}
390
shannon.woods@transgaming.com34f507c2013-01-25 21:52:15 +0000391void SetPositionDepthColorVertex(PositionDepthColorVertex* vertex, float x, float y, float z,
392 const gl::Color &color)
393{
394 vertex->x = x;
395 vertex->y = y;
396 vertex->z = z;
397 vertex->r = color.red;
398 vertex->g = color.green;
399 vertex->b = color.blue;
400 vertex->a = color.alpha;
401}
402
daniel@transgaming.com8fb65c82012-12-20 21:07:49 +0000403size_t ComputePixelSizeBits(DXGI_FORMAT format)
404{
405 switch (format)
406 {
407 case DXGI_FORMAT_R1_UNORM:
408 return 1;
409
410 case DXGI_FORMAT_A8_UNORM:
411 case DXGI_FORMAT_R8_SINT:
412 case DXGI_FORMAT_R8_SNORM:
413 case DXGI_FORMAT_R8_TYPELESS:
414 case DXGI_FORMAT_R8_UINT:
415 case DXGI_FORMAT_R8_UNORM:
416 return 8;
417
418 case DXGI_FORMAT_B5G5R5A1_UNORM:
419 case DXGI_FORMAT_B5G6R5_UNORM:
420 case DXGI_FORMAT_D16_UNORM:
421 case DXGI_FORMAT_R16_FLOAT:
422 case DXGI_FORMAT_R16_SINT:
423 case DXGI_FORMAT_R16_SNORM:
424 case DXGI_FORMAT_R16_TYPELESS:
425 case DXGI_FORMAT_R16_UINT:
426 case DXGI_FORMAT_R16_UNORM:
427 case DXGI_FORMAT_R8G8_SINT:
428 case DXGI_FORMAT_R8G8_SNORM:
429 case DXGI_FORMAT_R8G8_TYPELESS:
430 case DXGI_FORMAT_R8G8_UINT:
431 case DXGI_FORMAT_R8G8_UNORM:
432 return 16;
433
434 case DXGI_FORMAT_B8G8R8X8_TYPELESS:
435 case DXGI_FORMAT_B8G8R8X8_UNORM:
436 case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
437 case DXGI_FORMAT_D24_UNORM_S8_UINT:
438 case DXGI_FORMAT_D32_FLOAT:
439 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
440 case DXGI_FORMAT_G8R8_G8B8_UNORM:
441 case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
442 case DXGI_FORMAT_R10G10B10A2_TYPELESS:
443 case DXGI_FORMAT_R10G10B10A2_UINT:
444 case DXGI_FORMAT_R10G10B10A2_UNORM:
445 case DXGI_FORMAT_R11G11B10_FLOAT:
446 case DXGI_FORMAT_R16G16_FLOAT:
447 case DXGI_FORMAT_R16G16_SINT:
448 case DXGI_FORMAT_R16G16_SNORM:
449 case DXGI_FORMAT_R16G16_TYPELESS:
450 case DXGI_FORMAT_R16G16_UINT:
451 case DXGI_FORMAT_R16G16_UNORM:
452 case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
453 case DXGI_FORMAT_R24G8_TYPELESS:
454 case DXGI_FORMAT_R32_FLOAT:
455 case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
456 case DXGI_FORMAT_R32_SINT:
457 case DXGI_FORMAT_R32_TYPELESS:
458 case DXGI_FORMAT_R32_UINT:
459 case DXGI_FORMAT_R8G8_B8G8_UNORM:
460 case DXGI_FORMAT_R8G8B8A8_SINT:
461 case DXGI_FORMAT_R8G8B8A8_SNORM:
462 case DXGI_FORMAT_R8G8B8A8_TYPELESS:
463 case DXGI_FORMAT_R8G8B8A8_UINT:
464 case DXGI_FORMAT_R8G8B8A8_UNORM:
465 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
466 case DXGI_FORMAT_B8G8R8A8_TYPELESS:
467 case DXGI_FORMAT_B8G8R8A8_UNORM:
468 case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
469 case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
470 case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
471 case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
472 return 32;
473
474 case DXGI_FORMAT_R16G16B16A16_FLOAT:
475 case DXGI_FORMAT_R16G16B16A16_SINT:
476 case DXGI_FORMAT_R16G16B16A16_SNORM:
477 case DXGI_FORMAT_R16G16B16A16_TYPELESS:
478 case DXGI_FORMAT_R16G16B16A16_UINT:
479 case DXGI_FORMAT_R16G16B16A16_UNORM:
480 case DXGI_FORMAT_R32G32_FLOAT:
481 case DXGI_FORMAT_R32G32_SINT:
482 case DXGI_FORMAT_R32G32_TYPELESS:
483 case DXGI_FORMAT_R32G32_UINT:
484 case DXGI_FORMAT_R32G8X24_TYPELESS:
485 return 64;
486
487 case DXGI_FORMAT_R32G32B32_FLOAT:
488 case DXGI_FORMAT_R32G32B32_SINT:
489 case DXGI_FORMAT_R32G32B32_TYPELESS:
490 case DXGI_FORMAT_R32G32B32_UINT:
491 return 96;
492
493 case DXGI_FORMAT_R32G32B32A32_FLOAT:
494 case DXGI_FORMAT_R32G32B32A32_SINT:
495 case DXGI_FORMAT_R32G32B32A32_TYPELESS:
496 case DXGI_FORMAT_R32G32B32A32_UINT:
497 return 128;
498
499 case DXGI_FORMAT_BC1_TYPELESS:
500 case DXGI_FORMAT_BC1_UNORM:
501 case DXGI_FORMAT_BC1_UNORM_SRGB:
502 case DXGI_FORMAT_BC4_SNORM:
503 case DXGI_FORMAT_BC4_TYPELESS:
504 case DXGI_FORMAT_BC4_UNORM:
505 return 4;
506
507 case DXGI_FORMAT_BC2_TYPELESS:
508 case DXGI_FORMAT_BC2_UNORM:
509 case DXGI_FORMAT_BC2_UNORM_SRGB:
510 case DXGI_FORMAT_BC3_TYPELESS:
511 case DXGI_FORMAT_BC3_UNORM:
512 case DXGI_FORMAT_BC3_UNORM_SRGB:
513 case DXGI_FORMAT_BC5_SNORM:
514 case DXGI_FORMAT_BC5_TYPELESS:
515 case DXGI_FORMAT_BC5_UNORM:
516 case DXGI_FORMAT_BC6H_SF16:
517 case DXGI_FORMAT_BC6H_TYPELESS:
518 case DXGI_FORMAT_BC6H_UF16:
519 case DXGI_FORMAT_BC7_TYPELESS:
520 case DXGI_FORMAT_BC7_UNORM:
521 case DXGI_FORMAT_BC7_UNORM_SRGB:
522 return 8;
523
524 default:
525 return 0;
526 }
527}
528
529size_t ComputeBlockSizeBits(DXGI_FORMAT format)
530{
531 switch (format)
532 {
533 case DXGI_FORMAT_BC1_TYPELESS:
534 case DXGI_FORMAT_BC1_UNORM:
535 case DXGI_FORMAT_BC1_UNORM_SRGB:
536 case DXGI_FORMAT_BC4_SNORM:
537 case DXGI_FORMAT_BC4_TYPELESS:
538 case DXGI_FORMAT_BC4_UNORM:
539 case DXGI_FORMAT_BC2_TYPELESS:
540 case DXGI_FORMAT_BC2_UNORM:
541 case DXGI_FORMAT_BC2_UNORM_SRGB:
542 case DXGI_FORMAT_BC3_TYPELESS:
543 case DXGI_FORMAT_BC3_UNORM:
544 case DXGI_FORMAT_BC3_UNORM_SRGB:
545 case DXGI_FORMAT_BC5_SNORM:
546 case DXGI_FORMAT_BC5_TYPELESS:
547 case DXGI_FORMAT_BC5_UNORM:
548 case DXGI_FORMAT_BC6H_SF16:
549 case DXGI_FORMAT_BC6H_TYPELESS:
550 case DXGI_FORMAT_BC6H_UF16:
551 case DXGI_FORMAT_BC7_TYPELESS:
552 case DXGI_FORMAT_BC7_UNORM:
553 case DXGI_FORMAT_BC7_UNORM_SRGB:
554 return ComputePixelSizeBits(format) * 16;
555 default:
556 UNREACHABLE();
557 return 0;
558 }
559}
daniel@transgaming.com3d34a8a2013-01-11 04:07:48 +0000560
daniel@transgaming.com00f2d9c2013-01-11 04:11:08 +0000561HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name)
562{
563#if defined(_DEBUG)
564 return resource->SetPrivateData(WKPDID_D3DDebugObjectName, strlen(name), name);
565#else
566 return S_OK;
567#endif
568}
569
daniel@transgaming.com3d34a8a2013-01-11 04:07:48 +0000570}