blob: 7fc2bc4c85058905acdb9c0a5cc5900f4fbc902a [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);
250 default: UNREACHABLE();
251 }
252
253 return 0;
254}
255
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000256bool IsCubemapTextureTarget(GLenum target)
257{
258 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
259}
260
261bool IsTextureTarget(GLenum target)
262{
263 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
264}
265
266// Verify that format/type are one of the combinations from table 3.4.
267bool CheckTextureFormatType(GLenum format, GLenum type)
268{
269 switch (type)
270 {
271 case GL_UNSIGNED_BYTE:
272 switch (format)
273 {
274 case GL_RGBA:
daniel@transgaming.coma9198d92010-08-08 04:49:56 +0000275 case GL_BGRA_EXT:
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000276 case GL_RGB:
277 case GL_ALPHA:
278 case GL_LUMINANCE:
279 case GL_LUMINANCE_ALPHA:
280 return true;
281
282 default:
283 return false;
284 }
285
286 case GL_UNSIGNED_SHORT_4_4_4_4:
287 case GL_UNSIGNED_SHORT_5_5_5_1:
288 return (format == GL_RGBA);
289
290 case GL_UNSIGNED_SHORT_5_6_5:
291 return (format == GL_RGB);
292
293 default:
294 return false;
295 }
296}
297
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000298}
299
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000300namespace es2dx
301{
302
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000303D3DCMPFUNC ConvertComparison(GLenum comparison)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000304{
305 D3DCMPFUNC d3dComp = D3DCMP_ALWAYS;
306 switch (comparison)
307 {
308 case GL_NEVER: d3dComp = D3DCMP_NEVER; break;
309 case GL_ALWAYS: d3dComp = D3DCMP_ALWAYS; break;
310 case GL_LESS: d3dComp = D3DCMP_LESS; break;
311 case GL_LEQUAL: d3dComp = D3DCMP_LESSEQUAL; break;
312 case GL_EQUAL: d3dComp = D3DCMP_EQUAL; break;
313 case GL_GREATER: d3dComp = D3DCMP_GREATER; break;
314 case GL_GEQUAL: d3dComp = D3DCMP_GREATEREQUAL; break;
315 case GL_NOTEQUAL: d3dComp = D3DCMP_NOTEQUAL; break;
316 default: UNREACHABLE();
317 }
318
319 return d3dComp;
320}
321
322D3DCOLOR ConvertColor(gl::Color color)
323{
324 return D3DCOLOR_RGBA(gl::unorm<8>(color.red),
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000325 gl::unorm<8>(color.green),
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000326 gl::unorm<8>(color.blue),
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000327 gl::unorm<8>(color.alpha));
328}
329
330D3DBLEND ConvertBlendFunc(GLenum blend)
331{
332 D3DBLEND d3dBlend = D3DBLEND_ZERO;
333
334 switch (blend)
335 {
336 case GL_ZERO: d3dBlend = D3DBLEND_ZERO; break;
337 case GL_ONE: d3dBlend = D3DBLEND_ONE; break;
338 case GL_SRC_COLOR: d3dBlend = D3DBLEND_SRCCOLOR; break;
339 case GL_ONE_MINUS_SRC_COLOR: d3dBlend = D3DBLEND_INVSRCCOLOR; break;
340 case GL_DST_COLOR: d3dBlend = D3DBLEND_DESTCOLOR; break;
341 case GL_ONE_MINUS_DST_COLOR: d3dBlend = D3DBLEND_INVDESTCOLOR; break;
342 case GL_SRC_ALPHA: d3dBlend = D3DBLEND_SRCALPHA; break;
343 case GL_ONE_MINUS_SRC_ALPHA: d3dBlend = D3DBLEND_INVSRCALPHA; break;
344 case GL_DST_ALPHA: d3dBlend = D3DBLEND_DESTALPHA; break;
345 case GL_ONE_MINUS_DST_ALPHA: d3dBlend = D3DBLEND_INVDESTALPHA; break;
346 case GL_CONSTANT_COLOR: d3dBlend = D3DBLEND_BLENDFACTOR; break;
347 case GL_ONE_MINUS_CONSTANT_COLOR: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
348 case GL_CONSTANT_ALPHA: d3dBlend = D3DBLEND_BLENDFACTOR; break;
349 case GL_ONE_MINUS_CONSTANT_ALPHA: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
350 case GL_SRC_ALPHA_SATURATE: d3dBlend = D3DBLEND_SRCALPHASAT; break;
351 default: UNREACHABLE();
352 }
353
354 return d3dBlend;
355}
356
357D3DBLENDOP ConvertBlendOp(GLenum blendOp)
358{
359 D3DBLENDOP d3dBlendOp = D3DBLENDOP_ADD;
360
361 switch (blendOp)
362 {
363 case GL_FUNC_ADD: d3dBlendOp = D3DBLENDOP_ADD; break;
364 case GL_FUNC_SUBTRACT: d3dBlendOp = D3DBLENDOP_SUBTRACT; break;
365 case GL_FUNC_REVERSE_SUBTRACT: d3dBlendOp = D3DBLENDOP_REVSUBTRACT; break;
366 default: UNREACHABLE();
367 }
368
369 return d3dBlendOp;
370}
371
372D3DSTENCILOP ConvertStencilOp(GLenum stencilOp)
373{
374 D3DSTENCILOP d3dStencilOp = D3DSTENCILOP_KEEP;
375
376 switch (stencilOp)
377 {
378 case GL_ZERO: d3dStencilOp = D3DSTENCILOP_ZERO; break;
379 case GL_KEEP: d3dStencilOp = D3DSTENCILOP_KEEP; break;
380 case GL_REPLACE: d3dStencilOp = D3DSTENCILOP_REPLACE; break;
381 case GL_INCR: d3dStencilOp = D3DSTENCILOP_INCRSAT; break;
382 case GL_DECR: d3dStencilOp = D3DSTENCILOP_DECRSAT; break;
383 case GL_INVERT: d3dStencilOp = D3DSTENCILOP_INVERT; break;
384 case GL_INCR_WRAP: d3dStencilOp = D3DSTENCILOP_INCR; break;
385 case GL_DECR_WRAP: d3dStencilOp = D3DSTENCILOP_DECR; break;
386 default: UNREACHABLE();
387 }
388
389 return d3dStencilOp;
390}
391
392D3DTEXTUREADDRESS ConvertTextureWrap(GLenum wrap)
393{
394 D3DTEXTUREADDRESS d3dWrap = D3DTADDRESS_WRAP;
395
396 switch (wrap)
397 {
398 case GL_REPEAT: d3dWrap = D3DTADDRESS_WRAP; break;
399 case GL_CLAMP_TO_EDGE: d3dWrap = D3DTADDRESS_CLAMP; break;
400 case GL_MIRRORED_REPEAT: d3dWrap = D3DTADDRESS_MIRROR; break;
401 default: UNREACHABLE();
402 }
403
404 return d3dWrap;
405}
406
407D3DCULL ConvertCullMode(GLenum cullFace, GLenum frontFace)
408{
409 D3DCULL cull = D3DCULL_CCW;
410 switch (cullFace)
411 {
412 case GL_FRONT:
413 cull = (frontFace == GL_CCW ? D3DCULL_CW : D3DCULL_CCW);
414 break;
415 case GL_BACK:
416 cull = (frontFace == GL_CCW ? D3DCULL_CCW : D3DCULL_CW);
417 break;
418 case GL_FRONT_AND_BACK:
daniel@transgaming.comace5e662010-03-21 04:31:20 +0000419 cull = D3DCULL_NONE; // culling will be handled during draw
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000420 break;
421 default: UNREACHABLE();
422 }
423
424 return cull;
425}
426
427DWORD ConvertColorMask(bool red, bool green, bool blue, bool alpha)
428{
429 return (red ? D3DCOLORWRITEENABLE_RED : 0) |
430 (green ? D3DCOLORWRITEENABLE_GREEN : 0) |
431 (blue ? D3DCOLORWRITEENABLE_BLUE : 0) |
432 (alpha ? D3DCOLORWRITEENABLE_ALPHA : 0);
433}
434
435D3DTEXTUREFILTERTYPE ConvertMagFilter(GLenum magFilter)
436{
437 D3DTEXTUREFILTERTYPE d3dMagFilter = D3DTEXF_POINT;
438 switch (magFilter)
439 {
440 case GL_NEAREST: d3dMagFilter = D3DTEXF_POINT; break;
441 case GL_LINEAR: d3dMagFilter = D3DTEXF_LINEAR; break;
442 default: UNREACHABLE();
443 }
444
445 return d3dMagFilter;
446}
447
448void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter)
449{
450 switch (minFilter)
451 {
452 case GL_NEAREST:
453 *d3dMinFilter = D3DTEXF_POINT;
454 *d3dMipFilter = D3DTEXF_NONE;
455 break;
456 case GL_LINEAR:
457 *d3dMinFilter = D3DTEXF_LINEAR;
458 *d3dMipFilter = D3DTEXF_NONE;
459 break;
460 case GL_NEAREST_MIPMAP_NEAREST:
461 *d3dMinFilter = D3DTEXF_POINT;
462 *d3dMipFilter = D3DTEXF_POINT;
463 break;
464 case GL_LINEAR_MIPMAP_NEAREST:
465 *d3dMinFilter = D3DTEXF_LINEAR;
466 *d3dMipFilter = D3DTEXF_POINT;
467 break;
468 case GL_NEAREST_MIPMAP_LINEAR:
469 *d3dMinFilter = D3DTEXF_POINT;
470 *d3dMipFilter = D3DTEXF_LINEAR;
471 break;
472 case GL_LINEAR_MIPMAP_LINEAR:
473 *d3dMinFilter = D3DTEXF_LINEAR;
474 *d3dMipFilter = D3DTEXF_LINEAR;
475 break;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000476 default:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000477 *d3dMinFilter = D3DTEXF_POINT;
478 *d3dMipFilter = D3DTEXF_NONE;
479 UNREACHABLE();
480 }
481}
482
483unsigned int GetStencilSize(D3DFORMAT stencilFormat)
484{
485 switch(stencilFormat)
486 {
487 case D3DFMT_D24FS8:
488 case D3DFMT_D24S8:
489 return 8;
490 case D3DFMT_D24X4S4:
491 return 4;
492 case D3DFMT_D15S1:
493 return 1;
494 case D3DFMT_D16_LOCKABLE:
495 case D3DFMT_D32:
496 case D3DFMT_D24X8:
497 case D3DFMT_D32F_LOCKABLE:
498 case D3DFMT_D16:
499 return 0;
500// case D3DFMT_D32_LOCKABLE: return 0; // DirectX 9Ex only
501// case D3DFMT_S8_LOCKABLE: return 8; // DirectX 9Ex only
502 default: UNREACHABLE();
503 }
504 return 0;
505}
506
507unsigned int GetAlphaSize(D3DFORMAT colorFormat)
508{
509 switch (colorFormat)
510 {
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000511 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000512 return 2;
513 case D3DFMT_A8R8G8B8:
514 return 8;
515 case D3DFMT_A1R5G5B5:
516 return 1;
517 case D3DFMT_X8R8G8B8:
518 case D3DFMT_X1R5G5B5:
519 case D3DFMT_R5G6B5:
520 return 0;
521 default: UNREACHABLE();
522 }
523 return 0;
524}
525
526unsigned int GetRedSize(D3DFORMAT colorFormat)
527{
528 switch (colorFormat)
529 {
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000530 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000531 return 10;
532 case D3DFMT_A8R8G8B8:
533 case D3DFMT_X8R8G8B8:
534 return 8;
535 case D3DFMT_A1R5G5B5:
536 case D3DFMT_R5G6B5:
537 case D3DFMT_X1R5G5B5:
538 return 5;
539 default: UNREACHABLE();
540 }
541 return 0;
542}
543
544unsigned int GetGreenSize(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 10;
550 case D3DFMT_A8R8G8B8:
551 case D3DFMT_X8R8G8B8:
552 return 8;
553 case D3DFMT_A1R5G5B5:
554 case D3DFMT_X1R5G5B5:
555 return 5;
556 case D3DFMT_R5G6B5:
557 return 6;
558 default: UNREACHABLE();
559 }
560 return 0;
561}
562
563unsigned int GetBlueSize(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 GetDepthSize(D3DFORMAT depthFormat)
582{
583 switch (depthFormat)
584 {
585 case D3DFMT_D16_LOCKABLE: return 16;
586 case D3DFMT_D32: return 32;
587 case D3DFMT_D15S1: return 15;
588 case D3DFMT_D24S8: return 24;
589 case D3DFMT_D24X8: return 24;
590 case D3DFMT_D24X4S4: return 24;
591 case D3DFMT_D16: return 16;
592 case D3DFMT_D32F_LOCKABLE: return 32;
593 case D3DFMT_D24FS8: return 24;
594// case D3DFMT_D32_LOCKABLE: return 32; // D3D9Ex only
595// case D3DFMT_S8_LOCKABLE: return 0; // D3D9Ex only
596 default:
597 UNREACHABLE();
598 }
599 return 0;
600}
601
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000602bool ConvertPrimitiveType(GLenum primitiveType, GLsizei primitiveCount,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000603 D3DPRIMITIVETYPE *d3dPrimitiveType, int *d3dPrimitiveCount)
604{
605 switch (primitiveType)
606 {
607 case GL_POINTS:
608 *d3dPrimitiveType = D3DPT_POINTLIST;
609 *d3dPrimitiveCount = primitiveCount;
610 break;
611 case GL_LINES:
612 *d3dPrimitiveType = D3DPT_LINELIST;
613 *d3dPrimitiveCount = primitiveCount / 2;
614 break;
615 case GL_LINE_LOOP:
daniel@transgaming.combf2b52a2010-04-20 18:53:03 +0000616 *d3dPrimitiveType = D3DPT_LINESTRIP;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000617 *d3dPrimitiveCount = primitiveCount;
618 break;
619 case GL_LINE_STRIP:
620 *d3dPrimitiveType = D3DPT_LINESTRIP;
621 *d3dPrimitiveCount = primitiveCount - 1;
622 break;
623 case GL_TRIANGLES:
624 *d3dPrimitiveType = D3DPT_TRIANGLELIST;
625 *d3dPrimitiveCount = primitiveCount / 3;
626 break;
627 case GL_TRIANGLE_STRIP:
628 *d3dPrimitiveType = D3DPT_TRIANGLESTRIP;
629 *d3dPrimitiveCount = primitiveCount - 2;
630 break;
631 case GL_TRIANGLE_FAN:
632 *d3dPrimitiveType = D3DPT_TRIANGLEFAN;
633 *d3dPrimitiveCount = primitiveCount - 2;
634 break;
635 default:
636 return false;
637 }
638
639 return true;
640}
641
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000642D3DFORMAT ConvertRenderbufferFormat(GLenum format)
643{
644 switch (format)
645 {
646 case GL_RGBA4:
daniel@transgaming.com63977542010-08-24 19:21:02 +0000647 case GL_RGB5_A1:
648 case GL_RGBA8_OES: return D3DFMT_A8R8G8B8;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000649 case GL_RGB565: return D3DFMT_R5G6B5;
daniel@transgaming.com63977542010-08-24 19:21:02 +0000650 case GL_RGB8_OES: return D3DFMT_X8R8G8B8;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000651 case GL_DEPTH_COMPONENT16:
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000652 case GL_STENCIL_INDEX8:
653 case GL_DEPTH24_STENCIL8_OES: return D3DFMT_D24S8;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000654 default: UNREACHABLE(); return D3DFMT_A8R8G8B8;
655 }
656}
657
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000658GLsizei GetSamplesFromMultisampleType(D3DMULTISAMPLE_TYPE type)
659{
660 if (type == D3DMULTISAMPLE_NONMASKABLE)
661 return 0;
662 else
663 return type;
664}
665
666D3DMULTISAMPLE_TYPE GetMultisampleTypeFromSamples(GLsizei samples)
667{
668 if (samples <= 1)
669 return D3DMULTISAMPLE_NONE;
670 else
671 return (D3DMULTISAMPLE_TYPE)samples;
672}
673
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000674}