blob: d0fe3986212be3aa5ca50d0066ac283fd8f46bdf [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:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000028 case GL_SAMPLER_2D:
29 case GL_SAMPLER_CUBE:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000030 return 1;
31 case GL_BOOL_VEC2:
32 case GL_FLOAT_VEC2:
33 case GL_INT_VEC2:
34 return 2;
35 case GL_INT_VEC3:
36 case GL_FLOAT_VEC3:
37 case GL_BOOL_VEC3:
38 return 3;
39 case GL_BOOL_VEC4:
40 case GL_FLOAT_VEC4:
41 case GL_INT_VEC4:
42 case GL_FLOAT_MAT2:
43 return 4;
44 case GL_FLOAT_MAT3:
45 return 9;
46 case GL_FLOAT_MAT4:
47 return 16;
48 default:
49 UNREACHABLE();
50 }
51
52 return 0;
53}
54
55GLenum UniformComponentType(GLenum type)
56{
57 switch(type)
58 {
59 case GL_BOOL:
60 case GL_BOOL_VEC2:
61 case GL_BOOL_VEC3:
62 case GL_BOOL_VEC4:
63 return GL_BOOL;
64 case GL_FLOAT:
65 case GL_FLOAT_VEC2:
66 case GL_FLOAT_VEC3:
67 case GL_FLOAT_VEC4:
68 case GL_FLOAT_MAT2:
69 case GL_FLOAT_MAT3:
70 case GL_FLOAT_MAT4:
71 return GL_FLOAT;
72 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000073 case GL_SAMPLER_2D:
74 case GL_SAMPLER_CUBE:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000075 case GL_INT_VEC2:
76 case GL_INT_VEC3:
77 case GL_INT_VEC4:
78 return GL_INT;
79 default:
80 UNREACHABLE();
81 }
82
83 return GL_NONE;
84}
85
86size_t UniformTypeSize(GLenum type)
87{
88 switch(type)
89 {
90 case GL_BOOL: return sizeof(GLboolean);
91 case GL_FLOAT: return sizeof(GLfloat);
92 case GL_INT: return sizeof(GLint);
93 }
94
95 return UniformTypeSize(UniformComponentType(type)) * UniformComponentCount(type);
96}
97
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +000098int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +000099{
100 switch (type)
101 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000102 case GL_NONE:
103 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000104 case GL_BOOL:
105 case GL_FLOAT:
106 case GL_INT:
107 case GL_BOOL_VEC2:
108 case GL_FLOAT_VEC2:
109 case GL_INT_VEC2:
110 case GL_INT_VEC3:
111 case GL_FLOAT_VEC3:
112 case GL_BOOL_VEC3:
113 case GL_BOOL_VEC4:
114 case GL_FLOAT_VEC4:
115 case GL_INT_VEC4:
116 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000117 case GL_FLOAT_MAT2:
118 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000119 case GL_FLOAT_MAT3:
120 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000121 case GL_FLOAT_MAT4:
122 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000123 default:
124 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000125 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000126
127 return 0;
128}
129
130int VariableColumnCount(GLenum type)
131{
132 switch (type)
133 {
134 case GL_NONE:
135 return 0;
136 case GL_BOOL:
137 case GL_FLOAT:
138 case GL_INT:
139 return 1;
140 case GL_BOOL_VEC2:
141 case GL_FLOAT_VEC2:
142 case GL_INT_VEC2:
143 case GL_FLOAT_MAT2:
144 return 2;
145 case GL_INT_VEC3:
146 case GL_FLOAT_VEC3:
147 case GL_BOOL_VEC3:
148 case GL_FLOAT_MAT3:
149 return 3;
150 case GL_BOOL_VEC4:
151 case GL_FLOAT_VEC4:
152 case GL_INT_VEC4:
153 case GL_FLOAT_MAT4:
154 return 4;
155 default:
156 UNREACHABLE();
157 }
158
159 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000160}
161
162int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
163{
164 ASSERT(allocationSize <= bitsSize);
165
166 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
167
168 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
169 {
170 if ((*bits & mask) == 0)
171 {
172 *bits |= mask;
173 return i;
174 }
175
176 mask <<= 1;
177 }
178
179 return -1;
180}
181
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000182GLsizei ComputePitch(GLsizei width, GLenum format, GLenum type, GLint alignment)
183{
184 ASSERT(alignment > 0 && isPow2(alignment));
185
186 GLsizei rawPitch = ComputePixelSize(format, type) * width;
187 return (rawPitch + alignment - 1) & ~(alignment - 1);
188}
189
daniel@transgaming.com01868132010-08-24 19:21:17 +0000190GLsizei ComputeCompressedPitch(GLsizei width, GLenum format)
191{
192 switch (format)
193 {
194 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
195 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
196 break;
197 default:
198 return 0;
199 }
200
201 ASSERT(width % 4 == 0);
202
203 return 8 * width / 4;
204}
205
206GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum format)
207{
208 switch (format)
209 {
210 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
211 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
212 break;
213 default:
214 return 0;
215 }
216
217 return 8 * (GLsizei)ceil((float)width / 4.0f) * (GLsizei)ceil((float)height / 4.0f);
218}
219
220bool IsCompressed(GLenum format)
221{
222 if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
223 format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)
224 {
225 return true;
226 }
227 else
228 {
229 return false;
230 }
231}
232
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000233// Returns the size, in bytes, of a single texel in an Image
234int ComputePixelSize(GLenum format, GLenum type)
235{
236 switch (type)
237 {
238 case GL_UNSIGNED_BYTE:
239 switch (format)
240 {
241 case GL_ALPHA: return sizeof(unsigned char);
242 case GL_LUMINANCE: return sizeof(unsigned char);
243 case GL_LUMINANCE_ALPHA: return sizeof(unsigned char) * 2;
244 case GL_RGB: return sizeof(unsigned char) * 3;
245 case GL_RGBA: return sizeof(unsigned char) * 4;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +0000246 case GL_BGRA_EXT: return sizeof(unsigned char) * 4;
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000247 default: UNREACHABLE();
248 }
249 break;
250 case GL_UNSIGNED_SHORT_4_4_4_4:
251 case GL_UNSIGNED_SHORT_5_5_5_1:
252 case GL_UNSIGNED_SHORT_5_6_5:
253 return sizeof(unsigned short);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +0000254 case GL_FLOAT:
255 switch (format)
256 {
257 case GL_ALPHA: return sizeof(float);
258 case GL_LUMINANCE: return sizeof(float);
259 case GL_LUMINANCE_ALPHA: return sizeof(float) * 2;
260 case GL_RGB: return sizeof(float) * 3;
261 case GL_RGBA: return sizeof(float) * 4;
262 default: UNREACHABLE();
263 }
264 break;
265 case GL_HALF_FLOAT_OES:
266 switch (format)
267 {
268 case GL_ALPHA: return sizeof(unsigned short);
269 case GL_LUMINANCE: return sizeof(unsigned short);
270 case GL_LUMINANCE_ALPHA: return sizeof(unsigned short) * 2;
271 case GL_RGB: return sizeof(unsigned short) * 3;
272 case GL_RGBA: return sizeof(unsigned short) * 4;
273 default: UNREACHABLE();
274 }
275 break;
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000276 default: UNREACHABLE();
277 }
278
279 return 0;
280}
281
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000282bool IsCubemapTextureTarget(GLenum target)
283{
284 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
285}
286
287bool IsTextureTarget(GLenum target)
288{
289 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
290}
291
292// Verify that format/type are one of the combinations from table 3.4.
293bool CheckTextureFormatType(GLenum format, GLenum type)
294{
295 switch (type)
296 {
297 case GL_UNSIGNED_BYTE:
298 switch (format)
299 {
300 case GL_RGBA:
daniel@transgaming.coma9198d92010-08-08 04:49:56 +0000301 case GL_BGRA_EXT:
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000302 case GL_RGB:
303 case GL_ALPHA:
304 case GL_LUMINANCE:
305 case GL_LUMINANCE_ALPHA:
306 return true;
307
308 default:
309 return false;
310 }
311
daniel@transgaming.com0a337e92010-08-28 17:38:27 +0000312 case GL_FLOAT:
313 case GL_HALF_FLOAT_OES:
314 switch (format)
315 {
316 case GL_RGBA:
317 case GL_RGB:
318 case GL_ALPHA:
319 case GL_LUMINANCE:
320 case GL_LUMINANCE_ALPHA:
321 return true;
322
323 default:
324 return false;
325 }
326
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000327 case GL_UNSIGNED_SHORT_4_4_4_4:
328 case GL_UNSIGNED_SHORT_5_5_5_1:
329 return (format == GL_RGBA);
330
331 case GL_UNSIGNED_SHORT_5_6_5:
332 return (format == GL_RGB);
333
334 default:
335 return false;
336 }
337}
338
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000339}
340
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000341namespace es2dx
342{
343
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000344D3DCMPFUNC ConvertComparison(GLenum comparison)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000345{
346 D3DCMPFUNC d3dComp = D3DCMP_ALWAYS;
347 switch (comparison)
348 {
349 case GL_NEVER: d3dComp = D3DCMP_NEVER; break;
350 case GL_ALWAYS: d3dComp = D3DCMP_ALWAYS; break;
351 case GL_LESS: d3dComp = D3DCMP_LESS; break;
352 case GL_LEQUAL: d3dComp = D3DCMP_LESSEQUAL; break;
353 case GL_EQUAL: d3dComp = D3DCMP_EQUAL; break;
354 case GL_GREATER: d3dComp = D3DCMP_GREATER; break;
355 case GL_GEQUAL: d3dComp = D3DCMP_GREATEREQUAL; break;
356 case GL_NOTEQUAL: d3dComp = D3DCMP_NOTEQUAL; break;
357 default: UNREACHABLE();
358 }
359
360 return d3dComp;
361}
362
363D3DCOLOR ConvertColor(gl::Color color)
364{
365 return D3DCOLOR_RGBA(gl::unorm<8>(color.red),
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000366 gl::unorm<8>(color.green),
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000367 gl::unorm<8>(color.blue),
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000368 gl::unorm<8>(color.alpha));
369}
370
371D3DBLEND ConvertBlendFunc(GLenum blend)
372{
373 D3DBLEND d3dBlend = D3DBLEND_ZERO;
374
375 switch (blend)
376 {
377 case GL_ZERO: d3dBlend = D3DBLEND_ZERO; break;
378 case GL_ONE: d3dBlend = D3DBLEND_ONE; break;
379 case GL_SRC_COLOR: d3dBlend = D3DBLEND_SRCCOLOR; break;
380 case GL_ONE_MINUS_SRC_COLOR: d3dBlend = D3DBLEND_INVSRCCOLOR; break;
381 case GL_DST_COLOR: d3dBlend = D3DBLEND_DESTCOLOR; break;
382 case GL_ONE_MINUS_DST_COLOR: d3dBlend = D3DBLEND_INVDESTCOLOR; break;
383 case GL_SRC_ALPHA: d3dBlend = D3DBLEND_SRCALPHA; break;
384 case GL_ONE_MINUS_SRC_ALPHA: d3dBlend = D3DBLEND_INVSRCALPHA; break;
385 case GL_DST_ALPHA: d3dBlend = D3DBLEND_DESTALPHA; break;
386 case GL_ONE_MINUS_DST_ALPHA: d3dBlend = D3DBLEND_INVDESTALPHA; break;
387 case GL_CONSTANT_COLOR: d3dBlend = D3DBLEND_BLENDFACTOR; break;
388 case GL_ONE_MINUS_CONSTANT_COLOR: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
389 case GL_CONSTANT_ALPHA: d3dBlend = D3DBLEND_BLENDFACTOR; break;
390 case GL_ONE_MINUS_CONSTANT_ALPHA: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
391 case GL_SRC_ALPHA_SATURATE: d3dBlend = D3DBLEND_SRCALPHASAT; break;
392 default: UNREACHABLE();
393 }
394
395 return d3dBlend;
396}
397
398D3DBLENDOP ConvertBlendOp(GLenum blendOp)
399{
400 D3DBLENDOP d3dBlendOp = D3DBLENDOP_ADD;
401
402 switch (blendOp)
403 {
404 case GL_FUNC_ADD: d3dBlendOp = D3DBLENDOP_ADD; break;
405 case GL_FUNC_SUBTRACT: d3dBlendOp = D3DBLENDOP_SUBTRACT; break;
406 case GL_FUNC_REVERSE_SUBTRACT: d3dBlendOp = D3DBLENDOP_REVSUBTRACT; break;
407 default: UNREACHABLE();
408 }
409
410 return d3dBlendOp;
411}
412
413D3DSTENCILOP ConvertStencilOp(GLenum stencilOp)
414{
415 D3DSTENCILOP d3dStencilOp = D3DSTENCILOP_KEEP;
416
417 switch (stencilOp)
418 {
419 case GL_ZERO: d3dStencilOp = D3DSTENCILOP_ZERO; break;
420 case GL_KEEP: d3dStencilOp = D3DSTENCILOP_KEEP; break;
421 case GL_REPLACE: d3dStencilOp = D3DSTENCILOP_REPLACE; break;
422 case GL_INCR: d3dStencilOp = D3DSTENCILOP_INCRSAT; break;
423 case GL_DECR: d3dStencilOp = D3DSTENCILOP_DECRSAT; break;
424 case GL_INVERT: d3dStencilOp = D3DSTENCILOP_INVERT; break;
425 case GL_INCR_WRAP: d3dStencilOp = D3DSTENCILOP_INCR; break;
426 case GL_DECR_WRAP: d3dStencilOp = D3DSTENCILOP_DECR; break;
427 default: UNREACHABLE();
428 }
429
430 return d3dStencilOp;
431}
432
433D3DTEXTUREADDRESS ConvertTextureWrap(GLenum wrap)
434{
435 D3DTEXTUREADDRESS d3dWrap = D3DTADDRESS_WRAP;
436
437 switch (wrap)
438 {
439 case GL_REPEAT: d3dWrap = D3DTADDRESS_WRAP; break;
440 case GL_CLAMP_TO_EDGE: d3dWrap = D3DTADDRESS_CLAMP; break;
441 case GL_MIRRORED_REPEAT: d3dWrap = D3DTADDRESS_MIRROR; break;
442 default: UNREACHABLE();
443 }
444
445 return d3dWrap;
446}
447
448D3DCULL ConvertCullMode(GLenum cullFace, GLenum frontFace)
449{
450 D3DCULL cull = D3DCULL_CCW;
451 switch (cullFace)
452 {
453 case GL_FRONT:
454 cull = (frontFace == GL_CCW ? D3DCULL_CW : D3DCULL_CCW);
455 break;
456 case GL_BACK:
457 cull = (frontFace == GL_CCW ? D3DCULL_CCW : D3DCULL_CW);
458 break;
459 case GL_FRONT_AND_BACK:
daniel@transgaming.comace5e662010-03-21 04:31:20 +0000460 cull = D3DCULL_NONE; // culling will be handled during draw
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000461 break;
462 default: UNREACHABLE();
463 }
464
465 return cull;
466}
467
468DWORD ConvertColorMask(bool red, bool green, bool blue, bool alpha)
469{
470 return (red ? D3DCOLORWRITEENABLE_RED : 0) |
471 (green ? D3DCOLORWRITEENABLE_GREEN : 0) |
472 (blue ? D3DCOLORWRITEENABLE_BLUE : 0) |
473 (alpha ? D3DCOLORWRITEENABLE_ALPHA : 0);
474}
475
476D3DTEXTUREFILTERTYPE ConvertMagFilter(GLenum magFilter)
477{
478 D3DTEXTUREFILTERTYPE d3dMagFilter = D3DTEXF_POINT;
479 switch (magFilter)
480 {
481 case GL_NEAREST: d3dMagFilter = D3DTEXF_POINT; break;
482 case GL_LINEAR: d3dMagFilter = D3DTEXF_LINEAR; break;
483 default: UNREACHABLE();
484 }
485
486 return d3dMagFilter;
487}
488
489void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter)
490{
491 switch (minFilter)
492 {
493 case GL_NEAREST:
494 *d3dMinFilter = D3DTEXF_POINT;
495 *d3dMipFilter = D3DTEXF_NONE;
496 break;
497 case GL_LINEAR:
498 *d3dMinFilter = D3DTEXF_LINEAR;
499 *d3dMipFilter = D3DTEXF_NONE;
500 break;
501 case GL_NEAREST_MIPMAP_NEAREST:
502 *d3dMinFilter = D3DTEXF_POINT;
503 *d3dMipFilter = D3DTEXF_POINT;
504 break;
505 case GL_LINEAR_MIPMAP_NEAREST:
506 *d3dMinFilter = D3DTEXF_LINEAR;
507 *d3dMipFilter = D3DTEXF_POINT;
508 break;
509 case GL_NEAREST_MIPMAP_LINEAR:
510 *d3dMinFilter = D3DTEXF_POINT;
511 *d3dMipFilter = D3DTEXF_LINEAR;
512 break;
513 case GL_LINEAR_MIPMAP_LINEAR:
514 *d3dMinFilter = D3DTEXF_LINEAR;
515 *d3dMipFilter = D3DTEXF_LINEAR;
516 break;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000517 default:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000518 *d3dMinFilter = D3DTEXF_POINT;
519 *d3dMipFilter = D3DTEXF_NONE;
520 UNREACHABLE();
521 }
522}
523
524unsigned int GetStencilSize(D3DFORMAT stencilFormat)
525{
526 switch(stencilFormat)
527 {
528 case D3DFMT_D24FS8:
529 case D3DFMT_D24S8:
530 return 8;
531 case D3DFMT_D24X4S4:
532 return 4;
533 case D3DFMT_D15S1:
534 return 1;
535 case D3DFMT_D16_LOCKABLE:
536 case D3DFMT_D32:
537 case D3DFMT_D24X8:
538 case D3DFMT_D32F_LOCKABLE:
539 case D3DFMT_D16:
540 return 0;
541// case D3DFMT_D32_LOCKABLE: return 0; // DirectX 9Ex only
542// case D3DFMT_S8_LOCKABLE: return 8; // DirectX 9Ex only
543 default: UNREACHABLE();
544 }
545 return 0;
546}
547
548unsigned int GetAlphaSize(D3DFORMAT colorFormat)
549{
550 switch (colorFormat)
551 {
daniel@transgaming.com1297d922010-09-01 15:47:47 +0000552 case D3DFMT_A16B16G16R16F:
553 return 16;
554 case D3DFMT_A32B32G32R32F:
555 return 32;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000556 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000557 return 2;
558 case D3DFMT_A8R8G8B8:
559 return 8;
560 case D3DFMT_A1R5G5B5:
561 return 1;
562 case D3DFMT_X8R8G8B8:
563 case D3DFMT_X1R5G5B5:
564 case D3DFMT_R5G6B5:
565 return 0;
566 default: UNREACHABLE();
567 }
568 return 0;
569}
570
571unsigned int GetRedSize(D3DFORMAT colorFormat)
572{
573 switch (colorFormat)
574 {
daniel@transgaming.com1297d922010-09-01 15:47:47 +0000575 case D3DFMT_A16B16G16R16F:
576 return 16;
577 case D3DFMT_A32B32G32R32F:
578 return 32;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000579 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000580 return 10;
581 case D3DFMT_A8R8G8B8:
582 case D3DFMT_X8R8G8B8:
583 return 8;
584 case D3DFMT_A1R5G5B5:
585 case D3DFMT_R5G6B5:
586 case D3DFMT_X1R5G5B5:
587 return 5;
588 default: UNREACHABLE();
589 }
590 return 0;
591}
592
593unsigned int GetGreenSize(D3DFORMAT colorFormat)
594{
595 switch (colorFormat)
596 {
daniel@transgaming.com1297d922010-09-01 15:47:47 +0000597 case D3DFMT_A16B16G16R16F:
598 return 16;
599 case D3DFMT_A32B32G32R32F:
600 return 32;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000601 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000602 return 10;
603 case D3DFMT_A8R8G8B8:
604 case D3DFMT_X8R8G8B8:
605 return 8;
606 case D3DFMT_A1R5G5B5:
607 case D3DFMT_X1R5G5B5:
608 return 5;
609 case D3DFMT_R5G6B5:
610 return 6;
611 default: UNREACHABLE();
612 }
613 return 0;
614}
615
616unsigned int GetBlueSize(D3DFORMAT colorFormat)
617{
618 switch (colorFormat)
619 {
daniel@transgaming.com1297d922010-09-01 15:47:47 +0000620 case D3DFMT_A16B16G16R16F:
621 return 16;
622 case D3DFMT_A32B32G32R32F:
623 return 32;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000624 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000625 return 10;
626 case D3DFMT_A8R8G8B8:
627 case D3DFMT_X8R8G8B8:
628 return 8;
629 case D3DFMT_A1R5G5B5:
630 case D3DFMT_R5G6B5:
631 case D3DFMT_X1R5G5B5:
632 return 5;
633 default: UNREACHABLE();
634 }
635 return 0;
636}
637
638unsigned int GetDepthSize(D3DFORMAT depthFormat)
639{
640 switch (depthFormat)
641 {
642 case D3DFMT_D16_LOCKABLE: return 16;
643 case D3DFMT_D32: return 32;
644 case D3DFMT_D15S1: return 15;
645 case D3DFMT_D24S8: return 24;
646 case D3DFMT_D24X8: return 24;
647 case D3DFMT_D24X4S4: return 24;
648 case D3DFMT_D16: return 16;
649 case D3DFMT_D32F_LOCKABLE: return 32;
650 case D3DFMT_D24FS8: return 24;
651// case D3DFMT_D32_LOCKABLE: return 32; // D3D9Ex only
652// case D3DFMT_S8_LOCKABLE: return 0; // D3D9Ex only
653 default:
654 UNREACHABLE();
655 }
656 return 0;
657}
658
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000659bool ConvertPrimitiveType(GLenum primitiveType, GLsizei primitiveCount,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000660 D3DPRIMITIVETYPE *d3dPrimitiveType, int *d3dPrimitiveCount)
661{
662 switch (primitiveType)
663 {
664 case GL_POINTS:
665 *d3dPrimitiveType = D3DPT_POINTLIST;
666 *d3dPrimitiveCount = primitiveCount;
667 break;
668 case GL_LINES:
669 *d3dPrimitiveType = D3DPT_LINELIST;
670 *d3dPrimitiveCount = primitiveCount / 2;
671 break;
672 case GL_LINE_LOOP:
daniel@transgaming.combf2b52a2010-04-20 18:53:03 +0000673 *d3dPrimitiveType = D3DPT_LINESTRIP;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000674 *d3dPrimitiveCount = primitiveCount;
675 break;
676 case GL_LINE_STRIP:
677 *d3dPrimitiveType = D3DPT_LINESTRIP;
678 *d3dPrimitiveCount = primitiveCount - 1;
679 break;
680 case GL_TRIANGLES:
681 *d3dPrimitiveType = D3DPT_TRIANGLELIST;
682 *d3dPrimitiveCount = primitiveCount / 3;
683 break;
684 case GL_TRIANGLE_STRIP:
685 *d3dPrimitiveType = D3DPT_TRIANGLESTRIP;
686 *d3dPrimitiveCount = primitiveCount - 2;
687 break;
688 case GL_TRIANGLE_FAN:
689 *d3dPrimitiveType = D3DPT_TRIANGLEFAN;
690 *d3dPrimitiveCount = primitiveCount - 2;
691 break;
692 default:
693 return false;
694 }
695
696 return true;
697}
698
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000699D3DFORMAT ConvertRenderbufferFormat(GLenum format)
700{
701 switch (format)
702 {
703 case GL_RGBA4:
daniel@transgaming.com63977542010-08-24 19:21:02 +0000704 case GL_RGB5_A1:
705 case GL_RGBA8_OES: return D3DFMT_A8R8G8B8;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000706 case GL_RGB565: return D3DFMT_R5G6B5;
daniel@transgaming.com63977542010-08-24 19:21:02 +0000707 case GL_RGB8_OES: return D3DFMT_X8R8G8B8;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000708 case GL_DEPTH_COMPONENT16:
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000709 case GL_STENCIL_INDEX8:
710 case GL_DEPTH24_STENCIL8_OES: return D3DFMT_D24S8;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000711 default: UNREACHABLE(); return D3DFMT_A8R8G8B8;
712 }
713}
714
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000715GLsizei GetSamplesFromMultisampleType(D3DMULTISAMPLE_TYPE type)
716{
717 if (type == D3DMULTISAMPLE_NONMASKABLE)
718 return 0;
719 else
720 return type;
721}
722
723D3DMULTISAMPLE_TYPE GetMultisampleTypeFromSamples(GLsizei samples)
724{
725 if (samples <= 1)
726 return D3DMULTISAMPLE_NONE;
727 else
728 return (D3DMULTISAMPLE_TYPE)samples;
729}
730
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000731}