blob: 991361c63eab3ec995eb1b66919cb127ff65e03c [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.com713914b2010-05-04 03:35:17 +0000229// Returns the size, in bytes, of a single texel in an Image
230int ComputePixelSize(GLenum format, GLenum type)
231{
232 switch (type)
233 {
234 case GL_UNSIGNED_BYTE:
235 switch (format)
236 {
237 case GL_ALPHA: return sizeof(unsigned char);
238 case GL_LUMINANCE: return sizeof(unsigned char);
239 case GL_LUMINANCE_ALPHA: return sizeof(unsigned char) * 2;
240 case GL_RGB: return sizeof(unsigned char) * 3;
241 case GL_RGBA: return sizeof(unsigned char) * 4;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +0000242 case GL_BGRA_EXT: return sizeof(unsigned char) * 4;
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000243 default: UNREACHABLE();
244 }
245 break;
246 case GL_UNSIGNED_SHORT_4_4_4_4:
247 case GL_UNSIGNED_SHORT_5_5_5_1:
248 case GL_UNSIGNED_SHORT_5_6_5:
249 return sizeof(unsigned short);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +0000250 case GL_FLOAT:
251 switch (format)
252 {
253 case GL_ALPHA: return sizeof(float);
254 case GL_LUMINANCE: return sizeof(float);
255 case GL_LUMINANCE_ALPHA: return sizeof(float) * 2;
256 case GL_RGB: return sizeof(float) * 3;
257 case GL_RGBA: return sizeof(float) * 4;
258 default: UNREACHABLE();
259 }
260 break;
261 case GL_HALF_FLOAT_OES:
262 switch (format)
263 {
264 case GL_ALPHA: return sizeof(unsigned short);
265 case GL_LUMINANCE: return sizeof(unsigned short);
266 case GL_LUMINANCE_ALPHA: return sizeof(unsigned short) * 2;
267 case GL_RGB: return sizeof(unsigned short) * 3;
268 case GL_RGBA: return sizeof(unsigned short) * 4;
269 default: UNREACHABLE();
270 }
271 break;
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000272 default: UNREACHABLE();
273 }
274
275 return 0;
276}
277
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000278bool IsCubemapTextureTarget(GLenum target)
279{
280 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
281}
282
283bool IsTextureTarget(GLenum target)
284{
285 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
286}
287
288// Verify that format/type are one of the combinations from table 3.4.
289bool CheckTextureFormatType(GLenum format, GLenum type)
290{
291 switch (type)
292 {
293 case GL_UNSIGNED_BYTE:
294 switch (format)
295 {
296 case GL_RGBA:
daniel@transgaming.coma9198d92010-08-08 04:49:56 +0000297 case GL_BGRA_EXT:
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000298 case GL_RGB:
299 case GL_ALPHA:
300 case GL_LUMINANCE:
301 case GL_LUMINANCE_ALPHA:
302 return true;
303
304 default:
305 return false;
306 }
307
daniel@transgaming.com0a337e92010-08-28 17:38:27 +0000308 case GL_FLOAT:
309 case GL_HALF_FLOAT_OES:
310 switch (format)
311 {
312 case GL_RGBA:
313 case GL_RGB:
314 case GL_ALPHA:
315 case GL_LUMINANCE:
316 case GL_LUMINANCE_ALPHA:
317 return true;
318
319 default:
320 return false;
321 }
322
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000323 case GL_UNSIGNED_SHORT_4_4_4_4:
324 case GL_UNSIGNED_SHORT_5_5_5_1:
325 return (format == GL_RGBA);
326
327 case GL_UNSIGNED_SHORT_5_6_5:
328 return (format == GL_RGB);
329
330 default:
331 return false;
332 }
333}
334
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000335}
336
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000337namespace es2dx
338{
339
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000340D3DCMPFUNC ConvertComparison(GLenum comparison)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000341{
342 D3DCMPFUNC d3dComp = D3DCMP_ALWAYS;
343 switch (comparison)
344 {
345 case GL_NEVER: d3dComp = D3DCMP_NEVER; break;
346 case GL_ALWAYS: d3dComp = D3DCMP_ALWAYS; break;
347 case GL_LESS: d3dComp = D3DCMP_LESS; break;
348 case GL_LEQUAL: d3dComp = D3DCMP_LESSEQUAL; break;
349 case GL_EQUAL: d3dComp = D3DCMP_EQUAL; break;
350 case GL_GREATER: d3dComp = D3DCMP_GREATER; break;
351 case GL_GEQUAL: d3dComp = D3DCMP_GREATEREQUAL; break;
352 case GL_NOTEQUAL: d3dComp = D3DCMP_NOTEQUAL; break;
353 default: UNREACHABLE();
354 }
355
356 return d3dComp;
357}
358
359D3DCOLOR ConvertColor(gl::Color color)
360{
361 return D3DCOLOR_RGBA(gl::unorm<8>(color.red),
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000362 gl::unorm<8>(color.green),
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000363 gl::unorm<8>(color.blue),
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000364 gl::unorm<8>(color.alpha));
365}
366
367D3DBLEND ConvertBlendFunc(GLenum blend)
368{
369 D3DBLEND d3dBlend = D3DBLEND_ZERO;
370
371 switch (blend)
372 {
373 case GL_ZERO: d3dBlend = D3DBLEND_ZERO; break;
374 case GL_ONE: d3dBlend = D3DBLEND_ONE; break;
375 case GL_SRC_COLOR: d3dBlend = D3DBLEND_SRCCOLOR; break;
376 case GL_ONE_MINUS_SRC_COLOR: d3dBlend = D3DBLEND_INVSRCCOLOR; break;
377 case GL_DST_COLOR: d3dBlend = D3DBLEND_DESTCOLOR; break;
378 case GL_ONE_MINUS_DST_COLOR: d3dBlend = D3DBLEND_INVDESTCOLOR; break;
379 case GL_SRC_ALPHA: d3dBlend = D3DBLEND_SRCALPHA; break;
380 case GL_ONE_MINUS_SRC_ALPHA: d3dBlend = D3DBLEND_INVSRCALPHA; break;
381 case GL_DST_ALPHA: d3dBlend = D3DBLEND_DESTALPHA; break;
382 case GL_ONE_MINUS_DST_ALPHA: d3dBlend = D3DBLEND_INVDESTALPHA; break;
383 case GL_CONSTANT_COLOR: d3dBlend = D3DBLEND_BLENDFACTOR; break;
384 case GL_ONE_MINUS_CONSTANT_COLOR: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
385 case GL_CONSTANT_ALPHA: d3dBlend = D3DBLEND_BLENDFACTOR; break;
386 case GL_ONE_MINUS_CONSTANT_ALPHA: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
387 case GL_SRC_ALPHA_SATURATE: d3dBlend = D3DBLEND_SRCALPHASAT; break;
388 default: UNREACHABLE();
389 }
390
391 return d3dBlend;
392}
393
394D3DBLENDOP ConvertBlendOp(GLenum blendOp)
395{
396 D3DBLENDOP d3dBlendOp = D3DBLENDOP_ADD;
397
398 switch (blendOp)
399 {
400 case GL_FUNC_ADD: d3dBlendOp = D3DBLENDOP_ADD; break;
401 case GL_FUNC_SUBTRACT: d3dBlendOp = D3DBLENDOP_SUBTRACT; break;
402 case GL_FUNC_REVERSE_SUBTRACT: d3dBlendOp = D3DBLENDOP_REVSUBTRACT; break;
403 default: UNREACHABLE();
404 }
405
406 return d3dBlendOp;
407}
408
409D3DSTENCILOP ConvertStencilOp(GLenum stencilOp)
410{
411 D3DSTENCILOP d3dStencilOp = D3DSTENCILOP_KEEP;
412
413 switch (stencilOp)
414 {
415 case GL_ZERO: d3dStencilOp = D3DSTENCILOP_ZERO; break;
416 case GL_KEEP: d3dStencilOp = D3DSTENCILOP_KEEP; break;
417 case GL_REPLACE: d3dStencilOp = D3DSTENCILOP_REPLACE; break;
418 case GL_INCR: d3dStencilOp = D3DSTENCILOP_INCRSAT; break;
419 case GL_DECR: d3dStencilOp = D3DSTENCILOP_DECRSAT; break;
420 case GL_INVERT: d3dStencilOp = D3DSTENCILOP_INVERT; break;
421 case GL_INCR_WRAP: d3dStencilOp = D3DSTENCILOP_INCR; break;
422 case GL_DECR_WRAP: d3dStencilOp = D3DSTENCILOP_DECR; break;
423 default: UNREACHABLE();
424 }
425
426 return d3dStencilOp;
427}
428
429D3DTEXTUREADDRESS ConvertTextureWrap(GLenum wrap)
430{
431 D3DTEXTUREADDRESS d3dWrap = D3DTADDRESS_WRAP;
432
433 switch (wrap)
434 {
435 case GL_REPEAT: d3dWrap = D3DTADDRESS_WRAP; break;
436 case GL_CLAMP_TO_EDGE: d3dWrap = D3DTADDRESS_CLAMP; break;
437 case GL_MIRRORED_REPEAT: d3dWrap = D3DTADDRESS_MIRROR; break;
438 default: UNREACHABLE();
439 }
440
441 return d3dWrap;
442}
443
444D3DCULL ConvertCullMode(GLenum cullFace, GLenum frontFace)
445{
446 D3DCULL cull = D3DCULL_CCW;
447 switch (cullFace)
448 {
449 case GL_FRONT:
450 cull = (frontFace == GL_CCW ? D3DCULL_CW : D3DCULL_CCW);
451 break;
452 case GL_BACK:
453 cull = (frontFace == GL_CCW ? D3DCULL_CCW : D3DCULL_CW);
454 break;
455 case GL_FRONT_AND_BACK:
daniel@transgaming.comace5e662010-03-21 04:31:20 +0000456 cull = D3DCULL_NONE; // culling will be handled during draw
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000457 break;
458 default: UNREACHABLE();
459 }
460
461 return cull;
462}
463
464DWORD ConvertColorMask(bool red, bool green, bool blue, bool alpha)
465{
466 return (red ? D3DCOLORWRITEENABLE_RED : 0) |
467 (green ? D3DCOLORWRITEENABLE_GREEN : 0) |
468 (blue ? D3DCOLORWRITEENABLE_BLUE : 0) |
469 (alpha ? D3DCOLORWRITEENABLE_ALPHA : 0);
470}
471
472D3DTEXTUREFILTERTYPE ConvertMagFilter(GLenum magFilter)
473{
474 D3DTEXTUREFILTERTYPE d3dMagFilter = D3DTEXF_POINT;
475 switch (magFilter)
476 {
477 case GL_NEAREST: d3dMagFilter = D3DTEXF_POINT; break;
478 case GL_LINEAR: d3dMagFilter = D3DTEXF_LINEAR; break;
479 default: UNREACHABLE();
480 }
481
482 return d3dMagFilter;
483}
484
485void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter)
486{
487 switch (minFilter)
488 {
489 case GL_NEAREST:
490 *d3dMinFilter = D3DTEXF_POINT;
491 *d3dMipFilter = D3DTEXF_NONE;
492 break;
493 case GL_LINEAR:
494 *d3dMinFilter = D3DTEXF_LINEAR;
495 *d3dMipFilter = D3DTEXF_NONE;
496 break;
497 case GL_NEAREST_MIPMAP_NEAREST:
498 *d3dMinFilter = D3DTEXF_POINT;
499 *d3dMipFilter = D3DTEXF_POINT;
500 break;
501 case GL_LINEAR_MIPMAP_NEAREST:
502 *d3dMinFilter = D3DTEXF_LINEAR;
503 *d3dMipFilter = D3DTEXF_POINT;
504 break;
505 case GL_NEAREST_MIPMAP_LINEAR:
506 *d3dMinFilter = D3DTEXF_POINT;
507 *d3dMipFilter = D3DTEXF_LINEAR;
508 break;
509 case GL_LINEAR_MIPMAP_LINEAR:
510 *d3dMinFilter = D3DTEXF_LINEAR;
511 *d3dMipFilter = D3DTEXF_LINEAR;
512 break;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000513 default:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000514 *d3dMinFilter = D3DTEXF_POINT;
515 *d3dMipFilter = D3DTEXF_NONE;
516 UNREACHABLE();
517 }
518}
519
520unsigned int GetStencilSize(D3DFORMAT stencilFormat)
521{
522 switch(stencilFormat)
523 {
524 case D3DFMT_D24FS8:
525 case D3DFMT_D24S8:
526 return 8;
527 case D3DFMT_D24X4S4:
528 return 4;
529 case D3DFMT_D15S1:
530 return 1;
531 case D3DFMT_D16_LOCKABLE:
532 case D3DFMT_D32:
533 case D3DFMT_D24X8:
534 case D3DFMT_D32F_LOCKABLE:
535 case D3DFMT_D16:
536 return 0;
537// case D3DFMT_D32_LOCKABLE: return 0; // DirectX 9Ex only
538// case D3DFMT_S8_LOCKABLE: return 8; // DirectX 9Ex only
539 default: UNREACHABLE();
540 }
541 return 0;
542}
543
544unsigned int GetAlphaSize(D3DFORMAT colorFormat)
545{
546 switch (colorFormat)
547 {
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000548 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000549 return 2;
550 case D3DFMT_A8R8G8B8:
551 return 8;
552 case D3DFMT_A1R5G5B5:
553 return 1;
554 case D3DFMT_X8R8G8B8:
555 case D3DFMT_X1R5G5B5:
556 case D3DFMT_R5G6B5:
557 return 0;
558 default: UNREACHABLE();
559 }
560 return 0;
561}
562
563unsigned int GetRedSize(D3DFORMAT colorFormat)
564{
565 switch (colorFormat)
566 {
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000567 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000568 return 10;
569 case D3DFMT_A8R8G8B8:
570 case D3DFMT_X8R8G8B8:
571 return 8;
572 case D3DFMT_A1R5G5B5:
573 case D3DFMT_R5G6B5:
574 case D3DFMT_X1R5G5B5:
575 return 5;
576 default: UNREACHABLE();
577 }
578 return 0;
579}
580
581unsigned int GetGreenSize(D3DFORMAT colorFormat)
582{
583 switch (colorFormat)
584 {
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000585 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000586 return 10;
587 case D3DFMT_A8R8G8B8:
588 case D3DFMT_X8R8G8B8:
589 return 8;
590 case D3DFMT_A1R5G5B5:
591 case D3DFMT_X1R5G5B5:
592 return 5;
593 case D3DFMT_R5G6B5:
594 return 6;
595 default: UNREACHABLE();
596 }
597 return 0;
598}
599
600unsigned int GetBlueSize(D3DFORMAT colorFormat)
601{
602 switch (colorFormat)
603 {
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000604 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000605 return 10;
606 case D3DFMT_A8R8G8B8:
607 case D3DFMT_X8R8G8B8:
608 return 8;
609 case D3DFMT_A1R5G5B5:
610 case D3DFMT_R5G6B5:
611 case D3DFMT_X1R5G5B5:
612 return 5;
613 default: UNREACHABLE();
614 }
615 return 0;
616}
617
618unsigned int GetDepthSize(D3DFORMAT depthFormat)
619{
620 switch (depthFormat)
621 {
622 case D3DFMT_D16_LOCKABLE: return 16;
623 case D3DFMT_D32: return 32;
624 case D3DFMT_D15S1: return 15;
625 case D3DFMT_D24S8: return 24;
626 case D3DFMT_D24X8: return 24;
627 case D3DFMT_D24X4S4: return 24;
628 case D3DFMT_D16: return 16;
629 case D3DFMT_D32F_LOCKABLE: return 32;
630 case D3DFMT_D24FS8: return 24;
631// case D3DFMT_D32_LOCKABLE: return 32; // D3D9Ex only
632// case D3DFMT_S8_LOCKABLE: return 0; // D3D9Ex only
633 default:
634 UNREACHABLE();
635 }
636 return 0;
637}
638
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000639bool ConvertPrimitiveType(GLenum primitiveType, GLsizei primitiveCount,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000640 D3DPRIMITIVETYPE *d3dPrimitiveType, int *d3dPrimitiveCount)
641{
642 switch (primitiveType)
643 {
644 case GL_POINTS:
645 *d3dPrimitiveType = D3DPT_POINTLIST;
646 *d3dPrimitiveCount = primitiveCount;
647 break;
648 case GL_LINES:
649 *d3dPrimitiveType = D3DPT_LINELIST;
650 *d3dPrimitiveCount = primitiveCount / 2;
651 break;
652 case GL_LINE_LOOP:
daniel@transgaming.combf2b52a2010-04-20 18:53:03 +0000653 *d3dPrimitiveType = D3DPT_LINESTRIP;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000654 *d3dPrimitiveCount = primitiveCount;
655 break;
656 case GL_LINE_STRIP:
657 *d3dPrimitiveType = D3DPT_LINESTRIP;
658 *d3dPrimitiveCount = primitiveCount - 1;
659 break;
660 case GL_TRIANGLES:
661 *d3dPrimitiveType = D3DPT_TRIANGLELIST;
662 *d3dPrimitiveCount = primitiveCount / 3;
663 break;
664 case GL_TRIANGLE_STRIP:
665 *d3dPrimitiveType = D3DPT_TRIANGLESTRIP;
666 *d3dPrimitiveCount = primitiveCount - 2;
667 break;
668 case GL_TRIANGLE_FAN:
669 *d3dPrimitiveType = D3DPT_TRIANGLEFAN;
670 *d3dPrimitiveCount = primitiveCount - 2;
671 break;
672 default:
673 return false;
674 }
675
676 return true;
677}
678
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000679D3DFORMAT ConvertRenderbufferFormat(GLenum format)
680{
681 switch (format)
682 {
683 case GL_RGBA4:
daniel@transgaming.com63977542010-08-24 19:21:02 +0000684 case GL_RGB5_A1:
685 case GL_RGBA8_OES: return D3DFMT_A8R8G8B8;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000686 case GL_RGB565: return D3DFMT_R5G6B5;
daniel@transgaming.com63977542010-08-24 19:21:02 +0000687 case GL_RGB8_OES: return D3DFMT_X8R8G8B8;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000688 case GL_DEPTH_COMPONENT16:
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000689 case GL_STENCIL_INDEX8:
690 case GL_DEPTH24_STENCIL8_OES: return D3DFMT_D24S8;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000691 default: UNREACHABLE(); return D3DFMT_A8R8G8B8;
692 }
693}
694
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000695GLsizei GetSamplesFromMultisampleType(D3DMULTISAMPLE_TYPE type)
696{
697 if (type == D3DMULTISAMPLE_NONMASKABLE)
698 return 0;
699 else
700 return type;
701}
702
703D3DMULTISAMPLE_TYPE GetMultisampleTypeFromSamples(GLsizei samples)
704{
705 if (samples <= 1)
706 return D3DMULTISAMPLE_NONE;
707 else
708 return (D3DMULTISAMPLE_TYPE)samples;
709}
710
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000711}