blob: 9f63dce5dc4b88c0fae3d46b75a7b383a2b1116e [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;
shannon.woods@transgaming.comc60c5212013-01-25 21:54:01 +0000220 case DXGI_FORMAT_B8G8R8A8_UNORM: return GL_BGRA8_EXT;
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000221 default:
222 UNREACHABLE();
223 }
224
225 return GL_RGBA8_OES;
226}
227
228GLenum ConvertDepthStencilFormat(DXGI_FORMAT format)
229{
230 switch (format)
231 {
shannon.woods@transgaming.comeec5c632013-02-28 23:04:21 +0000232 case DXGI_FORMAT_UNKNOWN: return GL_NONE;
233 case DXGI_FORMAT_D16_UNORM: return GL_DEPTH_COMPONENT16;
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000234 case DXGI_FORMAT_D24_UNORM_S8_UINT: return GL_DEPTH24_STENCIL8_OES;
235 default:
236 UNREACHABLE();
237 }
238
239 return GL_DEPTH24_STENCIL8_OES;
240}
241
242GLenum ConvertRenderbufferFormat(DXGI_FORMAT format)
243{
244 switch (format)
245 {
shannon.woods@transgaming.comc60c5212013-01-25 21:54:01 +0000246 case DXGI_FORMAT_B8G8R8A8_UNORM:
247 return GL_BGRA8_EXT;
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000248 case DXGI_FORMAT_R8G8B8A8_UNORM:
249 return GL_RGBA8_OES;
shannon.woods@transgaming.comeec5c632013-02-28 23:04:21 +0000250 case DXGI_FORMAT_D16_UNORM:
251 return GL_DEPTH_COMPONENT16;
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000252 case DXGI_FORMAT_D24_UNORM_S8_UINT:
253 return GL_DEPTH24_STENCIL8_OES;
254 default:
255 UNREACHABLE();
256 }
257
258 return GL_RGBA8_OES;
259}
260
261GLenum ConvertTextureInternalFormat(DXGI_FORMAT format)
262{
263 switch (format)
264 {
265 case DXGI_FORMAT_R8G8B8A8_UNORM:
266 return GL_RGBA8_OES;
267 case DXGI_FORMAT_A8_UNORM:
268 return GL_ALPHA8_EXT;
269 case DXGI_FORMAT_BC1_UNORM:
270 return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
271 case DXGI_FORMAT_BC2_UNORM:
272 return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
273 case DXGI_FORMAT_BC3_UNORM:
274 return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
275 case DXGI_FORMAT_R32G32B32A32_FLOAT:
276 return GL_RGBA32F_EXT;
277 case DXGI_FORMAT_R32G32B32_FLOAT:
278 return GL_RGB32F_EXT;
279 case DXGI_FORMAT_R16G16B16A16_FLOAT:
280 return GL_RGBA16F_EXT;
281 case DXGI_FORMAT_B8G8R8A8_UNORM:
282 return GL_BGRA8_EXT;
283 case DXGI_FORMAT_R8_UNORM:
284 return GL_R8_EXT;
285 case DXGI_FORMAT_R8G8_UNORM:
286 return GL_RG8_EXT;
287 case DXGI_FORMAT_R16_FLOAT:
288 return GL_R16F_EXT;
289 case DXGI_FORMAT_R16G16_FLOAT:
290 return GL_RG16F_EXT;
shannon.woods@transgaming.comeec5c632013-02-28 23:04:21 +0000291 case DXGI_FORMAT_D16_UNORM:
292 return GL_DEPTH_COMPONENT16;
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000293 case DXGI_FORMAT_D24_UNORM_S8_UINT:
294 return GL_DEPTH24_STENCIL8_OES;
shannon.woods@transgaming.com29c36412013-01-25 21:53:40 +0000295 case DXGI_FORMAT_UNKNOWN:
296 return GL_NONE;
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000297 default:
298 UNREACHABLE();
299 }
300
301 return GL_RGBA8_OES;
302}
303
304}
305
306namespace gl_d3d11
307{
308
309DXGI_FORMAT ConvertRenderbufferFormat(GLenum format)
310{
311 switch (format)
312 {
313 case GL_RGBA4:
314 case GL_RGB5_A1:
315 case GL_RGBA8_OES:
316 case GL_RGB565:
317 case GL_RGB8_OES:
318 return DXGI_FORMAT_R8G8B8A8_UNORM;
shannon.woods@transgaming.comc60c5212013-01-25 21:54:01 +0000319 case GL_BGRA8_EXT:
320 return DXGI_FORMAT_B8G8R8A8_UNORM;
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000321 case GL_DEPTH_COMPONENT16:
shannon.woods@transgaming.comeec5c632013-02-28 23:04:21 +0000322 return DXGI_FORMAT_D16_UNORM;
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000323 case GL_STENCIL_INDEX8:
324 case GL_DEPTH24_STENCIL8_OES:
325 return DXGI_FORMAT_D24_UNORM_S8_UINT;
326 default:
327 UNREACHABLE();
328 }
329
330 return DXGI_FORMAT_R8G8B8A8_UNORM;
331}
332
333DXGI_FORMAT ConvertTextureFormat(GLenum internalformat)
334{
335 switch (internalformat)
336 {
337 case GL_RGB565:
338 case GL_RGBA4:
339 case GL_RGB5_A1:
340 case GL_RGB8_OES:
341 case GL_RGBA8_OES:
342 case GL_LUMINANCE8_EXT:
343 case GL_LUMINANCE8_ALPHA8_EXT:
344 return DXGI_FORMAT_R8G8B8A8_UNORM;
345 case GL_ALPHA8_EXT:
346 return DXGI_FORMAT_A8_UNORM;
347 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
348 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
349 return DXGI_FORMAT_BC1_UNORM;
350 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
351 return DXGI_FORMAT_BC2_UNORM;
352 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
353 return DXGI_FORMAT_BC3_UNORM;
354 case GL_RGBA32F_EXT:
355 case GL_ALPHA32F_EXT:
356 case GL_LUMINANCE_ALPHA32F_EXT:
357 return DXGI_FORMAT_R32G32B32A32_FLOAT;
358 case GL_RGB32F_EXT:
359 case GL_LUMINANCE32F_EXT:
360 return DXGI_FORMAT_R32G32B32_FLOAT;
361 case GL_RGBA16F_EXT:
362 case GL_ALPHA16F_EXT:
363 case GL_LUMINANCE_ALPHA16F_EXT:
364 case GL_RGB16F_EXT:
365 case GL_LUMINANCE16F_EXT:
366 return DXGI_FORMAT_R16G16B16A16_FLOAT;
367 case GL_BGRA8_EXT:
368 return DXGI_FORMAT_B8G8R8A8_UNORM;
369 case GL_R8_EXT:
370 return DXGI_FORMAT_R8_UNORM;
371 case GL_RG8_EXT:
372 return DXGI_FORMAT_R8G8_UNORM;
373 case GL_R16F_EXT:
374 return DXGI_FORMAT_R16_FLOAT;
375 case GL_RG16F_EXT:
376 return DXGI_FORMAT_R16G16_FLOAT;
377 case GL_DEPTH_COMPONENT16:
shannon.woods@transgaming.comeec5c632013-02-28 23:04:21 +0000378 return DXGI_FORMAT_D16_UNORM;
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000379 case GL_DEPTH_COMPONENT32_OES:
380 case GL_DEPTH24_STENCIL8_OES:
381 return DXGI_FORMAT_D24_UNORM_S8_UINT;
shannon.woods@transgaming.com29c36412013-01-25 21:53:40 +0000382 case GL_NONE:
383 return DXGI_FORMAT_UNKNOWN;
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000384 default:
385 UNREACHABLE();
386 }
387
388 return DXGI_FORMAT_R8G8B8A8_UNORM;
389}
daniel@transgaming.com3d34a8a2013-01-11 04:07:48 +0000390
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000391}
daniel@transgaming.com8fb65c82012-12-20 21:07:49 +0000392
393namespace d3d11
394{
daniel@transgaming.com3d34a8a2013-01-11 04:07:48 +0000395
shannon.woods@transgaming.comf3d82072013-01-25 21:50:43 +0000396void SetPositionTexCoordVertex(PositionTexCoordVertex* vertex, float x, float y, float u, float v)
397{
398 vertex->x = x;
399 vertex->y = y;
400 vertex->u = u;
401 vertex->v = v;
402}
403
shannon.woods@transgaming.com34f507c2013-01-25 21:52:15 +0000404void SetPositionDepthColorVertex(PositionDepthColorVertex* vertex, float x, float y, float z,
405 const gl::Color &color)
406{
407 vertex->x = x;
408 vertex->y = y;
409 vertex->z = z;
410 vertex->r = color.red;
411 vertex->g = color.green;
412 vertex->b = color.blue;
413 vertex->a = color.alpha;
414}
415
daniel@transgaming.com8fb65c82012-12-20 21:07:49 +0000416size_t ComputePixelSizeBits(DXGI_FORMAT format)
417{
418 switch (format)
419 {
420 case DXGI_FORMAT_R1_UNORM:
421 return 1;
422
423 case DXGI_FORMAT_A8_UNORM:
424 case DXGI_FORMAT_R8_SINT:
425 case DXGI_FORMAT_R8_SNORM:
426 case DXGI_FORMAT_R8_TYPELESS:
427 case DXGI_FORMAT_R8_UINT:
428 case DXGI_FORMAT_R8_UNORM:
429 return 8;
430
431 case DXGI_FORMAT_B5G5R5A1_UNORM:
432 case DXGI_FORMAT_B5G6R5_UNORM:
433 case DXGI_FORMAT_D16_UNORM:
434 case DXGI_FORMAT_R16_FLOAT:
435 case DXGI_FORMAT_R16_SINT:
436 case DXGI_FORMAT_R16_SNORM:
437 case DXGI_FORMAT_R16_TYPELESS:
438 case DXGI_FORMAT_R16_UINT:
439 case DXGI_FORMAT_R16_UNORM:
440 case DXGI_FORMAT_R8G8_SINT:
441 case DXGI_FORMAT_R8G8_SNORM:
442 case DXGI_FORMAT_R8G8_TYPELESS:
443 case DXGI_FORMAT_R8G8_UINT:
444 case DXGI_FORMAT_R8G8_UNORM:
445 return 16;
446
447 case DXGI_FORMAT_B8G8R8X8_TYPELESS:
448 case DXGI_FORMAT_B8G8R8X8_UNORM:
449 case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
450 case DXGI_FORMAT_D24_UNORM_S8_UINT:
451 case DXGI_FORMAT_D32_FLOAT:
452 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
453 case DXGI_FORMAT_G8R8_G8B8_UNORM:
454 case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
455 case DXGI_FORMAT_R10G10B10A2_TYPELESS:
456 case DXGI_FORMAT_R10G10B10A2_UINT:
457 case DXGI_FORMAT_R10G10B10A2_UNORM:
458 case DXGI_FORMAT_R11G11B10_FLOAT:
459 case DXGI_FORMAT_R16G16_FLOAT:
460 case DXGI_FORMAT_R16G16_SINT:
461 case DXGI_FORMAT_R16G16_SNORM:
462 case DXGI_FORMAT_R16G16_TYPELESS:
463 case DXGI_FORMAT_R16G16_UINT:
464 case DXGI_FORMAT_R16G16_UNORM:
465 case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
466 case DXGI_FORMAT_R24G8_TYPELESS:
467 case DXGI_FORMAT_R32_FLOAT:
468 case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
469 case DXGI_FORMAT_R32_SINT:
470 case DXGI_FORMAT_R32_TYPELESS:
471 case DXGI_FORMAT_R32_UINT:
472 case DXGI_FORMAT_R8G8_B8G8_UNORM:
473 case DXGI_FORMAT_R8G8B8A8_SINT:
474 case DXGI_FORMAT_R8G8B8A8_SNORM:
475 case DXGI_FORMAT_R8G8B8A8_TYPELESS:
476 case DXGI_FORMAT_R8G8B8A8_UINT:
477 case DXGI_FORMAT_R8G8B8A8_UNORM:
478 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
479 case DXGI_FORMAT_B8G8R8A8_TYPELESS:
480 case DXGI_FORMAT_B8G8R8A8_UNORM:
481 case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
482 case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
483 case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
484 case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
485 return 32;
486
487 case DXGI_FORMAT_R16G16B16A16_FLOAT:
488 case DXGI_FORMAT_R16G16B16A16_SINT:
489 case DXGI_FORMAT_R16G16B16A16_SNORM:
490 case DXGI_FORMAT_R16G16B16A16_TYPELESS:
491 case DXGI_FORMAT_R16G16B16A16_UINT:
492 case DXGI_FORMAT_R16G16B16A16_UNORM:
493 case DXGI_FORMAT_R32G32_FLOAT:
494 case DXGI_FORMAT_R32G32_SINT:
495 case DXGI_FORMAT_R32G32_TYPELESS:
496 case DXGI_FORMAT_R32G32_UINT:
497 case DXGI_FORMAT_R32G8X24_TYPELESS:
498 return 64;
499
500 case DXGI_FORMAT_R32G32B32_FLOAT:
501 case DXGI_FORMAT_R32G32B32_SINT:
502 case DXGI_FORMAT_R32G32B32_TYPELESS:
503 case DXGI_FORMAT_R32G32B32_UINT:
504 return 96;
505
506 case DXGI_FORMAT_R32G32B32A32_FLOAT:
507 case DXGI_FORMAT_R32G32B32A32_SINT:
508 case DXGI_FORMAT_R32G32B32A32_TYPELESS:
509 case DXGI_FORMAT_R32G32B32A32_UINT:
510 return 128;
511
512 case DXGI_FORMAT_BC1_TYPELESS:
513 case DXGI_FORMAT_BC1_UNORM:
514 case DXGI_FORMAT_BC1_UNORM_SRGB:
515 case DXGI_FORMAT_BC4_SNORM:
516 case DXGI_FORMAT_BC4_TYPELESS:
517 case DXGI_FORMAT_BC4_UNORM:
518 return 4;
519
520 case DXGI_FORMAT_BC2_TYPELESS:
521 case DXGI_FORMAT_BC2_UNORM:
522 case DXGI_FORMAT_BC2_UNORM_SRGB:
523 case DXGI_FORMAT_BC3_TYPELESS:
524 case DXGI_FORMAT_BC3_UNORM:
525 case DXGI_FORMAT_BC3_UNORM_SRGB:
526 case DXGI_FORMAT_BC5_SNORM:
527 case DXGI_FORMAT_BC5_TYPELESS:
528 case DXGI_FORMAT_BC5_UNORM:
529 case DXGI_FORMAT_BC6H_SF16:
530 case DXGI_FORMAT_BC6H_TYPELESS:
531 case DXGI_FORMAT_BC6H_UF16:
532 case DXGI_FORMAT_BC7_TYPELESS:
533 case DXGI_FORMAT_BC7_UNORM:
534 case DXGI_FORMAT_BC7_UNORM_SRGB:
535 return 8;
536
537 default:
538 return 0;
539 }
540}
541
542size_t ComputeBlockSizeBits(DXGI_FORMAT format)
543{
544 switch (format)
545 {
546 case DXGI_FORMAT_BC1_TYPELESS:
547 case DXGI_FORMAT_BC1_UNORM:
548 case DXGI_FORMAT_BC1_UNORM_SRGB:
549 case DXGI_FORMAT_BC4_SNORM:
550 case DXGI_FORMAT_BC4_TYPELESS:
551 case DXGI_FORMAT_BC4_UNORM:
552 case DXGI_FORMAT_BC2_TYPELESS:
553 case DXGI_FORMAT_BC2_UNORM:
554 case DXGI_FORMAT_BC2_UNORM_SRGB:
555 case DXGI_FORMAT_BC3_TYPELESS:
556 case DXGI_FORMAT_BC3_UNORM:
557 case DXGI_FORMAT_BC3_UNORM_SRGB:
558 case DXGI_FORMAT_BC5_SNORM:
559 case DXGI_FORMAT_BC5_TYPELESS:
560 case DXGI_FORMAT_BC5_UNORM:
561 case DXGI_FORMAT_BC6H_SF16:
562 case DXGI_FORMAT_BC6H_TYPELESS:
563 case DXGI_FORMAT_BC6H_UF16:
564 case DXGI_FORMAT_BC7_TYPELESS:
565 case DXGI_FORMAT_BC7_UNORM:
566 case DXGI_FORMAT_BC7_UNORM_SRGB:
567 return ComputePixelSizeBits(format) * 16;
568 default:
569 UNREACHABLE();
570 return 0;
571 }
572}
daniel@transgaming.com3d34a8a2013-01-11 04:07:48 +0000573
shannon.woods@transgaming.coma24d6462013-02-28 23:13:14 +0000574unsigned int GetTextureFormatDimensionAlignment(DXGI_FORMAT format)
575{
576 switch (format)
577 {
578 case DXGI_FORMAT_BC1_TYPELESS:
579 case DXGI_FORMAT_BC1_UNORM:
580 case DXGI_FORMAT_BC1_UNORM_SRGB:
581 case DXGI_FORMAT_BC4_SNORM:
582 case DXGI_FORMAT_BC4_TYPELESS:
583 case DXGI_FORMAT_BC4_UNORM:
584 case DXGI_FORMAT_BC2_TYPELESS:
585 case DXGI_FORMAT_BC2_UNORM:
586 case DXGI_FORMAT_BC2_UNORM_SRGB:
587 case DXGI_FORMAT_BC3_TYPELESS:
588 case DXGI_FORMAT_BC3_UNORM:
589 case DXGI_FORMAT_BC3_UNORM_SRGB:
590 case DXGI_FORMAT_BC5_SNORM:
591 case DXGI_FORMAT_BC5_TYPELESS:
592 case DXGI_FORMAT_BC5_UNORM:
593 case DXGI_FORMAT_BC6H_SF16:
594 case DXGI_FORMAT_BC6H_TYPELESS:
595 case DXGI_FORMAT_BC6H_UF16:
596 case DXGI_FORMAT_BC7_TYPELESS:
597 case DXGI_FORMAT_BC7_UNORM:
598 case DXGI_FORMAT_BC7_UNORM_SRGB:
599 return 4;
600 case DXGI_FORMAT_UNKNOWN:
601 UNREACHABLE();
602 return 1;
603 default:
604 return 1;
605 }
606}
607
shannon.woods@transgaming.comeec5c632013-02-28 23:04:21 +0000608bool IsDepthStencilFormat(DXGI_FORMAT format)
609{
610 switch (format)
611 {
shannon.woods@transgaming.com955014d2013-02-28 23:12:24 +0000612 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
613 case DXGI_FORMAT_D32_FLOAT:
shannon.woods@transgaming.comeec5c632013-02-28 23:04:21 +0000614 case DXGI_FORMAT_D24_UNORM_S8_UINT:
shannon.woods@transgaming.com955014d2013-02-28 23:12:24 +0000615 case DXGI_FORMAT_D16_UNORM:
shannon.woods@transgaming.comeec5c632013-02-28 23:04:21 +0000616 return true;
617 default:
618 return false;
619 }
620}
621
shannon.woods@transgaming.com955014d2013-02-28 23:12:24 +0000622DXGI_FORMAT GetDepthTextureFormat(DXGI_FORMAT format)
623{
624 switch (format)
625 {
626 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: return DXGI_FORMAT_R32G8X24_TYPELESS;
627 case DXGI_FORMAT_D32_FLOAT: return DXGI_FORMAT_R32_TYPELESS;
628 case DXGI_FORMAT_D24_UNORM_S8_UINT: return DXGI_FORMAT_R24G8_TYPELESS;
629 case DXGI_FORMAT_D16_UNORM: return DXGI_FORMAT_R16_TYPELESS;
630 default: UNREACHABLE(); return DXGI_FORMAT_UNKNOWN;
631 }
632}
633
634DXGI_FORMAT GetDepthShaderResourceFormat(DXGI_FORMAT format)
635{
636 switch (format)
637 {
638 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: return DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS;
639 case DXGI_FORMAT_D32_FLOAT: return DXGI_FORMAT_R32_UINT;
640 case DXGI_FORMAT_D24_UNORM_S8_UINT: return DXGI_FORMAT_R24_UNORM_X8_TYPELESS;
641 case DXGI_FORMAT_D16_UNORM: return DXGI_FORMAT_R16_UNORM;
642 default: UNREACHABLE(); return DXGI_FORMAT_UNKNOWN;
643 }
644}
645
daniel@transgaming.com00f2d9c2013-01-11 04:11:08 +0000646HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name)
647{
648#if defined(_DEBUG)
649 return resource->SetPrivateData(WKPDID_D3DDebugObjectName, strlen(name), name);
650#else
651 return S_OK;
652#endif
653}
654
daniel@transgaming.com3d34a8a2013-01-11 04:07:48 +0000655}