blob: 5e228ba4cb5dfa7eec900412b45cd064b4cb5651 [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
186// Returns the size, in bytes, of a single texel in an Image
187int ComputePixelSize(GLenum format, GLenum type)
188{
189 switch (type)
190 {
191 case GL_UNSIGNED_BYTE:
192 switch (format)
193 {
194 case GL_ALPHA: return sizeof(unsigned char);
195 case GL_LUMINANCE: return sizeof(unsigned char);
196 case GL_LUMINANCE_ALPHA: return sizeof(unsigned char) * 2;
197 case GL_RGB: return sizeof(unsigned char) * 3;
198 case GL_RGBA: return sizeof(unsigned char) * 4;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +0000199 case GL_BGRA_EXT: return sizeof(unsigned char) * 4;
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000200 default: UNREACHABLE();
201 }
202 break;
203 case GL_UNSIGNED_SHORT_4_4_4_4:
204 case GL_UNSIGNED_SHORT_5_5_5_1:
205 case GL_UNSIGNED_SHORT_5_6_5:
206 return sizeof(unsigned short);
207 default: UNREACHABLE();
208 }
209
210 return 0;
211}
212
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000213bool IsCubemapTextureTarget(GLenum target)
214{
215 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
216}
217
218bool IsTextureTarget(GLenum target)
219{
220 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
221}
222
223// Verify that format/type are one of the combinations from table 3.4.
224bool CheckTextureFormatType(GLenum format, GLenum type)
225{
226 switch (type)
227 {
228 case GL_UNSIGNED_BYTE:
229 switch (format)
230 {
231 case GL_RGBA:
daniel@transgaming.coma9198d92010-08-08 04:49:56 +0000232 case GL_BGRA_EXT:
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000233 case GL_RGB:
234 case GL_ALPHA:
235 case GL_LUMINANCE:
236 case GL_LUMINANCE_ALPHA:
237 return true;
238
239 default:
240 return false;
241 }
242
243 case GL_UNSIGNED_SHORT_4_4_4_4:
244 case GL_UNSIGNED_SHORT_5_5_5_1:
245 return (format == GL_RGBA);
246
247 case GL_UNSIGNED_SHORT_5_6_5:
248 return (format == GL_RGB);
249
250 default:
251 return false;
252 }
253}
254
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000255}
256
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000257namespace es2dx
258{
259
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000260D3DCMPFUNC ConvertComparison(GLenum comparison)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000261{
262 D3DCMPFUNC d3dComp = D3DCMP_ALWAYS;
263 switch (comparison)
264 {
265 case GL_NEVER: d3dComp = D3DCMP_NEVER; break;
266 case GL_ALWAYS: d3dComp = D3DCMP_ALWAYS; break;
267 case GL_LESS: d3dComp = D3DCMP_LESS; break;
268 case GL_LEQUAL: d3dComp = D3DCMP_LESSEQUAL; break;
269 case GL_EQUAL: d3dComp = D3DCMP_EQUAL; break;
270 case GL_GREATER: d3dComp = D3DCMP_GREATER; break;
271 case GL_GEQUAL: d3dComp = D3DCMP_GREATEREQUAL; break;
272 case GL_NOTEQUAL: d3dComp = D3DCMP_NOTEQUAL; break;
273 default: UNREACHABLE();
274 }
275
276 return d3dComp;
277}
278
279D3DCOLOR ConvertColor(gl::Color color)
280{
281 return D3DCOLOR_RGBA(gl::unorm<8>(color.red),
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000282 gl::unorm<8>(color.green),
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000283 gl::unorm<8>(color.blue),
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000284 gl::unorm<8>(color.alpha));
285}
286
287D3DBLEND ConvertBlendFunc(GLenum blend)
288{
289 D3DBLEND d3dBlend = D3DBLEND_ZERO;
290
291 switch (blend)
292 {
293 case GL_ZERO: d3dBlend = D3DBLEND_ZERO; break;
294 case GL_ONE: d3dBlend = D3DBLEND_ONE; break;
295 case GL_SRC_COLOR: d3dBlend = D3DBLEND_SRCCOLOR; break;
296 case GL_ONE_MINUS_SRC_COLOR: d3dBlend = D3DBLEND_INVSRCCOLOR; break;
297 case GL_DST_COLOR: d3dBlend = D3DBLEND_DESTCOLOR; break;
298 case GL_ONE_MINUS_DST_COLOR: d3dBlend = D3DBLEND_INVDESTCOLOR; break;
299 case GL_SRC_ALPHA: d3dBlend = D3DBLEND_SRCALPHA; break;
300 case GL_ONE_MINUS_SRC_ALPHA: d3dBlend = D3DBLEND_INVSRCALPHA; break;
301 case GL_DST_ALPHA: d3dBlend = D3DBLEND_DESTALPHA; break;
302 case GL_ONE_MINUS_DST_ALPHA: d3dBlend = D3DBLEND_INVDESTALPHA; break;
303 case GL_CONSTANT_COLOR: d3dBlend = D3DBLEND_BLENDFACTOR; break;
304 case GL_ONE_MINUS_CONSTANT_COLOR: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
305 case GL_CONSTANT_ALPHA: d3dBlend = D3DBLEND_BLENDFACTOR; break;
306 case GL_ONE_MINUS_CONSTANT_ALPHA: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
307 case GL_SRC_ALPHA_SATURATE: d3dBlend = D3DBLEND_SRCALPHASAT; break;
308 default: UNREACHABLE();
309 }
310
311 return d3dBlend;
312}
313
314D3DBLENDOP ConvertBlendOp(GLenum blendOp)
315{
316 D3DBLENDOP d3dBlendOp = D3DBLENDOP_ADD;
317
318 switch (blendOp)
319 {
320 case GL_FUNC_ADD: d3dBlendOp = D3DBLENDOP_ADD; break;
321 case GL_FUNC_SUBTRACT: d3dBlendOp = D3DBLENDOP_SUBTRACT; break;
322 case GL_FUNC_REVERSE_SUBTRACT: d3dBlendOp = D3DBLENDOP_REVSUBTRACT; break;
323 default: UNREACHABLE();
324 }
325
326 return d3dBlendOp;
327}
328
329D3DSTENCILOP ConvertStencilOp(GLenum stencilOp)
330{
331 D3DSTENCILOP d3dStencilOp = D3DSTENCILOP_KEEP;
332
333 switch (stencilOp)
334 {
335 case GL_ZERO: d3dStencilOp = D3DSTENCILOP_ZERO; break;
336 case GL_KEEP: d3dStencilOp = D3DSTENCILOP_KEEP; break;
337 case GL_REPLACE: d3dStencilOp = D3DSTENCILOP_REPLACE; break;
338 case GL_INCR: d3dStencilOp = D3DSTENCILOP_INCRSAT; break;
339 case GL_DECR: d3dStencilOp = D3DSTENCILOP_DECRSAT; break;
340 case GL_INVERT: d3dStencilOp = D3DSTENCILOP_INVERT; break;
341 case GL_INCR_WRAP: d3dStencilOp = D3DSTENCILOP_INCR; break;
342 case GL_DECR_WRAP: d3dStencilOp = D3DSTENCILOP_DECR; break;
343 default: UNREACHABLE();
344 }
345
346 return d3dStencilOp;
347}
348
349D3DTEXTUREADDRESS ConvertTextureWrap(GLenum wrap)
350{
351 D3DTEXTUREADDRESS d3dWrap = D3DTADDRESS_WRAP;
352
353 switch (wrap)
354 {
355 case GL_REPEAT: d3dWrap = D3DTADDRESS_WRAP; break;
356 case GL_CLAMP_TO_EDGE: d3dWrap = D3DTADDRESS_CLAMP; break;
357 case GL_MIRRORED_REPEAT: d3dWrap = D3DTADDRESS_MIRROR; break;
358 default: UNREACHABLE();
359 }
360
361 return d3dWrap;
362}
363
364D3DCULL ConvertCullMode(GLenum cullFace, GLenum frontFace)
365{
366 D3DCULL cull = D3DCULL_CCW;
367 switch (cullFace)
368 {
369 case GL_FRONT:
370 cull = (frontFace == GL_CCW ? D3DCULL_CW : D3DCULL_CCW);
371 break;
372 case GL_BACK:
373 cull = (frontFace == GL_CCW ? D3DCULL_CCW : D3DCULL_CW);
374 break;
375 case GL_FRONT_AND_BACK:
daniel@transgaming.comace5e662010-03-21 04:31:20 +0000376 cull = D3DCULL_NONE; // culling will be handled during draw
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000377 break;
378 default: UNREACHABLE();
379 }
380
381 return cull;
382}
383
384DWORD ConvertColorMask(bool red, bool green, bool blue, bool alpha)
385{
386 return (red ? D3DCOLORWRITEENABLE_RED : 0) |
387 (green ? D3DCOLORWRITEENABLE_GREEN : 0) |
388 (blue ? D3DCOLORWRITEENABLE_BLUE : 0) |
389 (alpha ? D3DCOLORWRITEENABLE_ALPHA : 0);
390}
391
392D3DTEXTUREFILTERTYPE ConvertMagFilter(GLenum magFilter)
393{
394 D3DTEXTUREFILTERTYPE d3dMagFilter = D3DTEXF_POINT;
395 switch (magFilter)
396 {
397 case GL_NEAREST: d3dMagFilter = D3DTEXF_POINT; break;
398 case GL_LINEAR: d3dMagFilter = D3DTEXF_LINEAR; break;
399 default: UNREACHABLE();
400 }
401
402 return d3dMagFilter;
403}
404
405void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter)
406{
407 switch (minFilter)
408 {
409 case GL_NEAREST:
410 *d3dMinFilter = D3DTEXF_POINT;
411 *d3dMipFilter = D3DTEXF_NONE;
412 break;
413 case GL_LINEAR:
414 *d3dMinFilter = D3DTEXF_LINEAR;
415 *d3dMipFilter = D3DTEXF_NONE;
416 break;
417 case GL_NEAREST_MIPMAP_NEAREST:
418 *d3dMinFilter = D3DTEXF_POINT;
419 *d3dMipFilter = D3DTEXF_POINT;
420 break;
421 case GL_LINEAR_MIPMAP_NEAREST:
422 *d3dMinFilter = D3DTEXF_LINEAR;
423 *d3dMipFilter = D3DTEXF_POINT;
424 break;
425 case GL_NEAREST_MIPMAP_LINEAR:
426 *d3dMinFilter = D3DTEXF_POINT;
427 *d3dMipFilter = D3DTEXF_LINEAR;
428 break;
429 case GL_LINEAR_MIPMAP_LINEAR:
430 *d3dMinFilter = D3DTEXF_LINEAR;
431 *d3dMipFilter = D3DTEXF_LINEAR;
432 break;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000433 default:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000434 *d3dMinFilter = D3DTEXF_POINT;
435 *d3dMipFilter = D3DTEXF_NONE;
436 UNREACHABLE();
437 }
438}
439
440unsigned int GetStencilSize(D3DFORMAT stencilFormat)
441{
442 switch(stencilFormat)
443 {
444 case D3DFMT_D24FS8:
445 case D3DFMT_D24S8:
446 return 8;
447 case D3DFMT_D24X4S4:
448 return 4;
449 case D3DFMT_D15S1:
450 return 1;
451 case D3DFMT_D16_LOCKABLE:
452 case D3DFMT_D32:
453 case D3DFMT_D24X8:
454 case D3DFMT_D32F_LOCKABLE:
455 case D3DFMT_D16:
456 return 0;
457// case D3DFMT_D32_LOCKABLE: return 0; // DirectX 9Ex only
458// case D3DFMT_S8_LOCKABLE: return 8; // DirectX 9Ex only
459 default: UNREACHABLE();
460 }
461 return 0;
462}
463
464unsigned int GetAlphaSize(D3DFORMAT colorFormat)
465{
466 switch (colorFormat)
467 {
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000468 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000469 return 2;
470 case D3DFMT_A8R8G8B8:
471 return 8;
472 case D3DFMT_A1R5G5B5:
473 return 1;
474 case D3DFMT_X8R8G8B8:
475 case D3DFMT_X1R5G5B5:
476 case D3DFMT_R5G6B5:
477 return 0;
478 default: UNREACHABLE();
479 }
480 return 0;
481}
482
483unsigned int GetRedSize(D3DFORMAT colorFormat)
484{
485 switch (colorFormat)
486 {
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000487 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000488 return 10;
489 case D3DFMT_A8R8G8B8:
490 case D3DFMT_X8R8G8B8:
491 return 8;
492 case D3DFMT_A1R5G5B5:
493 case D3DFMT_R5G6B5:
494 case D3DFMT_X1R5G5B5:
495 return 5;
496 default: UNREACHABLE();
497 }
498 return 0;
499}
500
501unsigned int GetGreenSize(D3DFORMAT colorFormat)
502{
503 switch (colorFormat)
504 {
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000505 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000506 return 10;
507 case D3DFMT_A8R8G8B8:
508 case D3DFMT_X8R8G8B8:
509 return 8;
510 case D3DFMT_A1R5G5B5:
511 case D3DFMT_X1R5G5B5:
512 return 5;
513 case D3DFMT_R5G6B5:
514 return 6;
515 default: UNREACHABLE();
516 }
517 return 0;
518}
519
520unsigned int GetBlueSize(D3DFORMAT colorFormat)
521{
522 switch (colorFormat)
523 {
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000524 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000525 return 10;
526 case D3DFMT_A8R8G8B8:
527 case D3DFMT_X8R8G8B8:
528 return 8;
529 case D3DFMT_A1R5G5B5:
530 case D3DFMT_R5G6B5:
531 case D3DFMT_X1R5G5B5:
532 return 5;
533 default: UNREACHABLE();
534 }
535 return 0;
536}
537
538unsigned int GetDepthSize(D3DFORMAT depthFormat)
539{
540 switch (depthFormat)
541 {
542 case D3DFMT_D16_LOCKABLE: return 16;
543 case D3DFMT_D32: return 32;
544 case D3DFMT_D15S1: return 15;
545 case D3DFMT_D24S8: return 24;
546 case D3DFMT_D24X8: return 24;
547 case D3DFMT_D24X4S4: return 24;
548 case D3DFMT_D16: return 16;
549 case D3DFMT_D32F_LOCKABLE: return 32;
550 case D3DFMT_D24FS8: return 24;
551// case D3DFMT_D32_LOCKABLE: return 32; // D3D9Ex only
552// case D3DFMT_S8_LOCKABLE: return 0; // D3D9Ex only
553 default:
554 UNREACHABLE();
555 }
556 return 0;
557}
558
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000559bool ConvertPrimitiveType(GLenum primitiveType, GLsizei primitiveCount,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000560 D3DPRIMITIVETYPE *d3dPrimitiveType, int *d3dPrimitiveCount)
561{
562 switch (primitiveType)
563 {
564 case GL_POINTS:
565 *d3dPrimitiveType = D3DPT_POINTLIST;
566 *d3dPrimitiveCount = primitiveCount;
567 break;
568 case GL_LINES:
569 *d3dPrimitiveType = D3DPT_LINELIST;
570 *d3dPrimitiveCount = primitiveCount / 2;
571 break;
572 case GL_LINE_LOOP:
daniel@transgaming.combf2b52a2010-04-20 18:53:03 +0000573 *d3dPrimitiveType = D3DPT_LINESTRIP;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000574 *d3dPrimitiveCount = primitiveCount;
575 break;
576 case GL_LINE_STRIP:
577 *d3dPrimitiveType = D3DPT_LINESTRIP;
578 *d3dPrimitiveCount = primitiveCount - 1;
579 break;
580 case GL_TRIANGLES:
581 *d3dPrimitiveType = D3DPT_TRIANGLELIST;
582 *d3dPrimitiveCount = primitiveCount / 3;
583 break;
584 case GL_TRIANGLE_STRIP:
585 *d3dPrimitiveType = D3DPT_TRIANGLESTRIP;
586 *d3dPrimitiveCount = primitiveCount - 2;
587 break;
588 case GL_TRIANGLE_FAN:
589 *d3dPrimitiveType = D3DPT_TRIANGLEFAN;
590 *d3dPrimitiveCount = primitiveCount - 2;
591 break;
592 default:
593 return false;
594 }
595
596 return true;
597}
598
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000599D3DFORMAT ConvertRenderbufferFormat(GLenum format)
600{
601 switch (format)
602 {
603 case GL_RGBA4:
604 case GL_RGB5_A1: return D3DFMT_A8R8G8B8;
605 case GL_RGB565: return D3DFMT_R5G6B5;
606 case GL_DEPTH_COMPONENT16:
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000607 case GL_STENCIL_INDEX8:
608 case GL_DEPTH24_STENCIL8_OES: return D3DFMT_D24S8;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000609 default: UNREACHABLE(); return D3DFMT_A8R8G8B8;
610 }
611}
612
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000613GLsizei GetSamplesFromMultisampleType(D3DMULTISAMPLE_TYPE type)
614{
615 if (type == D3DMULTISAMPLE_NONMASKABLE)
616 return 0;
617 else
618 return type;
619}
620
621D3DMULTISAMPLE_TYPE GetMultisampleTypeFromSamples(GLsizei samples)
622{
623 if (samples <= 1)
624 return D3DMULTISAMPLE_NONE;
625 else
626 return (D3DMULTISAMPLE_TYPE)samples;
627}
628
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000629}