blob: 43126b664b680bb4c1aab32572cb988dee2225d5 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
2// Copyright (c) 2002-2010 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// utilities.cpp: Conversion functions and other utility routines.
8
daniel@transgaming.combbf56f72010-04-20 18:52:13 +00009#include "libGLESv2/utilities.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +000011#include <limits>
12
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000013#include "common/debug.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000014
15#include "libGLESv2/mathutil.h"
16#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000017
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000018namespace gl
19{
20
21int UniformComponentCount(GLenum type)
22{
23 switch (type)
24 {
25 case GL_BOOL:
26 case GL_FLOAT:
27 case GL_INT:
28 return 1;
29 case GL_BOOL_VEC2:
30 case GL_FLOAT_VEC2:
31 case GL_INT_VEC2:
32 return 2;
33 case GL_INT_VEC3:
34 case GL_FLOAT_VEC3:
35 case GL_BOOL_VEC3:
36 return 3;
37 case GL_BOOL_VEC4:
38 case GL_FLOAT_VEC4:
39 case GL_INT_VEC4:
40 case GL_FLOAT_MAT2:
41 return 4;
42 case GL_FLOAT_MAT3:
43 return 9;
44 case GL_FLOAT_MAT4:
45 return 16;
46 default:
47 UNREACHABLE();
48 }
49
50 return 0;
51}
52
53GLenum UniformComponentType(GLenum type)
54{
55 switch(type)
56 {
57 case GL_BOOL:
58 case GL_BOOL_VEC2:
59 case GL_BOOL_VEC3:
60 case GL_BOOL_VEC4:
61 return GL_BOOL;
62 case GL_FLOAT:
63 case GL_FLOAT_VEC2:
64 case GL_FLOAT_VEC3:
65 case GL_FLOAT_VEC4:
66 case GL_FLOAT_MAT2:
67 case GL_FLOAT_MAT3:
68 case GL_FLOAT_MAT4:
69 return GL_FLOAT;
70 case GL_INT:
71 case GL_INT_VEC2:
72 case GL_INT_VEC3:
73 case GL_INT_VEC4:
74 return GL_INT;
75 default:
76 UNREACHABLE();
77 }
78
79 return GL_NONE;
80}
81
82size_t UniformTypeSize(GLenum type)
83{
84 switch(type)
85 {
86 case GL_BOOL: return sizeof(GLboolean);
87 case GL_FLOAT: return sizeof(GLfloat);
88 case GL_INT: return sizeof(GLint);
89 }
90
91 return UniformTypeSize(UniformComponentType(type)) * UniformComponentCount(type);
92}
93
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +000094int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +000095{
96 switch (type)
97 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +000098 case GL_NONE:
99 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000100 case GL_BOOL:
101 case GL_FLOAT:
102 case GL_INT:
103 case GL_BOOL_VEC2:
104 case GL_FLOAT_VEC2:
105 case GL_INT_VEC2:
106 case GL_INT_VEC3:
107 case GL_FLOAT_VEC3:
108 case GL_BOOL_VEC3:
109 case GL_BOOL_VEC4:
110 case GL_FLOAT_VEC4:
111 case GL_INT_VEC4:
112 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000113 case GL_FLOAT_MAT2:
114 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000115 case GL_FLOAT_MAT3:
116 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000117 case GL_FLOAT_MAT4:
118 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000119 default:
120 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000121 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000122
123 return 0;
124}
125
126int VariableColumnCount(GLenum type)
127{
128 switch (type)
129 {
130 case GL_NONE:
131 return 0;
132 case GL_BOOL:
133 case GL_FLOAT:
134 case GL_INT:
135 return 1;
136 case GL_BOOL_VEC2:
137 case GL_FLOAT_VEC2:
138 case GL_INT_VEC2:
139 case GL_FLOAT_MAT2:
140 return 2;
141 case GL_INT_VEC3:
142 case GL_FLOAT_VEC3:
143 case GL_BOOL_VEC3:
144 case GL_FLOAT_MAT3:
145 return 3;
146 case GL_BOOL_VEC4:
147 case GL_FLOAT_VEC4:
148 case GL_INT_VEC4:
149 case GL_FLOAT_MAT4:
150 return 4;
151 default:
152 UNREACHABLE();
153 }
154
155 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000156}
157
158int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
159{
160 ASSERT(allocationSize <= bitsSize);
161
162 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
163
164 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
165 {
166 if ((*bits & mask) == 0)
167 {
168 *bits |= mask;
169 return i;
170 }
171
172 mask <<= 1;
173 }
174
175 return -1;
176}
177
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000178GLsizei ComputePitch(GLsizei width, GLenum format, GLenum type, GLint alignment)
179{
180 ASSERT(alignment > 0 && isPow2(alignment));
181
182 GLsizei rawPitch = ComputePixelSize(format, type) * width;
183 return (rawPitch + alignment - 1) & ~(alignment - 1);
184}
185
daniel@transgaming.com01868132010-08-24 19:21:17 +0000186GLsizei ComputeCompressedPitch(GLsizei width, GLenum format)
187{
188 switch (format)
189 {
190 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
191 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
192 break;
193 default:
194 return 0;
195 }
196
197 ASSERT(width % 4 == 0);
198
199 return 8 * width / 4;
200}
201
202GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum format)
203{
204 switch (format)
205 {
206 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
207 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
208 break;
209 default:
210 return 0;
211 }
212
213 return 8 * (GLsizei)ceil((float)width / 4.0f) * (GLsizei)ceil((float)height / 4.0f);
214}
215
216bool IsCompressed(GLenum format)
217{
218 if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
219 format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)
220 {
221 return true;
222 }
223 else
224 {
225 return false;
226 }
227}
228
daniel@transgaming.com1297d922010-09-01 15:47:47 +0000229bool IsFloatingPoint(GLenum type)
230{
231 if (type == GL_FLOAT || type == GL_HALF_FLOAT_OES)
232 {
233 return true;
234 }
235 else
236 {
237 return false;
238 }
239}
240
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000241// Returns the size, in bytes, of a single texel in an Image
242int ComputePixelSize(GLenum format, GLenum type)
243{
244 switch (type)
245 {
246 case GL_UNSIGNED_BYTE:
247 switch (format)
248 {
249 case GL_ALPHA: return sizeof(unsigned char);
250 case GL_LUMINANCE: return sizeof(unsigned char);
251 case GL_LUMINANCE_ALPHA: return sizeof(unsigned char) * 2;
252 case GL_RGB: return sizeof(unsigned char) * 3;
253 case GL_RGBA: return sizeof(unsigned char) * 4;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +0000254 case GL_BGRA_EXT: return sizeof(unsigned char) * 4;
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000255 default: UNREACHABLE();
256 }
257 break;
258 case GL_UNSIGNED_SHORT_4_4_4_4:
259 case GL_UNSIGNED_SHORT_5_5_5_1:
260 case GL_UNSIGNED_SHORT_5_6_5:
261 return sizeof(unsigned short);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +0000262 case GL_FLOAT:
263 switch (format)
264 {
265 case GL_ALPHA: return sizeof(float);
266 case GL_LUMINANCE: return sizeof(float);
267 case GL_LUMINANCE_ALPHA: return sizeof(float) * 2;
268 case GL_RGB: return sizeof(float) * 3;
269 case GL_RGBA: return sizeof(float) * 4;
270 default: UNREACHABLE();
271 }
272 break;
273 case GL_HALF_FLOAT_OES:
274 switch (format)
275 {
276 case GL_ALPHA: return sizeof(unsigned short);
277 case GL_LUMINANCE: return sizeof(unsigned short);
278 case GL_LUMINANCE_ALPHA: return sizeof(unsigned short) * 2;
279 case GL_RGB: return sizeof(unsigned short) * 3;
280 case GL_RGBA: return sizeof(unsigned short) * 4;
281 default: UNREACHABLE();
282 }
283 break;
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000284 default: UNREACHABLE();
285 }
286
287 return 0;
288}
289
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000290bool IsCubemapTextureTarget(GLenum target)
291{
292 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
293}
294
295bool IsTextureTarget(GLenum target)
296{
297 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
298}
299
300// Verify that format/type are one of the combinations from table 3.4.
301bool CheckTextureFormatType(GLenum format, GLenum type)
302{
303 switch (type)
304 {
305 case GL_UNSIGNED_BYTE:
306 switch (format)
307 {
308 case GL_RGBA:
daniel@transgaming.coma9198d92010-08-08 04:49:56 +0000309 case GL_BGRA_EXT:
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000310 case GL_RGB:
311 case GL_ALPHA:
312 case GL_LUMINANCE:
313 case GL_LUMINANCE_ALPHA:
314 return true;
315
316 default:
317 return false;
318 }
319
daniel@transgaming.com0a337e92010-08-28 17:38:27 +0000320 case GL_FLOAT:
321 case GL_HALF_FLOAT_OES:
322 switch (format)
323 {
324 case GL_RGBA:
325 case GL_RGB:
326 case GL_ALPHA:
327 case GL_LUMINANCE:
328 case GL_LUMINANCE_ALPHA:
329 return true;
330
331 default:
332 return false;
333 }
334
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000335 case GL_UNSIGNED_SHORT_4_4_4_4:
336 case GL_UNSIGNED_SHORT_5_5_5_1:
337 return (format == GL_RGBA);
338
339 case GL_UNSIGNED_SHORT_5_6_5:
340 return (format == GL_RGB);
341
342 default:
343 return false;
344 }
345}
346
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000347}
348
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000349namespace es2dx
350{
351
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000352D3DCMPFUNC ConvertComparison(GLenum comparison)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000353{
354 D3DCMPFUNC d3dComp = D3DCMP_ALWAYS;
355 switch (comparison)
356 {
357 case GL_NEVER: d3dComp = D3DCMP_NEVER; break;
358 case GL_ALWAYS: d3dComp = D3DCMP_ALWAYS; break;
359 case GL_LESS: d3dComp = D3DCMP_LESS; break;
360 case GL_LEQUAL: d3dComp = D3DCMP_LESSEQUAL; break;
361 case GL_EQUAL: d3dComp = D3DCMP_EQUAL; break;
362 case GL_GREATER: d3dComp = D3DCMP_GREATER; break;
363 case GL_GEQUAL: d3dComp = D3DCMP_GREATEREQUAL; break;
364 case GL_NOTEQUAL: d3dComp = D3DCMP_NOTEQUAL; break;
365 default: UNREACHABLE();
366 }
367
368 return d3dComp;
369}
370
371D3DCOLOR ConvertColor(gl::Color color)
372{
373 return D3DCOLOR_RGBA(gl::unorm<8>(color.red),
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000374 gl::unorm<8>(color.green),
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000375 gl::unorm<8>(color.blue),
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000376 gl::unorm<8>(color.alpha));
377}
378
379D3DBLEND ConvertBlendFunc(GLenum blend)
380{
381 D3DBLEND d3dBlend = D3DBLEND_ZERO;
382
383 switch (blend)
384 {
385 case GL_ZERO: d3dBlend = D3DBLEND_ZERO; break;
386 case GL_ONE: d3dBlend = D3DBLEND_ONE; break;
387 case GL_SRC_COLOR: d3dBlend = D3DBLEND_SRCCOLOR; break;
388 case GL_ONE_MINUS_SRC_COLOR: d3dBlend = D3DBLEND_INVSRCCOLOR; break;
389 case GL_DST_COLOR: d3dBlend = D3DBLEND_DESTCOLOR; break;
390 case GL_ONE_MINUS_DST_COLOR: d3dBlend = D3DBLEND_INVDESTCOLOR; break;
391 case GL_SRC_ALPHA: d3dBlend = D3DBLEND_SRCALPHA; break;
392 case GL_ONE_MINUS_SRC_ALPHA: d3dBlend = D3DBLEND_INVSRCALPHA; break;
393 case GL_DST_ALPHA: d3dBlend = D3DBLEND_DESTALPHA; break;
394 case GL_ONE_MINUS_DST_ALPHA: d3dBlend = D3DBLEND_INVDESTALPHA; break;
395 case GL_CONSTANT_COLOR: d3dBlend = D3DBLEND_BLENDFACTOR; break;
396 case GL_ONE_MINUS_CONSTANT_COLOR: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
397 case GL_CONSTANT_ALPHA: d3dBlend = D3DBLEND_BLENDFACTOR; break;
398 case GL_ONE_MINUS_CONSTANT_ALPHA: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
399 case GL_SRC_ALPHA_SATURATE: d3dBlend = D3DBLEND_SRCALPHASAT; break;
400 default: UNREACHABLE();
401 }
402
403 return d3dBlend;
404}
405
406D3DBLENDOP ConvertBlendOp(GLenum blendOp)
407{
408 D3DBLENDOP d3dBlendOp = D3DBLENDOP_ADD;
409
410 switch (blendOp)
411 {
412 case GL_FUNC_ADD: d3dBlendOp = D3DBLENDOP_ADD; break;
413 case GL_FUNC_SUBTRACT: d3dBlendOp = D3DBLENDOP_SUBTRACT; break;
414 case GL_FUNC_REVERSE_SUBTRACT: d3dBlendOp = D3DBLENDOP_REVSUBTRACT; break;
415 default: UNREACHABLE();
416 }
417
418 return d3dBlendOp;
419}
420
421D3DSTENCILOP ConvertStencilOp(GLenum stencilOp)
422{
423 D3DSTENCILOP d3dStencilOp = D3DSTENCILOP_KEEP;
424
425 switch (stencilOp)
426 {
427 case GL_ZERO: d3dStencilOp = D3DSTENCILOP_ZERO; break;
428 case GL_KEEP: d3dStencilOp = D3DSTENCILOP_KEEP; break;
429 case GL_REPLACE: d3dStencilOp = D3DSTENCILOP_REPLACE; break;
430 case GL_INCR: d3dStencilOp = D3DSTENCILOP_INCRSAT; break;
431 case GL_DECR: d3dStencilOp = D3DSTENCILOP_DECRSAT; break;
432 case GL_INVERT: d3dStencilOp = D3DSTENCILOP_INVERT; break;
433 case GL_INCR_WRAP: d3dStencilOp = D3DSTENCILOP_INCR; break;
434 case GL_DECR_WRAP: d3dStencilOp = D3DSTENCILOP_DECR; break;
435 default: UNREACHABLE();
436 }
437
438 return d3dStencilOp;
439}
440
441D3DTEXTUREADDRESS ConvertTextureWrap(GLenum wrap)
442{
443 D3DTEXTUREADDRESS d3dWrap = D3DTADDRESS_WRAP;
444
445 switch (wrap)
446 {
447 case GL_REPEAT: d3dWrap = D3DTADDRESS_WRAP; break;
448 case GL_CLAMP_TO_EDGE: d3dWrap = D3DTADDRESS_CLAMP; break;
449 case GL_MIRRORED_REPEAT: d3dWrap = D3DTADDRESS_MIRROR; break;
450 default: UNREACHABLE();
451 }
452
453 return d3dWrap;
454}
455
456D3DCULL ConvertCullMode(GLenum cullFace, GLenum frontFace)
457{
458 D3DCULL cull = D3DCULL_CCW;
459 switch (cullFace)
460 {
461 case GL_FRONT:
462 cull = (frontFace == GL_CCW ? D3DCULL_CW : D3DCULL_CCW);
463 break;
464 case GL_BACK:
465 cull = (frontFace == GL_CCW ? D3DCULL_CCW : D3DCULL_CW);
466 break;
467 case GL_FRONT_AND_BACK:
daniel@transgaming.comace5e662010-03-21 04:31:20 +0000468 cull = D3DCULL_NONE; // culling will be handled during draw
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000469 break;
470 default: UNREACHABLE();
471 }
472
473 return cull;
474}
475
476DWORD ConvertColorMask(bool red, bool green, bool blue, bool alpha)
477{
478 return (red ? D3DCOLORWRITEENABLE_RED : 0) |
479 (green ? D3DCOLORWRITEENABLE_GREEN : 0) |
480 (blue ? D3DCOLORWRITEENABLE_BLUE : 0) |
481 (alpha ? D3DCOLORWRITEENABLE_ALPHA : 0);
482}
483
484D3DTEXTUREFILTERTYPE ConvertMagFilter(GLenum magFilter)
485{
486 D3DTEXTUREFILTERTYPE d3dMagFilter = D3DTEXF_POINT;
487 switch (magFilter)
488 {
489 case GL_NEAREST: d3dMagFilter = D3DTEXF_POINT; break;
490 case GL_LINEAR: d3dMagFilter = D3DTEXF_LINEAR; break;
491 default: UNREACHABLE();
492 }
493
494 return d3dMagFilter;
495}
496
497void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter)
498{
499 switch (minFilter)
500 {
501 case GL_NEAREST:
502 *d3dMinFilter = D3DTEXF_POINT;
503 *d3dMipFilter = D3DTEXF_NONE;
504 break;
505 case GL_LINEAR:
506 *d3dMinFilter = D3DTEXF_LINEAR;
507 *d3dMipFilter = D3DTEXF_NONE;
508 break;
509 case GL_NEAREST_MIPMAP_NEAREST:
510 *d3dMinFilter = D3DTEXF_POINT;
511 *d3dMipFilter = D3DTEXF_POINT;
512 break;
513 case GL_LINEAR_MIPMAP_NEAREST:
514 *d3dMinFilter = D3DTEXF_LINEAR;
515 *d3dMipFilter = D3DTEXF_POINT;
516 break;
517 case GL_NEAREST_MIPMAP_LINEAR:
518 *d3dMinFilter = D3DTEXF_POINT;
519 *d3dMipFilter = D3DTEXF_LINEAR;
520 break;
521 case GL_LINEAR_MIPMAP_LINEAR:
522 *d3dMinFilter = D3DTEXF_LINEAR;
523 *d3dMipFilter = D3DTEXF_LINEAR;
524 break;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000525 default:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000526 *d3dMinFilter = D3DTEXF_POINT;
527 *d3dMipFilter = D3DTEXF_NONE;
528 UNREACHABLE();
529 }
530}
531
532unsigned int GetStencilSize(D3DFORMAT stencilFormat)
533{
534 switch(stencilFormat)
535 {
536 case D3DFMT_D24FS8:
537 case D3DFMT_D24S8:
538 return 8;
539 case D3DFMT_D24X4S4:
540 return 4;
541 case D3DFMT_D15S1:
542 return 1;
543 case D3DFMT_D16_LOCKABLE:
544 case D3DFMT_D32:
545 case D3DFMT_D24X8:
546 case D3DFMT_D32F_LOCKABLE:
547 case D3DFMT_D16:
548 return 0;
549// case D3DFMT_D32_LOCKABLE: return 0; // DirectX 9Ex only
550// case D3DFMT_S8_LOCKABLE: return 8; // DirectX 9Ex only
551 default: UNREACHABLE();
552 }
553 return 0;
554}
555
556unsigned int GetAlphaSize(D3DFORMAT colorFormat)
557{
558 switch (colorFormat)
559 {
daniel@transgaming.com1297d922010-09-01 15:47:47 +0000560 case D3DFMT_A16B16G16R16F:
561 return 16;
562 case D3DFMT_A32B32G32R32F:
563 return 32;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000564 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000565 return 2;
566 case D3DFMT_A8R8G8B8:
567 return 8;
568 case D3DFMT_A1R5G5B5:
569 return 1;
570 case D3DFMT_X8R8G8B8:
571 case D3DFMT_X1R5G5B5:
572 case D3DFMT_R5G6B5:
573 return 0;
574 default: UNREACHABLE();
575 }
576 return 0;
577}
578
579unsigned int GetRedSize(D3DFORMAT colorFormat)
580{
581 switch (colorFormat)
582 {
daniel@transgaming.com1297d922010-09-01 15:47:47 +0000583 case D3DFMT_A16B16G16R16F:
584 return 16;
585 case D3DFMT_A32B32G32R32F:
586 return 32;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000587 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000588 return 10;
589 case D3DFMT_A8R8G8B8:
590 case D3DFMT_X8R8G8B8:
591 return 8;
592 case D3DFMT_A1R5G5B5:
593 case D3DFMT_R5G6B5:
594 case D3DFMT_X1R5G5B5:
595 return 5;
596 default: UNREACHABLE();
597 }
598 return 0;
599}
600
601unsigned int GetGreenSize(D3DFORMAT colorFormat)
602{
603 switch (colorFormat)
604 {
daniel@transgaming.com1297d922010-09-01 15:47:47 +0000605 case D3DFMT_A16B16G16R16F:
606 return 16;
607 case D3DFMT_A32B32G32R32F:
608 return 32;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000609 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000610 return 10;
611 case D3DFMT_A8R8G8B8:
612 case D3DFMT_X8R8G8B8:
613 return 8;
614 case D3DFMT_A1R5G5B5:
615 case D3DFMT_X1R5G5B5:
616 return 5;
617 case D3DFMT_R5G6B5:
618 return 6;
619 default: UNREACHABLE();
620 }
621 return 0;
622}
623
624unsigned int GetBlueSize(D3DFORMAT colorFormat)
625{
626 switch (colorFormat)
627 {
daniel@transgaming.com1297d922010-09-01 15:47:47 +0000628 case D3DFMT_A16B16G16R16F:
629 return 16;
630 case D3DFMT_A32B32G32R32F:
631 return 32;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000632 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000633 return 10;
634 case D3DFMT_A8R8G8B8:
635 case D3DFMT_X8R8G8B8:
636 return 8;
637 case D3DFMT_A1R5G5B5:
638 case D3DFMT_R5G6B5:
639 case D3DFMT_X1R5G5B5:
640 return 5;
641 default: UNREACHABLE();
642 }
643 return 0;
644}
645
646unsigned int GetDepthSize(D3DFORMAT depthFormat)
647{
648 switch (depthFormat)
649 {
650 case D3DFMT_D16_LOCKABLE: return 16;
651 case D3DFMT_D32: return 32;
652 case D3DFMT_D15S1: return 15;
653 case D3DFMT_D24S8: return 24;
654 case D3DFMT_D24X8: return 24;
655 case D3DFMT_D24X4S4: return 24;
656 case D3DFMT_D16: return 16;
657 case D3DFMT_D32F_LOCKABLE: return 32;
658 case D3DFMT_D24FS8: return 24;
659// case D3DFMT_D32_LOCKABLE: return 32; // D3D9Ex only
660// case D3DFMT_S8_LOCKABLE: return 0; // D3D9Ex only
661 default:
662 UNREACHABLE();
663 }
664 return 0;
665}
666
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000667bool ConvertPrimitiveType(GLenum primitiveType, GLsizei primitiveCount,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000668 D3DPRIMITIVETYPE *d3dPrimitiveType, int *d3dPrimitiveCount)
669{
670 switch (primitiveType)
671 {
672 case GL_POINTS:
673 *d3dPrimitiveType = D3DPT_POINTLIST;
674 *d3dPrimitiveCount = primitiveCount;
675 break;
676 case GL_LINES:
677 *d3dPrimitiveType = D3DPT_LINELIST;
678 *d3dPrimitiveCount = primitiveCount / 2;
679 break;
680 case GL_LINE_LOOP:
daniel@transgaming.combf2b52a2010-04-20 18:53:03 +0000681 *d3dPrimitiveType = D3DPT_LINESTRIP;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000682 *d3dPrimitiveCount = primitiveCount;
683 break;
684 case GL_LINE_STRIP:
685 *d3dPrimitiveType = D3DPT_LINESTRIP;
686 *d3dPrimitiveCount = primitiveCount - 1;
687 break;
688 case GL_TRIANGLES:
689 *d3dPrimitiveType = D3DPT_TRIANGLELIST;
690 *d3dPrimitiveCount = primitiveCount / 3;
691 break;
692 case GL_TRIANGLE_STRIP:
693 *d3dPrimitiveType = D3DPT_TRIANGLESTRIP;
694 *d3dPrimitiveCount = primitiveCount - 2;
695 break;
696 case GL_TRIANGLE_FAN:
697 *d3dPrimitiveType = D3DPT_TRIANGLEFAN;
698 *d3dPrimitiveCount = primitiveCount - 2;
699 break;
700 default:
701 return false;
702 }
703
704 return true;
705}
706
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000707D3DFORMAT ConvertRenderbufferFormat(GLenum format)
708{
709 switch (format)
710 {
711 case GL_RGBA4:
daniel@transgaming.com63977542010-08-24 19:21:02 +0000712 case GL_RGB5_A1:
713 case GL_RGBA8_OES: return D3DFMT_A8R8G8B8;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000714 case GL_RGB565: return D3DFMT_R5G6B5;
daniel@transgaming.com63977542010-08-24 19:21:02 +0000715 case GL_RGB8_OES: return D3DFMT_X8R8G8B8;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000716 case GL_DEPTH_COMPONENT16:
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000717 case GL_STENCIL_INDEX8:
718 case GL_DEPTH24_STENCIL8_OES: return D3DFMT_D24S8;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000719 default: UNREACHABLE(); return D3DFMT_A8R8G8B8;
720 }
721}
722
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000723GLsizei GetSamplesFromMultisampleType(D3DMULTISAMPLE_TYPE type)
724{
725 if (type == D3DMULTISAMPLE_NONMASKABLE)
726 return 0;
727 else
728 return type;
729}
730
731D3DMULTISAMPLE_TYPE GetMultisampleTypeFromSamples(GLsizei samples)
732{
733 if (samples <= 1)
734 return D3DMULTISAMPLE_NONE;
735 else
736 return (D3DMULTISAMPLE_TYPE)samples;
737}
738
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000739}