blob: 850fbdf2fb0f2f013f08739eea4f2871b98637a8 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
daniel@transgaming.com4f677302012-06-19 15:29:51 +00002// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// 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>
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000012#include <stdio.h>
13#include <windows.h>
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +000014
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000015#include "common/debug.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000016
17#include "libGLESv2/mathutil.h"
18#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000019
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000020namespace gl
21{
22
daniel@transgaming.comedc31502011-11-12 03:14:56 +000023// This is how much data the application expects for a uniform
24int UniformExternalComponentCount(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000025{
26 switch (type)
27 {
28 case GL_BOOL:
29 case GL_FLOAT:
30 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +000031 case GL_SAMPLER_2D:
32 case GL_SAMPLER_CUBE:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000033 return 1;
34 case GL_BOOL_VEC2:
35 case GL_FLOAT_VEC2:
36 case GL_INT_VEC2:
37 return 2;
38 case GL_INT_VEC3:
39 case GL_FLOAT_VEC3:
40 case GL_BOOL_VEC3:
41 return 3;
42 case GL_BOOL_VEC4:
43 case GL_FLOAT_VEC4:
44 case GL_INT_VEC4:
45 case GL_FLOAT_MAT2:
46 return 4;
47 case GL_FLOAT_MAT3:
48 return 9;
49 case GL_FLOAT_MAT4:
50 return 16;
51 default:
52 UNREACHABLE();
53 }
54
55 return 0;
56}
57
jbauman@chromium.org72e8f442011-10-20 00:22:01 +000058// This is how much data we actually store for a uniform
59int UniformInternalComponentCount(GLenum type)
60{
61 switch (type)
62 {
63 case GL_BOOL:
64 case GL_INT:
65 case GL_SAMPLER_2D:
66 case GL_SAMPLER_CUBE:
67 return 1;
68 case GL_BOOL_VEC2:
69 case GL_INT_VEC2:
70 return 2;
71 case GL_INT_VEC3:
72 case GL_BOOL_VEC3:
73 return 3;
74 case GL_FLOAT:
75 case GL_FLOAT_VEC2:
76 case GL_FLOAT_VEC3:
77 case GL_BOOL_VEC4:
78 case GL_FLOAT_VEC4:
79 case GL_INT_VEC4:
80 return 4;
81 case GL_FLOAT_MAT2:
82 return 8;
83 case GL_FLOAT_MAT3:
84 return 12;
85 case GL_FLOAT_MAT4:
86 return 16;
87 default:
88 UNREACHABLE();
89 }
90
91 return 0;
92}
93
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +000094GLenum UniformComponentType(GLenum type)
95{
96 switch(type)
97 {
98 case GL_BOOL:
99 case GL_BOOL_VEC2:
100 case GL_BOOL_VEC3:
101 case GL_BOOL_VEC4:
102 return GL_BOOL;
103 case GL_FLOAT:
104 case GL_FLOAT_VEC2:
105 case GL_FLOAT_VEC3:
106 case GL_FLOAT_VEC4:
107 case GL_FLOAT_MAT2:
108 case GL_FLOAT_MAT3:
109 case GL_FLOAT_MAT4:
110 return GL_FLOAT;
111 case GL_INT:
daniel@transgaming.coma9cd70a2010-09-15 15:48:57 +0000112 case GL_SAMPLER_2D:
113 case GL_SAMPLER_CUBE:
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000114 case GL_INT_VEC2:
115 case GL_INT_VEC3:
116 case GL_INT_VEC4:
117 return GL_INT;
118 default:
119 UNREACHABLE();
120 }
121
122 return GL_NONE;
123}
124
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000125size_t UniformComponentSize(GLenum type)
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000126{
127 switch(type)
128 {
daniel@transgaming.com4bf6fd02011-11-12 03:18:16 +0000129 case GL_BOOL: return sizeof(GLint);
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000130 case GL_FLOAT: return sizeof(GLfloat);
131 case GL_INT: return sizeof(GLint);
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000132 default: UNREACHABLE();
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000133 }
134
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000135 return 0;
136}
137
daniel@transgaming.come918ea22011-11-12 03:15:28 +0000138size_t UniformInternalSize(GLenum type)
jbauman@chromium.org72e8f442011-10-20 00:22:01 +0000139{
140 return UniformComponentSize(UniformComponentType(type)) * UniformInternalComponentCount(type);
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000141}
142
daniel@transgaming.com47c60052011-11-12 03:17:50 +0000143size_t UniformExternalSize(GLenum type)
144{
145 return UniformComponentSize(UniformComponentType(type)) * UniformExternalComponentCount(type);
146}
147
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000148int VariableRowCount(GLenum type)
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000149{
150 switch (type)
151 {
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000152 case GL_NONE:
153 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000154 case GL_BOOL:
155 case GL_FLOAT:
156 case GL_INT:
157 case GL_BOOL_VEC2:
158 case GL_FLOAT_VEC2:
159 case GL_INT_VEC2:
160 case GL_INT_VEC3:
161 case GL_FLOAT_VEC3:
162 case GL_BOOL_VEC3:
163 case GL_BOOL_VEC4:
164 case GL_FLOAT_VEC4:
165 case GL_INT_VEC4:
166 return 1;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000167 case GL_FLOAT_MAT2:
168 return 2;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000169 case GL_FLOAT_MAT3:
170 return 3;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000171 case GL_FLOAT_MAT4:
172 return 4;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000173 default:
174 UNREACHABLE();
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000175 }
daniel@transgaming.com4af7acc2010-05-14 17:30:53 +0000176
177 return 0;
178}
179
180int VariableColumnCount(GLenum type)
181{
182 switch (type)
183 {
184 case GL_NONE:
185 return 0;
186 case GL_BOOL:
187 case GL_FLOAT:
188 case GL_INT:
189 return 1;
190 case GL_BOOL_VEC2:
191 case GL_FLOAT_VEC2:
192 case GL_INT_VEC2:
193 case GL_FLOAT_MAT2:
194 return 2;
195 case GL_INT_VEC3:
196 case GL_FLOAT_VEC3:
197 case GL_BOOL_VEC3:
198 case GL_FLOAT_MAT3:
199 return 3;
200 case GL_BOOL_VEC4:
201 case GL_FLOAT_VEC4:
202 case GL_INT_VEC4:
203 case GL_FLOAT_MAT4:
204 return 4;
205 default:
206 UNREACHABLE();
207 }
208
209 return 0;
daniel@transgaming.com0b6b8342010-04-26 15:33:45 +0000210}
211
212int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
213{
214 ASSERT(allocationSize <= bitsSize);
215
216 unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
217
218 for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
219 {
220 if ((*bits & mask) == 0)
221 {
222 *bits |= mask;
223 return i;
224 }
225
226 mask <<= 1;
227 }
228
229 return -1;
230}
231
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000232GLsizei ComputePitch(GLsizei width, GLint internalformat, GLint alignment)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000233{
234 ASSERT(alignment > 0 && isPow2(alignment));
235
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000236 GLsizei rawPitch = ComputePixelSize(internalformat) * width;
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000237 return (rawPitch + alignment - 1) & ~(alignment - 1);
238}
239
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000240GLsizei ComputeCompressedPitch(GLsizei width, GLenum internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000241{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000242 return ComputeCompressedSize(width, 1, internalformat);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000243}
244
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000245GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000246{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000247 switch (internalformat)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000248 {
249 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
250 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +0000251 return 8 * ((width + 3) / 4) * ((height + 3) / 4);
gman@chromium.org50c526d2011-08-10 05:19:44 +0000252 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
253 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +0000254 return 16 * ((width + 3) / 4) * ((height + 3) / 4);
daniel@transgaming.com01868132010-08-24 19:21:17 +0000255 default:
256 return 0;
257 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000258}
259
260bool IsCompressed(GLenum format)
261{
262 if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
gman@chromium.org50c526d2011-08-10 05:19:44 +0000263 format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||
264 format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE ||
265 format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000266 {
267 return true;
268 }
269 else
270 {
271 return false;
272 }
273}
274
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000275bool IsDepthTexture(GLenum format)
276{
277 if (format == GL_DEPTH_COMPONENT ||
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000278 format == GL_DEPTH_STENCIL_OES ||
279 format == GL_DEPTH_COMPONENT16 ||
280 format == GL_DEPTH_COMPONENT32_OES ||
281 format == GL_DEPTH24_STENCIL8_OES)
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000282 {
283 return true;
284 }
285
286 return false;
287}
288
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000289bool IsStencilTexture(GLenum format)
290{
291 if (format == GL_DEPTH_STENCIL_OES ||
292 format == GL_DEPTH24_STENCIL8_OES)
293 {
294 return true;
295 }
296
297 return false;
298}
299
daniel@transgaming.comb9d7e6f2012-10-31 19:08:32 +0000300void MakeValidSize(bool isImage, bool isCompressed, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset)
301{
302 int upsampleCount = 0;
303
304 if (isCompressed)
305 {
306 // Don't expand the size of full textures that are at least 4x4
307 // already.
308 if (isImage || *requestWidth < 4 || *requestHeight < 4)
309 {
310 while (*requestWidth % 4 != 0 || *requestHeight % 4 != 0)
311 {
312 *requestWidth <<= 1;
313 *requestHeight <<= 1;
314 upsampleCount++;
315 }
316 }
317 }
318 *levelOffset = upsampleCount;
319}
320
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000321// Returns the size, in bytes, of a single texel in an Image
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000322int ComputePixelSize(GLint internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000323{
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000324 switch (internalformat)
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000325 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000326 case GL_ALPHA8_EXT: return sizeof(unsigned char);
327 case GL_LUMINANCE8_EXT: return sizeof(unsigned char);
328 case GL_ALPHA32F_EXT: return sizeof(float);
329 case GL_LUMINANCE32F_EXT: return sizeof(float);
330 case GL_ALPHA16F_EXT: return sizeof(unsigned short);
331 case GL_LUMINANCE16F_EXT: return sizeof(unsigned short);
332 case GL_LUMINANCE8_ALPHA8_EXT: return sizeof(unsigned char) * 2;
333 case GL_LUMINANCE_ALPHA32F_EXT: return sizeof(float) * 2;
334 case GL_LUMINANCE_ALPHA16F_EXT: return sizeof(unsigned short) * 2;
335 case GL_RGB8_OES: return sizeof(unsigned char) * 3;
336 case GL_RGB565: return sizeof(unsigned short);
337 case GL_RGB32F_EXT: return sizeof(float) * 3;
338 case GL_RGB16F_EXT: return sizeof(unsigned short) * 3;
339 case GL_RGBA8_OES: return sizeof(unsigned char) * 4;
340 case GL_RGBA4: return sizeof(unsigned short);
341 case GL_RGB5_A1: return sizeof(unsigned short);
342 case GL_RGBA32F_EXT: return sizeof(float) * 4;
343 case GL_RGBA16F_EXT: return sizeof(unsigned short) * 4;
344 case GL_BGRA8_EXT: return sizeof(unsigned char) * 4;
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000345 case GL_BGRA4_ANGLEX: return sizeof(unsigned short);
346 case GL_BGR5_A1_ANGLEX: return sizeof(unsigned short);
daniel@transgaming.com713914b2010-05-04 03:35:17 +0000347 default: UNREACHABLE();
348 }
349
350 return 0;
351}
352
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000353bool IsCubemapTextureTarget(GLenum target)
354{
355 return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
356}
357
apatrick@chromium.org551022e2012-01-23 19:56:54 +0000358bool IsInternalTextureTarget(GLenum target)
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000359{
360 return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
361}
362
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000363GLint ConvertSizedInternalFormat(GLenum format, GLenum type)
364{
365 switch (format)
366 {
367 case GL_ALPHA:
368 switch (type)
369 {
370 case GL_UNSIGNED_BYTE: return GL_ALPHA8_EXT;
371 case GL_FLOAT: return GL_ALPHA32F_EXT;
372 case GL_HALF_FLOAT_OES: return GL_ALPHA16F_EXT;
373 default: UNIMPLEMENTED();
374 }
375 break;
376 case GL_LUMINANCE:
377 switch (type)
378 {
379 case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_EXT;
380 case GL_FLOAT: return GL_LUMINANCE32F_EXT;
381 case GL_HALF_FLOAT_OES: return GL_LUMINANCE16F_EXT;
382 default: UNIMPLEMENTED();
383 }
384 break;
385 case GL_LUMINANCE_ALPHA:
386 switch (type)
387 {
388 case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_ALPHA8_EXT;
389 case GL_FLOAT: return GL_LUMINANCE_ALPHA32F_EXT;
390 case GL_HALF_FLOAT_OES: return GL_LUMINANCE_ALPHA16F_EXT;
391 default: UNIMPLEMENTED();
392 }
393 break;
394 case GL_RGB:
395 switch (type)
396 {
397 case GL_UNSIGNED_BYTE: return GL_RGB8_OES;
398 case GL_UNSIGNED_SHORT_5_6_5: return GL_RGB565;
399 case GL_FLOAT: return GL_RGB32F_EXT;
400 case GL_HALF_FLOAT_OES: return GL_RGB16F_EXT;
401 default: UNIMPLEMENTED();
402 }
403 break;
404 case GL_RGBA:
405 switch (type)
406 {
407 case GL_UNSIGNED_BYTE: return GL_RGBA8_OES;
408 case GL_UNSIGNED_SHORT_4_4_4_4: return GL_RGBA4;
409 case GL_UNSIGNED_SHORT_5_5_5_1: return GL_RGB5_A1;
410 case GL_FLOAT: return GL_RGBA32F_EXT;
411 case GL_HALF_FLOAT_OES: return GL_RGBA16F_EXT;
412 break;
413 default: UNIMPLEMENTED();
414 }
415 break;
416 case GL_BGRA_EXT:
417 switch (type)
418 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000419 case GL_UNSIGNED_BYTE: return GL_BGRA8_EXT;
daniel@transgaming.com6b1a0a02012-10-17 18:22:47 +0000420 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return GL_BGRA4_ANGLEX;
421 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return GL_BGR5_A1_ANGLEX;
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000422 default: UNIMPLEMENTED();
423 }
424 break;
425 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
426 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
427 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
428 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
429 return format;
430 case GL_DEPTH_COMPONENT:
431 switch (type)
432 {
433 case GL_UNSIGNED_SHORT: return GL_DEPTH_COMPONENT16;
434 case GL_UNSIGNED_INT: return GL_DEPTH_COMPONENT32_OES;
435 default: UNIMPLEMENTED();
436 }
437 break;
438 case GL_DEPTH_STENCIL_OES:
439 switch (type)
440 {
441 case GL_UNSIGNED_INT_24_8_OES: return GL_DEPTH24_STENCIL8_OES;
442 default: UNIMPLEMENTED();
443 }
444 break;
445 default:
446 UNIMPLEMENTED();
447 }
448
449 return GL_NONE;
450}
451
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000452GLenum ExtractFormat(GLenum internalformat)
453{
454 switch (internalformat)
455 {
daniel@transgaming.come1077362011-11-11 04:16:50 +0000456 case GL_RGB565: return GL_RGB;
457 case GL_RGBA4: return GL_RGBA;
458 case GL_RGB5_A1: return GL_RGBA;
459 case GL_RGB8_OES: return GL_RGB;
460 case GL_RGBA8_OES: return GL_RGBA;
461 case GL_LUMINANCE8_ALPHA8_EXT: return GL_LUMINANCE_ALPHA;
462 case GL_LUMINANCE8_EXT: return GL_LUMINANCE;
463 case GL_ALPHA8_EXT: return GL_ALPHA;
464 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
465 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
466 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
467 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +0000468 case GL_RGBA32F_EXT: return GL_RGBA;
469 case GL_RGB32F_EXT: return GL_RGB;
470 case GL_ALPHA32F_EXT: return GL_ALPHA;
471 case GL_LUMINANCE32F_EXT: return GL_LUMINANCE;
472 case GL_LUMINANCE_ALPHA32F_EXT: return GL_LUMINANCE_ALPHA;
473 case GL_RGBA16F_EXT: return GL_RGBA;
474 case GL_RGB16F_EXT: return GL_RGB;
475 case GL_ALPHA16F_EXT: return GL_ALPHA;
476 case GL_LUMINANCE16F_EXT: return GL_LUMINANCE;
477 case GL_LUMINANCE_ALPHA16F_EXT: return GL_LUMINANCE_ALPHA;
478 case GL_BGRA8_EXT: return GL_BGRA_EXT;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000479 case GL_DEPTH_COMPONENT16: return GL_DEPTH_COMPONENT;
480 case GL_DEPTH_COMPONENT32_OES: return GL_DEPTH_COMPONENT;
481 case GL_DEPTH24_STENCIL8_OES: return GL_DEPTH_STENCIL_OES;
daniel@transgaming.come1077362011-11-11 04:16:50 +0000482 default: return GL_NONE; // Unsupported
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000483 }
484}
485
486GLenum ExtractType(GLenum internalformat)
487{
488 switch (internalformat)
489 {
daniel@transgaming.come1077362011-11-11 04:16:50 +0000490 case GL_RGB565: return GL_UNSIGNED_SHORT_5_6_5;
491 case GL_RGBA4: return GL_UNSIGNED_SHORT_4_4_4_4;
492 case GL_RGB5_A1: return GL_UNSIGNED_SHORT_5_5_5_1;
493 case GL_RGB8_OES: return GL_UNSIGNED_BYTE;
494 case GL_RGBA8_OES: return GL_UNSIGNED_BYTE;
495 case GL_LUMINANCE8_ALPHA8_EXT: return GL_UNSIGNED_BYTE;
496 case GL_LUMINANCE8_EXT: return GL_UNSIGNED_BYTE;
497 case GL_ALPHA8_EXT: return GL_UNSIGNED_BYTE;
498 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE;
499 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GL_UNSIGNED_BYTE;
500 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: return GL_UNSIGNED_BYTE;
501 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: return GL_UNSIGNED_BYTE;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +0000502 case GL_RGBA32F_EXT: return GL_FLOAT;
503 case GL_RGB32F_EXT: return GL_FLOAT;
504 case GL_ALPHA32F_EXT: return GL_FLOAT;
505 case GL_LUMINANCE32F_EXT: return GL_FLOAT;
506 case GL_LUMINANCE_ALPHA32F_EXT: return GL_FLOAT;
507 case GL_RGBA16F_EXT: return GL_HALF_FLOAT_OES;
508 case GL_RGB16F_EXT: return GL_HALF_FLOAT_OES;
509 case GL_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
510 case GL_LUMINANCE16F_EXT: return GL_HALF_FLOAT_OES;
511 case GL_LUMINANCE_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
512 case GL_BGRA8_EXT: return GL_UNSIGNED_BYTE;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +0000513 case GL_DEPTH_COMPONENT16: return GL_UNSIGNED_SHORT;
514 case GL_DEPTH_COMPONENT32_OES: return GL_UNSIGNED_INT;
515 case GL_DEPTH24_STENCIL8_OES: return GL_UNSIGNED_INT_24_8_OES;
daniel@transgaming.come1077362011-11-11 04:16:50 +0000516 default: return GL_NONE; // Unsupported
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000517 }
518}
519
daniel@transgaming.comedc19182010-10-15 17:57:55 +0000520bool IsColorRenderable(GLenum internalformat)
521{
522 switch (internalformat)
523 {
524 case GL_RGBA4:
525 case GL_RGB5_A1:
526 case GL_RGB565:
527 case GL_RGB8_OES:
528 case GL_RGBA8_OES:
529 return true;
530 case GL_DEPTH_COMPONENT16:
531 case GL_STENCIL_INDEX8:
532 case GL_DEPTH24_STENCIL8_OES:
533 return false;
534 default:
535 UNIMPLEMENTED();
536 }
537
538 return false;
539}
540
541bool IsDepthRenderable(GLenum internalformat)
542{
543 switch (internalformat)
544 {
545 case GL_DEPTH_COMPONENT16:
546 case GL_DEPTH24_STENCIL8_OES:
547 return true;
548 case GL_STENCIL_INDEX8:
549 case GL_RGBA4:
550 case GL_RGB5_A1:
551 case GL_RGB565:
552 case GL_RGB8_OES:
553 case GL_RGBA8_OES:
554 return false;
555 default:
556 UNIMPLEMENTED();
557 }
558
559 return false;
560}
561
562bool IsStencilRenderable(GLenum internalformat)
563{
564 switch (internalformat)
565 {
566 case GL_STENCIL_INDEX8:
567 case GL_DEPTH24_STENCIL8_OES:
568 return true;
569 case GL_RGBA4:
570 case GL_RGB5_A1:
571 case GL_RGB565:
572 case GL_RGB8_OES:
573 case GL_RGBA8_OES:
574 case GL_DEPTH_COMPONENT16:
575 return false;
576 default:
577 UNIMPLEMENTED();
578 }
579
580 return false;
581}
582
daniel@transgaming.com8e91d252012-10-17 18:22:44 +0000583bool IsFloat32Format(GLint internalformat)
584{
585 switch (internalformat)
586 {
587 case GL_RGBA32F_EXT:
588 case GL_RGB32F_EXT:
589 case GL_ALPHA32F_EXT:
590 case GL_LUMINANCE32F_EXT:
591 case GL_LUMINANCE_ALPHA32F_EXT:
592 return true;
593 default:
594 return false;
595 }
596}
597
598bool IsFloat16Format(GLint internalformat)
599{
600 switch (internalformat)
601 {
602 case GL_RGBA16F_EXT:
603 case GL_RGB16F_EXT:
604 case GL_ALPHA16F_EXT:
605 case GL_LUMINANCE16F_EXT:
606 case GL_LUMINANCE_ALPHA16F_EXT:
607 return true;
608 default:
609 return false;
610 }
611}
612
daniel@transgaming.com1b3a8152010-04-22 13:35:37 +0000613}
614
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000615namespace es2dx
616{
617
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000618D3DCMPFUNC ConvertComparison(GLenum comparison)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000619{
620 D3DCMPFUNC d3dComp = D3DCMP_ALWAYS;
621 switch (comparison)
622 {
623 case GL_NEVER: d3dComp = D3DCMP_NEVER; break;
624 case GL_ALWAYS: d3dComp = D3DCMP_ALWAYS; break;
625 case GL_LESS: d3dComp = D3DCMP_LESS; break;
626 case GL_LEQUAL: d3dComp = D3DCMP_LESSEQUAL; break;
627 case GL_EQUAL: d3dComp = D3DCMP_EQUAL; break;
628 case GL_GREATER: d3dComp = D3DCMP_GREATER; break;
629 case GL_GEQUAL: d3dComp = D3DCMP_GREATEREQUAL; break;
630 case GL_NOTEQUAL: d3dComp = D3DCMP_NOTEQUAL; break;
631 default: UNREACHABLE();
632 }
633
634 return d3dComp;
635}
636
637D3DCOLOR ConvertColor(gl::Color color)
638{
639 return D3DCOLOR_RGBA(gl::unorm<8>(color.red),
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000640 gl::unorm<8>(color.green),
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000641 gl::unorm<8>(color.blue),
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000642 gl::unorm<8>(color.alpha));
643}
644
645D3DBLEND ConvertBlendFunc(GLenum blend)
646{
647 D3DBLEND d3dBlend = D3DBLEND_ZERO;
648
649 switch (blend)
650 {
651 case GL_ZERO: d3dBlend = D3DBLEND_ZERO; break;
652 case GL_ONE: d3dBlend = D3DBLEND_ONE; break;
653 case GL_SRC_COLOR: d3dBlend = D3DBLEND_SRCCOLOR; break;
654 case GL_ONE_MINUS_SRC_COLOR: d3dBlend = D3DBLEND_INVSRCCOLOR; break;
655 case GL_DST_COLOR: d3dBlend = D3DBLEND_DESTCOLOR; break;
656 case GL_ONE_MINUS_DST_COLOR: d3dBlend = D3DBLEND_INVDESTCOLOR; break;
657 case GL_SRC_ALPHA: d3dBlend = D3DBLEND_SRCALPHA; break;
658 case GL_ONE_MINUS_SRC_ALPHA: d3dBlend = D3DBLEND_INVSRCALPHA; break;
659 case GL_DST_ALPHA: d3dBlend = D3DBLEND_DESTALPHA; break;
660 case GL_ONE_MINUS_DST_ALPHA: d3dBlend = D3DBLEND_INVDESTALPHA; break;
661 case GL_CONSTANT_COLOR: d3dBlend = D3DBLEND_BLENDFACTOR; break;
662 case GL_ONE_MINUS_CONSTANT_COLOR: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
663 case GL_CONSTANT_ALPHA: d3dBlend = D3DBLEND_BLENDFACTOR; break;
664 case GL_ONE_MINUS_CONSTANT_ALPHA: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
665 case GL_SRC_ALPHA_SATURATE: d3dBlend = D3DBLEND_SRCALPHASAT; break;
666 default: UNREACHABLE();
667 }
668
669 return d3dBlend;
670}
671
672D3DBLENDOP ConvertBlendOp(GLenum blendOp)
673{
674 D3DBLENDOP d3dBlendOp = D3DBLENDOP_ADD;
675
676 switch (blendOp)
677 {
678 case GL_FUNC_ADD: d3dBlendOp = D3DBLENDOP_ADD; break;
679 case GL_FUNC_SUBTRACT: d3dBlendOp = D3DBLENDOP_SUBTRACT; break;
680 case GL_FUNC_REVERSE_SUBTRACT: d3dBlendOp = D3DBLENDOP_REVSUBTRACT; break;
681 default: UNREACHABLE();
682 }
683
684 return d3dBlendOp;
685}
686
687D3DSTENCILOP ConvertStencilOp(GLenum stencilOp)
688{
689 D3DSTENCILOP d3dStencilOp = D3DSTENCILOP_KEEP;
690
691 switch (stencilOp)
692 {
693 case GL_ZERO: d3dStencilOp = D3DSTENCILOP_ZERO; break;
694 case GL_KEEP: d3dStencilOp = D3DSTENCILOP_KEEP; break;
695 case GL_REPLACE: d3dStencilOp = D3DSTENCILOP_REPLACE; break;
696 case GL_INCR: d3dStencilOp = D3DSTENCILOP_INCRSAT; break;
697 case GL_DECR: d3dStencilOp = D3DSTENCILOP_DECRSAT; break;
698 case GL_INVERT: d3dStencilOp = D3DSTENCILOP_INVERT; break;
699 case GL_INCR_WRAP: d3dStencilOp = D3DSTENCILOP_INCR; break;
700 case GL_DECR_WRAP: d3dStencilOp = D3DSTENCILOP_DECR; break;
701 default: UNREACHABLE();
702 }
703
704 return d3dStencilOp;
705}
706
707D3DTEXTUREADDRESS ConvertTextureWrap(GLenum wrap)
708{
709 D3DTEXTUREADDRESS d3dWrap = D3DTADDRESS_WRAP;
710
711 switch (wrap)
712 {
713 case GL_REPEAT: d3dWrap = D3DTADDRESS_WRAP; break;
714 case GL_CLAMP_TO_EDGE: d3dWrap = D3DTADDRESS_CLAMP; break;
715 case GL_MIRRORED_REPEAT: d3dWrap = D3DTADDRESS_MIRROR; break;
716 default: UNREACHABLE();
717 }
718
719 return d3dWrap;
720}
721
722D3DCULL ConvertCullMode(GLenum cullFace, GLenum frontFace)
723{
724 D3DCULL cull = D3DCULL_CCW;
725 switch (cullFace)
726 {
727 case GL_FRONT:
728 cull = (frontFace == GL_CCW ? D3DCULL_CW : D3DCULL_CCW);
729 break;
730 case GL_BACK:
731 cull = (frontFace == GL_CCW ? D3DCULL_CCW : D3DCULL_CW);
732 break;
733 case GL_FRONT_AND_BACK:
daniel@transgaming.comace5e662010-03-21 04:31:20 +0000734 cull = D3DCULL_NONE; // culling will be handled during draw
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000735 break;
736 default: UNREACHABLE();
737 }
738
739 return cull;
740}
741
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +0000742D3DCUBEMAP_FACES ConvertCubeFace(GLenum cubeFace)
743{
744 D3DCUBEMAP_FACES face = D3DCUBEMAP_FACE_POSITIVE_X;
745
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +0000746 switch (cubeFace)
747 {
748 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
749 face = D3DCUBEMAP_FACE_POSITIVE_X;
750 break;
751 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
752 face = D3DCUBEMAP_FACE_NEGATIVE_X;
753 break;
754 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
apatrick@chromium.org9616e582012-06-22 18:27:01 +0000755 face = D3DCUBEMAP_FACE_POSITIVE_Y;
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +0000756 break;
757 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
apatrick@chromium.org9616e582012-06-22 18:27:01 +0000758 face = D3DCUBEMAP_FACE_NEGATIVE_Y;
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +0000759 break;
760 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
761 face = D3DCUBEMAP_FACE_POSITIVE_Z;
762 break;
763 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
764 face = D3DCUBEMAP_FACE_NEGATIVE_Z;
765 break;
766 default: UNREACHABLE();
767 }
768
769 return face;
770}
771
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000772DWORD ConvertColorMask(bool red, bool green, bool blue, bool alpha)
773{
774 return (red ? D3DCOLORWRITEENABLE_RED : 0) |
775 (green ? D3DCOLORWRITEENABLE_GREEN : 0) |
776 (blue ? D3DCOLORWRITEENABLE_BLUE : 0) |
777 (alpha ? D3DCOLORWRITEENABLE_ALPHA : 0);
778}
779
daniel@transgaming.com07ab8412012-07-12 15:17:09 +0000780D3DTEXTUREFILTERTYPE ConvertMagFilter(GLenum magFilter, float maxAnisotropy)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000781{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +0000782 if (maxAnisotropy > 1.0f)
783 {
784 return D3DTEXF_ANISOTROPIC;
785 }
786
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000787 D3DTEXTUREFILTERTYPE d3dMagFilter = D3DTEXF_POINT;
788 switch (magFilter)
789 {
790 case GL_NEAREST: d3dMagFilter = D3DTEXF_POINT; break;
791 case GL_LINEAR: d3dMagFilter = D3DTEXF_LINEAR; break;
792 default: UNREACHABLE();
793 }
794
795 return d3dMagFilter;
796}
797
daniel@transgaming.com07ab8412012-07-12 15:17:09 +0000798void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter, float maxAnisotropy)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000799{
800 switch (minFilter)
801 {
802 case GL_NEAREST:
803 *d3dMinFilter = D3DTEXF_POINT;
804 *d3dMipFilter = D3DTEXF_NONE;
805 break;
806 case GL_LINEAR:
807 *d3dMinFilter = D3DTEXF_LINEAR;
808 *d3dMipFilter = D3DTEXF_NONE;
809 break;
810 case GL_NEAREST_MIPMAP_NEAREST:
811 *d3dMinFilter = D3DTEXF_POINT;
812 *d3dMipFilter = D3DTEXF_POINT;
813 break;
814 case GL_LINEAR_MIPMAP_NEAREST:
815 *d3dMinFilter = D3DTEXF_LINEAR;
816 *d3dMipFilter = D3DTEXF_POINT;
817 break;
818 case GL_NEAREST_MIPMAP_LINEAR:
819 *d3dMinFilter = D3DTEXF_POINT;
820 *d3dMipFilter = D3DTEXF_LINEAR;
821 break;
822 case GL_LINEAR_MIPMAP_LINEAR:
823 *d3dMinFilter = D3DTEXF_LINEAR;
824 *d3dMipFilter = D3DTEXF_LINEAR;
825 break;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000826 default:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000827 *d3dMinFilter = D3DTEXF_POINT;
828 *d3dMipFilter = D3DTEXF_NONE;
829 UNREACHABLE();
830 }
daniel@transgaming.com07ab8412012-07-12 15:17:09 +0000831
832 if (maxAnisotropy > 1.0f)
833 {
834 *d3dMinFilter = D3DTEXF_ANISOTROPIC;
835 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836}
837
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000838bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount,
839 D3DPRIMITIVETYPE *d3dPrimitiveType, int *d3dPrimitiveCount)
840{
841 switch (primitiveType)
842 {
843 case GL_POINTS:
844 *d3dPrimitiveType = D3DPT_POINTLIST;
845 *d3dPrimitiveCount = elementCount;
846 break;
847 case GL_LINES:
848 *d3dPrimitiveType = D3DPT_LINELIST;
849 *d3dPrimitiveCount = elementCount / 2;
850 break;
851 case GL_LINE_LOOP:
852 *d3dPrimitiveType = D3DPT_LINESTRIP;
853 *d3dPrimitiveCount = elementCount - 1; // D3D doesn't support line loops, so we draw the last line separately
854 break;
855 case GL_LINE_STRIP:
856 *d3dPrimitiveType = D3DPT_LINESTRIP;
857 *d3dPrimitiveCount = elementCount - 1;
858 break;
859 case GL_TRIANGLES:
860 *d3dPrimitiveType = D3DPT_TRIANGLELIST;
861 *d3dPrimitiveCount = elementCount / 3;
862 break;
863 case GL_TRIANGLE_STRIP:
864 *d3dPrimitiveType = D3DPT_TRIANGLESTRIP;
865 *d3dPrimitiveCount = elementCount - 2;
866 break;
867 case GL_TRIANGLE_FAN:
868 *d3dPrimitiveType = D3DPT_TRIANGLEFAN;
869 *d3dPrimitiveCount = elementCount - 2;
870 break;
871 default:
872 return false;
873 }
874
875 return true;
876}
877
878D3DFORMAT ConvertRenderbufferFormat(GLenum format)
879{
880 switch (format)
881 {
daniel@transgaming.com68145c62012-05-31 01:14:46 +0000882 case GL_NONE: return D3DFMT_NULL;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000883 case GL_RGBA4:
884 case GL_RGB5_A1:
885 case GL_RGBA8_OES: return D3DFMT_A8R8G8B8;
886 case GL_RGB565: return D3DFMT_R5G6B5;
887 case GL_RGB8_OES: return D3DFMT_X8R8G8B8;
888 case GL_DEPTH_COMPONENT16:
889 case GL_STENCIL_INDEX8:
890 case GL_DEPTH24_STENCIL8_OES: return D3DFMT_D24S8;
891 default: UNREACHABLE(); return D3DFMT_A8R8G8B8;
892 }
893}
894
895D3DMULTISAMPLE_TYPE GetMultisampleTypeFromSamples(GLsizei samples)
896{
897 if (samples <= 1)
898 return D3DMULTISAMPLE_NONE;
899 else
900 return (D3DMULTISAMPLE_TYPE)samples;
901}
902
903}
904
905namespace dx2es
906{
907
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000908unsigned int GetStencilSize(D3DFORMAT stencilFormat)
909{
daniel@transgaming.comdbd65652012-06-19 15:29:48 +0000910 if (stencilFormat == D3DFMT_INTZ)
911 {
912 return 8;
913 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000914 switch(stencilFormat)
915 {
916 case D3DFMT_D24FS8:
917 case D3DFMT_D24S8:
918 return 8;
919 case D3DFMT_D24X4S4:
920 return 4;
921 case D3DFMT_D15S1:
922 return 1;
923 case D3DFMT_D16_LOCKABLE:
924 case D3DFMT_D32:
925 case D3DFMT_D24X8:
926 case D3DFMT_D32F_LOCKABLE:
927 case D3DFMT_D16:
928 return 0;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000929 //case D3DFMT_D32_LOCKABLE: return 0; // DirectX 9Ex only
930 //case D3DFMT_S8_LOCKABLE: return 8; // DirectX 9Ex only
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000931 default:
932 return 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000933 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000934}
935
936unsigned int GetAlphaSize(D3DFORMAT colorFormat)
937{
938 switch (colorFormat)
939 {
daniel@transgaming.com1297d922010-09-01 15:47:47 +0000940 case D3DFMT_A16B16G16R16F:
941 return 16;
942 case D3DFMT_A32B32G32R32F:
943 return 32;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000944 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000945 return 2;
946 case D3DFMT_A8R8G8B8:
947 return 8;
948 case D3DFMT_A1R5G5B5:
949 return 1;
950 case D3DFMT_X8R8G8B8:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000951 case D3DFMT_R5G6B5:
952 return 0;
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000953 default:
954 return 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000955 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000956}
957
958unsigned int GetRedSize(D3DFORMAT colorFormat)
959{
960 switch (colorFormat)
961 {
daniel@transgaming.com1297d922010-09-01 15:47:47 +0000962 case D3DFMT_A16B16G16R16F:
963 return 16;
964 case D3DFMT_A32B32G32R32F:
965 return 32;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000966 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000967 return 10;
968 case D3DFMT_A8R8G8B8:
969 case D3DFMT_X8R8G8B8:
970 return 8;
971 case D3DFMT_A1R5G5B5:
972 case D3DFMT_R5G6B5:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000973 return 5;
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000974 default:
975 return 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000976 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000977}
978
979unsigned int GetGreenSize(D3DFORMAT colorFormat)
980{
981 switch (colorFormat)
982 {
daniel@transgaming.com1297d922010-09-01 15:47:47 +0000983 case D3DFMT_A16B16G16R16F:
984 return 16;
985 case D3DFMT_A32B32G32R32F:
986 return 32;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000987 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000988 return 10;
989 case D3DFMT_A8R8G8B8:
990 case D3DFMT_X8R8G8B8:
991 return 8;
992 case D3DFMT_A1R5G5B5:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000993 return 5;
994 case D3DFMT_R5G6B5:
995 return 6;
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000996 default:
997 return 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000998 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000999}
1000
1001unsigned int GetBlueSize(D3DFORMAT colorFormat)
1002{
1003 switch (colorFormat)
1004 {
daniel@transgaming.com1297d922010-09-01 15:47:47 +00001005 case D3DFMT_A16B16G16R16F:
1006 return 16;
1007 case D3DFMT_A32B32G32R32F:
1008 return 32;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001009 case D3DFMT_A2R10G10B10:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001010 return 10;
1011 case D3DFMT_A8R8G8B8:
1012 case D3DFMT_X8R8G8B8:
1013 return 8;
1014 case D3DFMT_A1R5G5B5:
1015 case D3DFMT_R5G6B5:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001016 return 5;
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +00001017 default:
1018 return 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001019 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001020}
1021
1022unsigned int GetDepthSize(D3DFORMAT depthFormat)
1023{
daniel@transgaming.comdbd65652012-06-19 15:29:48 +00001024 if (depthFormat == D3DFMT_INTZ)
1025 {
1026 return 24;
1027 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001028 switch (depthFormat)
1029 {
1030 case D3DFMT_D16_LOCKABLE: return 16;
1031 case D3DFMT_D32: return 32;
1032 case D3DFMT_D15S1: return 15;
1033 case D3DFMT_D24S8: return 24;
1034 case D3DFMT_D24X8: return 24;
1035 case D3DFMT_D24X4S4: return 24;
1036 case D3DFMT_D16: return 16;
1037 case D3DFMT_D32F_LOCKABLE: return 32;
1038 case D3DFMT_D24FS8: return 24;
daniel@transgaming.com83921382011-01-08 05:46:00 +00001039 //case D3DFMT_D32_LOCKABLE: return 32; // D3D9Ex only
1040 //case D3DFMT_S8_LOCKABLE: return 0; // D3D9Ex only
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +00001041 default: return 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001042 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001043}
1044
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001045GLsizei GetSamplesFromMultisampleType(D3DMULTISAMPLE_TYPE type)
1046{
1047 if (type == D3DMULTISAMPLE_NONMASKABLE)
1048 return 0;
1049 else
1050 return type;
1051}
1052
daniel@transgaming.comad52cb12012-10-17 18:14:45 +00001053bool IsFormatChannelEquivalent(D3DFORMAT d3dformat, GLenum format)
1054{
1055 switch (d3dformat)
1056 {
1057 case D3DFMT_L8:
1058 return (format == GL_LUMINANCE);
1059 case D3DFMT_A8L8:
1060 return (format == GL_LUMINANCE_ALPHA);
1061 case D3DFMT_DXT1:
1062 return (format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT || format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT);
1063 case D3DFMT_DXT3:
1064 return (format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE);
1065 case D3DFMT_DXT5:
1066 return (format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE);
1067 case D3DFMT_A8R8G8B8:
1068 case D3DFMT_A16B16G16R16F:
1069 case D3DFMT_A32B32G32R32F:
1070 return (format == GL_RGBA || format == GL_BGRA_EXT);
1071 case D3DFMT_X8R8G8B8:
1072 return (format == GL_RGB);
1073 default:
1074 if (d3dformat == D3DFMT_INTZ && gl::IsDepthTexture(format))
1075 return true;
1076 return false;
1077 }
1078}
1079
daniel@transgaming.com42944b02012-09-27 17:45:57 +00001080bool ConvertReadBufferFormat(D3DFORMAT d3dformat, GLenum *format, GLenum *type)
1081{
1082 switch (d3dformat)
1083 {
1084 case D3DFMT_A8R8G8B8:
1085 *type = GL_UNSIGNED_BYTE;
1086 *format = GL_BGRA_EXT;
1087 break;
1088 case D3DFMT_X8R8G8B8:
1089 *type = GL_UNSIGNED_BYTE;
1090 *format = GL_RGB;
1091 break;
1092 case D3DFMT_R5G6B5:
1093 *type = GL_UNSIGNED_SHORT_5_6_5;
1094 *format = GL_RGB;
1095 break;
1096 case D3DFMT_A16B16G16R16F:
1097 *type = GL_HALF_FLOAT_OES;
1098 *format = GL_RGBA;
1099 break;
1100 case D3DFMT_A32B32G32R32F:
1101 *type = GL_FLOAT;
1102 *format = GL_RGBA;
1103 break;
1104 case D3DFMT_A4R4G4B4:
1105 *type = GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT;
1106 *format = GL_BGRA_EXT;
1107 break;
1108 case D3DFMT_A1R5G5B5:
1109 *type = GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT;
1110 *format = GL_BGRA_EXT;
1111 break;
1112 default:
1113 *type = GL_NONE;
1114 *format = GL_NONE;
1115 return false;
1116 }
1117 return true;
1118}
1119
daniel@transgaming.com73a5db62010-10-15 17:58:13 +00001120GLenum ConvertBackBufferFormat(D3DFORMAT format)
1121{
1122 switch (format)
1123 {
1124 case D3DFMT_A4R4G4B4: return GL_RGBA4;
1125 case D3DFMT_A8R8G8B8: return GL_RGBA8_OES;
1126 case D3DFMT_A1R5G5B5: return GL_RGB5_A1;
1127 case D3DFMT_R5G6B5: return GL_RGB565;
1128 case D3DFMT_X8R8G8B8: return GL_RGB8_OES;
1129 default:
1130 UNREACHABLE();
1131 }
1132
1133 return GL_RGBA4;
1134}
1135
1136GLenum ConvertDepthStencilFormat(D3DFORMAT format)
1137{
daniel@transgaming.comdbd65652012-06-19 15:29:48 +00001138 if (format == D3DFMT_INTZ)
1139 {
1140 return GL_DEPTH24_STENCIL8_OES;
1141 }
daniel@transgaming.com73a5db62010-10-15 17:58:13 +00001142 switch (format)
1143 {
1144 case D3DFMT_D16:
1145 case D3DFMT_D24X8:
1146 return GL_DEPTH_COMPONENT16;
1147 case D3DFMT_D24S8:
1148 return GL_DEPTH24_STENCIL8_OES;
daniel@transgaming.com6f504572012-10-31 18:38:45 +00001149 case D3DFMT_UNKNOWN:
1150 return GL_NONE;
daniel@transgaming.com73a5db62010-10-15 17:58:13 +00001151 default:
1152 UNREACHABLE();
1153 }
1154
1155 return GL_DEPTH24_STENCIL8_OES;
1156}
1157
1158}
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001159
daniel@transgaming.com4bb04be2012-10-17 18:29:55 +00001160namespace dx
1161{
1162
1163bool IsCompressedFormat(D3DFORMAT surfaceFormat)
1164{
1165 switch(surfaceFormat)
1166 {
1167 case D3DFMT_DXT1:
1168 case D3DFMT_DXT2:
1169 case D3DFMT_DXT3:
1170 case D3DFMT_DXT4:
1171 case D3DFMT_DXT5:
1172 return true;
1173 default:
1174 return false;
1175 }
1176}
1177
1178size_t ComputeRowSize(D3DFORMAT format, unsigned int width)
1179{
1180 if (format == D3DFMT_INTZ)
1181 {
1182 return 4 * width;
1183 }
1184 switch (format)
1185 {
1186 case D3DFMT_L8:
1187 return 1 * width;
1188 case D3DFMT_A8L8:
1189 return 2 * width;
1190 case D3DFMT_X8R8G8B8:
1191 case D3DFMT_A8R8G8B8:
1192 return 4 * width;
1193 case D3DFMT_A16B16G16R16F:
1194 return 8 * width;
1195 case D3DFMT_A32B32G32R32F:
1196 return 16 * width;
1197 case D3DFMT_DXT1:
1198 return 8 * ((width + 3) / 4);
1199 case D3DFMT_DXT3:
1200 case D3DFMT_DXT5:
1201 return 16 * ((width + 3) / 4);
1202 default:
1203 UNREACHABLE();
1204 return 0;
1205 }
1206}
1207
1208}
1209
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001210std::string getTempPath()
1211{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001212 char path[MAX_PATH];
1213 DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
1214 if (pathLen == 0)
1215 {
1216 UNREACHABLE();
1217 return std::string();
1218 }
1219
1220 UINT unique = GetTempFileNameA(path, "sh", 0, path);
1221 if (unique == 0)
1222 {
1223 UNREACHABLE();
1224 return std::string();
1225 }
1226
1227 return path;
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001228}
1229
1230void writeFile(const char* path, const void* content, size_t size)
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001231{
1232 FILE* file = fopen(path, "w");
1233 if (!file)
1234 {
1235 UNREACHABLE();
1236 return;
1237 }
1238
1239 fwrite(content, sizeof(char), size, file);
1240 fclose(file);
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001241}