blob: de5bcd390e607828f0c43b4b012811a1a5a7b3e3 [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.com6b147712012-11-28 19:37:24 +000014namespace gl_d3d11
15{
16
17D3D11_BLEND ConvertBlendFunc(GLenum glBlend)
18{
19 D3D11_BLEND d3dBlend = D3D11_BLEND_ZERO;
20
21 switch (glBlend)
22 {
23 case GL_ZERO: d3dBlend = D3D11_BLEND_ZERO; break;
24 case GL_ONE: d3dBlend = D3D11_BLEND_ONE; break;
25 case GL_SRC_COLOR: d3dBlend = D3D11_BLEND_SRC_COLOR; break;
26 case GL_ONE_MINUS_SRC_COLOR: d3dBlend = D3D11_BLEND_INV_SRC_COLOR; break;
27 case GL_DST_COLOR: d3dBlend = D3D11_BLEND_DEST_COLOR; break;
28 case GL_ONE_MINUS_DST_COLOR: d3dBlend = D3D11_BLEND_INV_DEST_COLOR; break;
29 case GL_SRC_ALPHA: d3dBlend = D3D11_BLEND_SRC_ALPHA; break;
30 case GL_ONE_MINUS_SRC_ALPHA: d3dBlend = D3D11_BLEND_INV_SRC_ALPHA; break;
31 case GL_DST_ALPHA: d3dBlend = D3D11_BLEND_DEST_ALPHA; break;
32 case GL_ONE_MINUS_DST_ALPHA: d3dBlend = D3D11_BLEND_INV_DEST_ALPHA; break;
33 case GL_CONSTANT_COLOR: d3dBlend = D3D11_BLEND_BLEND_FACTOR; break;
34 case GL_ONE_MINUS_CONSTANT_COLOR: d3dBlend = D3D11_BLEND_INV_BLEND_FACTOR; break;
35 case GL_CONSTANT_ALPHA: d3dBlend = D3D11_BLEND_BLEND_FACTOR; break;
36 case GL_ONE_MINUS_CONSTANT_ALPHA: d3dBlend = D3D11_BLEND_INV_BLEND_FACTOR; break;
37 case GL_SRC_ALPHA_SATURATE: d3dBlend = D3D11_BLEND_SRC_ALPHA_SAT; break;
38 default: UNREACHABLE();
39 }
40
41 return d3dBlend;
42}
43
44D3D11_BLEND_OP ConvertBlendOp(GLenum glBlendOp)
45{
46 D3D11_BLEND_OP d3dBlendOp = D3D11_BLEND_OP_ADD;
47
48 switch (glBlendOp)
49 {
50 case GL_FUNC_ADD: d3dBlendOp = D3D11_BLEND_OP_ADD; break;
51 case GL_FUNC_SUBTRACT: d3dBlendOp = D3D11_BLEND_OP_SUBTRACT; break;
52 case GL_FUNC_REVERSE_SUBTRACT: d3dBlendOp = D3D11_BLEND_OP_REV_SUBTRACT; break;
53 default: UNREACHABLE();
54 }
55
56 return d3dBlendOp;
57}
58
59UINT8 ConvertColorMask(bool red, bool green, bool blue, bool alpha)
60{
61 UINT8 mask = 0;
62 if (red)
63 {
64 mask |= D3D11_COLOR_WRITE_ENABLE_RED;
65 }
66 if (green)
67 {
68 mask |= D3D11_COLOR_WRITE_ENABLE_GREEN;
69 }
70 if (blue)
71 {
72 mask |= D3D11_COLOR_WRITE_ENABLE_BLUE;
73 }
74 if (alpha)
75 {
76 mask |= D3D11_COLOR_WRITE_ENABLE_ALPHA;
77 }
78 return mask;
79}
80
daniel@transgaming.comfa34b342012-11-28 19:38:01 +000081D3D11_CULL_MODE ConvertCullMode(bool cullEnabled, GLenum cullMode)
82{
83 D3D11_CULL_MODE cull = D3D11_CULL_NONE;
84
85 if (cullEnabled)
86 {
87 switch (cullMode)
88 {
89 case GL_FRONT: cull = D3D11_CULL_FRONT; break;
90 case GL_BACK: cull = D3D11_CULL_BACK; break;
91 case GL_FRONT_AND_BACK: cull = D3D11_CULL_NONE; break;
92 default: UNREACHABLE();
93 }
94 }
95 else
96 {
97 cull = D3D11_CULL_NONE;
98 }
99
100 return cull;
101}
102
daniel@transgaming.comc820c122012-11-28 19:38:30 +0000103D3D11_COMPARISON_FUNC ConvertComparison(GLenum comparison)
104{
105 D3D11_COMPARISON_FUNC d3dComp = D3D11_COMPARISON_NEVER;
106 switch (comparison)
107 {
108 case GL_NEVER: d3dComp = D3D11_COMPARISON_NEVER; break;
109 case GL_ALWAYS: d3dComp = D3D11_COMPARISON_ALWAYS; break;
110 case GL_LESS: d3dComp = D3D11_COMPARISON_LESS; break;
111 case GL_LEQUAL: d3dComp = D3D11_COMPARISON_LESS_EQUAL; break;
112 case GL_EQUAL: d3dComp = D3D11_COMPARISON_EQUAL; break;
113 case GL_GREATER: d3dComp = D3D11_COMPARISON_GREATER; break;
114 case GL_GEQUAL: d3dComp = D3D11_COMPARISON_GREATER_EQUAL; break;
115 case GL_NOTEQUAL: d3dComp = D3D11_COMPARISON_NOT_EQUAL; break;
116 default: UNREACHABLE();
117 }
118
119 return d3dComp;
120}
121
122D3D11_DEPTH_WRITE_MASK ConvertDepthMask(bool depthWriteEnabled)
123{
124 return depthWriteEnabled ? D3D11_DEPTH_WRITE_MASK_ALL : D3D11_DEPTH_WRITE_MASK_ZERO;
125}
126
127UINT8 ConvertStencilMask(GLuint stencilmask)
128{
129 return static_cast<UINT8>(stencilmask);
130}
131
132D3D11_STENCIL_OP ConvertStencilOp(GLenum stencilOp)
133{
134 D3D11_STENCIL_OP d3dStencilOp = D3D11_STENCIL_OP_KEEP;
135
136 switch (stencilOp)
137 {
138 case GL_ZERO: d3dStencilOp = D3D11_STENCIL_OP_ZERO; break;
139 case GL_KEEP: d3dStencilOp = D3D11_STENCIL_OP_KEEP; break;
140 case GL_REPLACE: d3dStencilOp = D3D11_STENCIL_OP_REPLACE; break;
141 case GL_INCR: d3dStencilOp = D3D11_STENCIL_OP_INCR_SAT; break;
142 case GL_DECR: d3dStencilOp = D3D11_STENCIL_OP_DECR_SAT; break;
143 case GL_INVERT: d3dStencilOp = D3D11_STENCIL_OP_INVERT; break;
144 case GL_INCR_WRAP: d3dStencilOp = D3D11_STENCIL_OP_INCR; break;
145 case GL_DECR_WRAP: d3dStencilOp = D3D11_STENCIL_OP_DECR; break;
146 default: UNREACHABLE();
147 }
148
149 return d3dStencilOp;
150}
151
daniel@transgaming.com6b147712012-11-28 19:37:24 +0000152}
153
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000154namespace d3d11_gl
155{
156
157GLenum ConvertBackBufferFormat(DXGI_FORMAT format)
158{
159 switch (format)
160 {
161 case DXGI_FORMAT_R8G8B8A8_UNORM: return GL_RGBA8_OES;
162 default:
163 UNREACHABLE();
164 }
165
166 return GL_RGBA8_OES;
167}
168
169GLenum ConvertDepthStencilFormat(DXGI_FORMAT format)
170{
171 switch (format)
172 {
173 case DXGI_FORMAT_D24_UNORM_S8_UINT: return GL_DEPTH24_STENCIL8_OES;
174 default:
175 UNREACHABLE();
176 }
177
178 return GL_DEPTH24_STENCIL8_OES;
179}
180
181GLenum ConvertRenderbufferFormat(DXGI_FORMAT format)
182{
183 switch (format)
184 {
185 case DXGI_FORMAT_R8G8B8A8_UNORM:
186 return GL_RGBA8_OES;
187 case DXGI_FORMAT_D24_UNORM_S8_UINT:
188 return GL_DEPTH24_STENCIL8_OES;
189 default:
190 UNREACHABLE();
191 }
192
193 return GL_RGBA8_OES;
194}
195
196GLenum ConvertTextureInternalFormat(DXGI_FORMAT format)
197{
198 switch (format)
199 {
200 case DXGI_FORMAT_R8G8B8A8_UNORM:
201 return GL_RGBA8_OES;
202 case DXGI_FORMAT_A8_UNORM:
203 return GL_ALPHA8_EXT;
204 case DXGI_FORMAT_BC1_UNORM:
205 return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
206 case DXGI_FORMAT_BC2_UNORM:
207 return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
208 case DXGI_FORMAT_BC3_UNORM:
209 return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
210 case DXGI_FORMAT_R32G32B32A32_FLOAT:
211 return GL_RGBA32F_EXT;
212 case DXGI_FORMAT_R32G32B32_FLOAT:
213 return GL_RGB32F_EXT;
214 case DXGI_FORMAT_R16G16B16A16_FLOAT:
215 return GL_RGBA16F_EXT;
216 case DXGI_FORMAT_B8G8R8A8_UNORM:
217 return GL_BGRA8_EXT;
218 case DXGI_FORMAT_R8_UNORM:
219 return GL_R8_EXT;
220 case DXGI_FORMAT_R8G8_UNORM:
221 return GL_RG8_EXT;
222 case DXGI_FORMAT_R16_FLOAT:
223 return GL_R16F_EXT;
224 case DXGI_FORMAT_R16G16_FLOAT:
225 return GL_RG16F_EXT;
226 case DXGI_FORMAT_D24_UNORM_S8_UINT:
227 return GL_DEPTH24_STENCIL8_OES;
228 default:
229 UNREACHABLE();
230 }
231
232 return GL_RGBA8_OES;
233}
234
235}
236
237namespace gl_d3d11
238{
239
240DXGI_FORMAT ConvertRenderbufferFormat(GLenum format)
241{
242 switch (format)
243 {
244 case GL_RGBA4:
245 case GL_RGB5_A1:
246 case GL_RGBA8_OES:
247 case GL_RGB565:
248 case GL_RGB8_OES:
249 return DXGI_FORMAT_R8G8B8A8_UNORM;
250 case GL_DEPTH_COMPONENT16:
251 case GL_STENCIL_INDEX8:
252 case GL_DEPTH24_STENCIL8_OES:
253 return DXGI_FORMAT_D24_UNORM_S8_UINT;
254 default:
255 UNREACHABLE();
256 }
257
258 return DXGI_FORMAT_R8G8B8A8_UNORM;
259}
260
261DXGI_FORMAT ConvertTextureFormat(GLenum internalformat)
262{
263 switch (internalformat)
264 {
265 case GL_RGB565:
266 case GL_RGBA4:
267 case GL_RGB5_A1:
268 case GL_RGB8_OES:
269 case GL_RGBA8_OES:
270 case GL_LUMINANCE8_EXT:
271 case GL_LUMINANCE8_ALPHA8_EXT:
272 return DXGI_FORMAT_R8G8B8A8_UNORM;
273 case GL_ALPHA8_EXT:
274 return DXGI_FORMAT_A8_UNORM;
275 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
276 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
277 return DXGI_FORMAT_BC1_UNORM;
278 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
279 return DXGI_FORMAT_BC2_UNORM;
280 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
281 return DXGI_FORMAT_BC3_UNORM;
282 case GL_RGBA32F_EXT:
283 case GL_ALPHA32F_EXT:
284 case GL_LUMINANCE_ALPHA32F_EXT:
285 return DXGI_FORMAT_R32G32B32A32_FLOAT;
286 case GL_RGB32F_EXT:
287 case GL_LUMINANCE32F_EXT:
288 return DXGI_FORMAT_R32G32B32_FLOAT;
289 case GL_RGBA16F_EXT:
290 case GL_ALPHA16F_EXT:
291 case GL_LUMINANCE_ALPHA16F_EXT:
292 case GL_RGB16F_EXT:
293 case GL_LUMINANCE16F_EXT:
294 return DXGI_FORMAT_R16G16B16A16_FLOAT;
295 case GL_BGRA8_EXT:
296 return DXGI_FORMAT_B8G8R8A8_UNORM;
297 case GL_R8_EXT:
298 return DXGI_FORMAT_R8_UNORM;
299 case GL_RG8_EXT:
300 return DXGI_FORMAT_R8G8_UNORM;
301 case GL_R16F_EXT:
302 return DXGI_FORMAT_R16_FLOAT;
303 case GL_RG16F_EXT:
304 return DXGI_FORMAT_R16G16_FLOAT;
305 case GL_DEPTH_COMPONENT16:
306 case GL_DEPTH_COMPONENT32_OES:
307 case GL_DEPTH24_STENCIL8_OES:
308 return DXGI_FORMAT_D24_UNORM_S8_UINT;
309 default:
310 UNREACHABLE();
311 }
312
313 return DXGI_FORMAT_R8G8B8A8_UNORM;
314}
315}
daniel@transgaming.com8fb65c82012-12-20 21:07:49 +0000316
317namespace d3d11
318{
319size_t ComputePixelSizeBits(DXGI_FORMAT format)
320{
321 switch (format)
322 {
323 case DXGI_FORMAT_R1_UNORM:
324 return 1;
325
326 case DXGI_FORMAT_A8_UNORM:
327 case DXGI_FORMAT_R8_SINT:
328 case DXGI_FORMAT_R8_SNORM:
329 case DXGI_FORMAT_R8_TYPELESS:
330 case DXGI_FORMAT_R8_UINT:
331 case DXGI_FORMAT_R8_UNORM:
332 return 8;
333
334 case DXGI_FORMAT_B5G5R5A1_UNORM:
335 case DXGI_FORMAT_B5G6R5_UNORM:
336 case DXGI_FORMAT_D16_UNORM:
337 case DXGI_FORMAT_R16_FLOAT:
338 case DXGI_FORMAT_R16_SINT:
339 case DXGI_FORMAT_R16_SNORM:
340 case DXGI_FORMAT_R16_TYPELESS:
341 case DXGI_FORMAT_R16_UINT:
342 case DXGI_FORMAT_R16_UNORM:
343 case DXGI_FORMAT_R8G8_SINT:
344 case DXGI_FORMAT_R8G8_SNORM:
345 case DXGI_FORMAT_R8G8_TYPELESS:
346 case DXGI_FORMAT_R8G8_UINT:
347 case DXGI_FORMAT_R8G8_UNORM:
348 return 16;
349
350 case DXGI_FORMAT_B8G8R8X8_TYPELESS:
351 case DXGI_FORMAT_B8G8R8X8_UNORM:
352 case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
353 case DXGI_FORMAT_D24_UNORM_S8_UINT:
354 case DXGI_FORMAT_D32_FLOAT:
355 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
356 case DXGI_FORMAT_G8R8_G8B8_UNORM:
357 case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
358 case DXGI_FORMAT_R10G10B10A2_TYPELESS:
359 case DXGI_FORMAT_R10G10B10A2_UINT:
360 case DXGI_FORMAT_R10G10B10A2_UNORM:
361 case DXGI_FORMAT_R11G11B10_FLOAT:
362 case DXGI_FORMAT_R16G16_FLOAT:
363 case DXGI_FORMAT_R16G16_SINT:
364 case DXGI_FORMAT_R16G16_SNORM:
365 case DXGI_FORMAT_R16G16_TYPELESS:
366 case DXGI_FORMAT_R16G16_UINT:
367 case DXGI_FORMAT_R16G16_UNORM:
368 case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
369 case DXGI_FORMAT_R24G8_TYPELESS:
370 case DXGI_FORMAT_R32_FLOAT:
371 case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
372 case DXGI_FORMAT_R32_SINT:
373 case DXGI_FORMAT_R32_TYPELESS:
374 case DXGI_FORMAT_R32_UINT:
375 case DXGI_FORMAT_R8G8_B8G8_UNORM:
376 case DXGI_FORMAT_R8G8B8A8_SINT:
377 case DXGI_FORMAT_R8G8B8A8_SNORM:
378 case DXGI_FORMAT_R8G8B8A8_TYPELESS:
379 case DXGI_FORMAT_R8G8B8A8_UINT:
380 case DXGI_FORMAT_R8G8B8A8_UNORM:
381 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
382 case DXGI_FORMAT_B8G8R8A8_TYPELESS:
383 case DXGI_FORMAT_B8G8R8A8_UNORM:
384 case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
385 case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
386 case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
387 case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
388 return 32;
389
390 case DXGI_FORMAT_R16G16B16A16_FLOAT:
391 case DXGI_FORMAT_R16G16B16A16_SINT:
392 case DXGI_FORMAT_R16G16B16A16_SNORM:
393 case DXGI_FORMAT_R16G16B16A16_TYPELESS:
394 case DXGI_FORMAT_R16G16B16A16_UINT:
395 case DXGI_FORMAT_R16G16B16A16_UNORM:
396 case DXGI_FORMAT_R32G32_FLOAT:
397 case DXGI_FORMAT_R32G32_SINT:
398 case DXGI_FORMAT_R32G32_TYPELESS:
399 case DXGI_FORMAT_R32G32_UINT:
400 case DXGI_FORMAT_R32G8X24_TYPELESS:
401 return 64;
402
403 case DXGI_FORMAT_R32G32B32_FLOAT:
404 case DXGI_FORMAT_R32G32B32_SINT:
405 case DXGI_FORMAT_R32G32B32_TYPELESS:
406 case DXGI_FORMAT_R32G32B32_UINT:
407 return 96;
408
409 case DXGI_FORMAT_R32G32B32A32_FLOAT:
410 case DXGI_FORMAT_R32G32B32A32_SINT:
411 case DXGI_FORMAT_R32G32B32A32_TYPELESS:
412 case DXGI_FORMAT_R32G32B32A32_UINT:
413 return 128;
414
415 case DXGI_FORMAT_BC1_TYPELESS:
416 case DXGI_FORMAT_BC1_UNORM:
417 case DXGI_FORMAT_BC1_UNORM_SRGB:
418 case DXGI_FORMAT_BC4_SNORM:
419 case DXGI_FORMAT_BC4_TYPELESS:
420 case DXGI_FORMAT_BC4_UNORM:
421 return 4;
422
423 case DXGI_FORMAT_BC2_TYPELESS:
424 case DXGI_FORMAT_BC2_UNORM:
425 case DXGI_FORMAT_BC2_UNORM_SRGB:
426 case DXGI_FORMAT_BC3_TYPELESS:
427 case DXGI_FORMAT_BC3_UNORM:
428 case DXGI_FORMAT_BC3_UNORM_SRGB:
429 case DXGI_FORMAT_BC5_SNORM:
430 case DXGI_FORMAT_BC5_TYPELESS:
431 case DXGI_FORMAT_BC5_UNORM:
432 case DXGI_FORMAT_BC6H_SF16:
433 case DXGI_FORMAT_BC6H_TYPELESS:
434 case DXGI_FORMAT_BC6H_UF16:
435 case DXGI_FORMAT_BC7_TYPELESS:
436 case DXGI_FORMAT_BC7_UNORM:
437 case DXGI_FORMAT_BC7_UNORM_SRGB:
438 return 8;
439
440 default:
441 return 0;
442 }
443}
444
445size_t ComputeBlockSizeBits(DXGI_FORMAT format)
446{
447 switch (format)
448 {
449 case DXGI_FORMAT_BC1_TYPELESS:
450 case DXGI_FORMAT_BC1_UNORM:
451 case DXGI_FORMAT_BC1_UNORM_SRGB:
452 case DXGI_FORMAT_BC4_SNORM:
453 case DXGI_FORMAT_BC4_TYPELESS:
454 case DXGI_FORMAT_BC4_UNORM:
455 case DXGI_FORMAT_BC2_TYPELESS:
456 case DXGI_FORMAT_BC2_UNORM:
457 case DXGI_FORMAT_BC2_UNORM_SRGB:
458 case DXGI_FORMAT_BC3_TYPELESS:
459 case DXGI_FORMAT_BC3_UNORM:
460 case DXGI_FORMAT_BC3_UNORM_SRGB:
461 case DXGI_FORMAT_BC5_SNORM:
462 case DXGI_FORMAT_BC5_TYPELESS:
463 case DXGI_FORMAT_BC5_UNORM:
464 case DXGI_FORMAT_BC6H_SF16:
465 case DXGI_FORMAT_BC6H_TYPELESS:
466 case DXGI_FORMAT_BC6H_UF16:
467 case DXGI_FORMAT_BC7_TYPELESS:
468 case DXGI_FORMAT_BC7_UNORM:
469 case DXGI_FORMAT_BC7_UNORM_SRGB:
470 return ComputePixelSizeBits(format) * 16;
471 default:
472 UNREACHABLE();
473 return 0;
474 }
475}
476}