1 /*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 #include "glUtils.h"
17 #include <string.h>
18 #include "ErrorLog.h"
19 #include <IOStream.h>
20
glSizeof(GLenum type)21 size_t glSizeof(GLenum type)
22 {
23 size_t retval = 0;
24 switch(type) {
25 case GL_BYTE:
26 case GL_UNSIGNED_BYTE:
27 retval = 1;
28 break;
29 case GL_SHORT:
30 case GL_UNSIGNED_SHORT:
31 case GL_HALF_FLOAT_OES:
32 retval = 2;
33 break;
34 case GL_INT:
35 case GL_FLOAT:
36 case GL_FIXED:
37 case GL_BOOL:
38 retval = 4;
39 break;
40 #ifdef GL_DOUBLE
41 case GL_DOUBLE:
42 retval = 8;
43 break;
44 #endif
45 case GL_FLOAT_VEC2:
46 case GL_INT_VEC2:
47 case GL_BOOL_VEC2:
48 retval = 8;
49 break;
50 case GL_INT_VEC3:
51 case GL_BOOL_VEC3:
52 case GL_FLOAT_VEC3:
53 retval = 12;
54 break;
55 case GL_FLOAT_VEC4:
56 case GL_BOOL_VEC4:
57 case GL_INT_VEC4:
58 case GL_FLOAT_MAT2:
59 retval = 16;
60 break;
61 case GL_FLOAT_MAT3:
62 retval = 36;
63 break;
64 case GL_FLOAT_MAT4:
65 retval = 64;
66 break;
67 case GL_SAMPLER_2D:
68 case GL_SAMPLER_CUBE:
69 retval = 4;
70 break;
71 default:
72 ERR("**** ERROR unknown type 0x%x (%s,%d)\n", type, __FUNCTION__,__LINE__);
73 }
74 return retval;
75
76 }
77
glUtilsParamSize(GLenum param)78 size_t glUtilsParamSize(GLenum param)
79 {
80 size_t s = 0;
81
82 switch(param)
83 {
84 case GL_DEPTH_FUNC:
85 case GL_DEPTH_BITS:
86 case GL_MAX_CLIP_PLANES:
87 case GL_GREEN_BITS:
88 case GL_MAX_MODELVIEW_STACK_DEPTH:
89 case GL_MAX_PROJECTION_STACK_DEPTH:
90 case GL_MAX_TEXTURE_STACK_DEPTH:
91 case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
92 case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
93 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
94 case GL_MAX_TEXTURE_SIZE:
95 case GL_TEXTURE_GEN_MODE_OES:
96 case GL_TEXTURE_ENV_MODE:
97 case GL_FOG_MODE:
98 case GL_FOG_DENSITY:
99 case GL_FOG_START:
100 case GL_FOG_END:
101 case GL_SPOT_EXPONENT:
102 case GL_CONSTANT_ATTENUATION:
103 case GL_LINEAR_ATTENUATION:
104 case GL_QUADRATIC_ATTENUATION:
105 case GL_SHININESS:
106 case GL_LIGHT_MODEL_TWO_SIDE:
107 case GL_POINT_SIZE:
108 case GL_POINT_SIZE_MIN:
109 case GL_POINT_SIZE_MAX:
110 case GL_POINT_FADE_THRESHOLD_SIZE:
111 case GL_CULL_FACE_MODE:
112 case GL_FRONT_FACE:
113 case GL_SHADE_MODEL:
114 case GL_DEPTH_WRITEMASK:
115 case GL_DEPTH_CLEAR_VALUE:
116 case GL_STENCIL_FAIL:
117 case GL_STENCIL_PASS_DEPTH_FAIL:
118 case GL_STENCIL_PASS_DEPTH_PASS:
119 case GL_STENCIL_REF:
120 case GL_STENCIL_WRITEMASK:
121 case GL_MATRIX_MODE:
122 case GL_MODELVIEW_STACK_DEPTH:
123 case GL_PROJECTION_STACK_DEPTH:
124 case GL_TEXTURE_STACK_DEPTH:
125 case GL_ALPHA_TEST_FUNC:
126 case GL_ALPHA_TEST_REF:
127 case GL_ALPHA_TEST:
128 case GL_BLEND_DST:
129 case GL_BLEND_SRC:
130 case GL_BLEND:
131 case GL_LOGIC_OP_MODE:
132 case GL_SCISSOR_TEST:
133 case GL_MAX_TEXTURE_UNITS:
134 case GL_ACTIVE_TEXTURE:
135 case GL_ALPHA_BITS:
136 case GL_ARRAY_BUFFER_BINDING:
137 case GL_BLUE_BITS:
138 case GL_CLIENT_ACTIVE_TEXTURE:
139 case GL_CLIP_PLANE0:
140 case GL_CLIP_PLANE1:
141 case GL_CLIP_PLANE2:
142 case GL_CLIP_PLANE3:
143 case GL_CLIP_PLANE4:
144 case GL_CLIP_PLANE5:
145 case GL_COLOR_ARRAY:
146 case GL_COLOR_ARRAY_BUFFER_BINDING:
147 case GL_COLOR_ARRAY_SIZE:
148 case GL_COLOR_ARRAY_STRIDE:
149 case GL_COLOR_ARRAY_TYPE:
150 case GL_COLOR_LOGIC_OP:
151 case GL_COLOR_MATERIAL:
152 case GL_PACK_ALIGNMENT:
153 case GL_PERSPECTIVE_CORRECTION_HINT:
154 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
155 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
156 case GL_POINT_SIZE_ARRAY_TYPE_OES:
157 case GL_POINT_SMOOTH:
158 case GL_POINT_SMOOTH_HINT:
159 case GL_POINT_SPRITE_OES:
160 case GL_COORD_REPLACE_OES:
161 case GL_COMBINE_ALPHA:
162 case GL_SRC0_RGB:
163 case GL_SRC1_RGB:
164 case GL_SRC2_RGB:
165 case GL_OPERAND0_RGB:
166 case GL_OPERAND1_RGB:
167 case GL_OPERAND2_RGB:
168 case GL_SRC0_ALPHA:
169 case GL_SRC1_ALPHA:
170 case GL_SRC2_ALPHA:
171 case GL_OPERAND0_ALPHA:
172 case GL_OPERAND1_ALPHA:
173 case GL_OPERAND2_ALPHA:
174 case GL_RGB_SCALE:
175 case GL_ALPHA_SCALE:
176 case GL_COMBINE_RGB:
177 case GL_POLYGON_OFFSET_FACTOR:
178 case GL_POLYGON_OFFSET_FILL:
179 case GL_POLYGON_OFFSET_UNITS:
180 case GL_RED_BITS:
181 case GL_RESCALE_NORMAL:
182 case GL_SAMPLE_ALPHA_TO_COVERAGE:
183 case GL_SAMPLE_ALPHA_TO_ONE:
184 case GL_SAMPLE_BUFFERS:
185 case GL_SAMPLE_COVERAGE:
186 case GL_SAMPLE_COVERAGE_INVERT:
187 case GL_SAMPLE_COVERAGE_VALUE:
188 case GL_SAMPLES:
189 case GL_STENCIL_BITS:
190 case GL_STENCIL_CLEAR_VALUE:
191 case GL_STENCIL_FUNC:
192 case GL_STENCIL_TEST:
193 case GL_STENCIL_VALUE_MASK:
194 case GL_STENCIL_BACK_FUNC:
195 case GL_STENCIL_BACK_VALUE_MASK:
196 case GL_STENCIL_BACK_REF:
197 case GL_STENCIL_BACK_FAIL:
198 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
199 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
200 case GL_STENCIL_BACK_WRITEMASK:
201 case GL_TEXTURE_2D:
202 case GL_TEXTURE_BINDING_2D:
203 case GL_TEXTURE_BINDING_CUBE_MAP:
204 case GL_TEXTURE_BINDING_EXTERNAL_OES:
205 case GL_TEXTURE_COORD_ARRAY:
206 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
207 case GL_TEXTURE_COORD_ARRAY_SIZE:
208 case GL_TEXTURE_COORD_ARRAY_STRIDE:
209 case GL_TEXTURE_COORD_ARRAY_TYPE:
210 case GL_UNPACK_ALIGNMENT:
211 case GL_VERTEX_ARRAY:
212 case GL_VERTEX_ARRAY_BUFFER_BINDING:
213 case GL_VERTEX_ARRAY_SIZE:
214 case GL_VERTEX_ARRAY_STRIDE:
215 case GL_VERTEX_ARRAY_TYPE:
216 case GL_SPOT_CUTOFF:
217 case GL_TEXTURE_MIN_FILTER:
218 case GL_TEXTURE_MAG_FILTER:
219 case GL_TEXTURE_WRAP_S:
220 case GL_TEXTURE_WRAP_T:
221 case GL_GENERATE_MIPMAP:
222 case GL_GENERATE_MIPMAP_HINT:
223 case GL_RENDERBUFFER_WIDTH_OES:
224 case GL_RENDERBUFFER_HEIGHT_OES:
225 case GL_RENDERBUFFER_INTERNAL_FORMAT_OES:
226 case GL_RENDERBUFFER_RED_SIZE_OES:
227 case GL_RENDERBUFFER_GREEN_SIZE_OES:
228 case GL_RENDERBUFFER_BLUE_SIZE_OES:
229 case GL_RENDERBUFFER_ALPHA_SIZE_OES:
230 case GL_RENDERBUFFER_DEPTH_SIZE_OES:
231 case GL_RENDERBUFFER_STENCIL_SIZE_OES:
232 case GL_RENDERBUFFER_BINDING:
233 case GL_FRAMEBUFFER_BINDING:
234 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES:
235 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES:
236 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES:
237 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES:
238 case GL_FENCE_STATUS_NV:
239 case GL_FENCE_CONDITION_NV:
240 case GL_TEXTURE_WIDTH_QCOM:
241 case GL_TEXTURE_HEIGHT_QCOM:
242 case GL_TEXTURE_DEPTH_QCOM:
243 case GL_TEXTURE_INTERNAL_FORMAT_QCOM:
244 case GL_TEXTURE_FORMAT_QCOM:
245 case GL_TEXTURE_TYPE_QCOM:
246 case GL_TEXTURE_IMAGE_VALID_QCOM:
247 case GL_TEXTURE_NUM_LEVELS_QCOM:
248 case GL_TEXTURE_TARGET_QCOM:
249 case GL_TEXTURE_OBJECT_VALID_QCOM:
250 case GL_BLEND_EQUATION_RGB_OES:
251 case GL_BLEND_EQUATION_ALPHA_OES:
252 case GL_BLEND_DST_RGB_OES:
253 case GL_BLEND_SRC_RGB_OES:
254 case GL_BLEND_DST_ALPHA_OES:
255 case GL_BLEND_SRC_ALPHA_OES:
256 case GL_MAX_LIGHTS:
257 case GL_SHADER_TYPE:
258 case GL_DELETE_STATUS:
259 case GL_COMPILE_STATUS:
260 case GL_INFO_LOG_LENGTH:
261 case GL_SHADER_SOURCE_LENGTH:
262 case GL_CURRENT_PROGRAM:
263 case GL_LINK_STATUS:
264 case GL_VALIDATE_STATUS:
265 case GL_ATTACHED_SHADERS:
266 case GL_ACTIVE_UNIFORMS:
267 case GL_ACTIVE_ATTRIBUTES:
268 case GL_SUBPIXEL_BITS:
269 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
270 case GL_NUM_SHADER_BINARY_FORMATS:
271 case GL_SHADER_COMPILER:
272 case GL_MAX_VERTEX_ATTRIBS:
273 case GL_MAX_VERTEX_UNIFORM_VECTORS:
274 case GL_MAX_VARYING_VECTORS:
275 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
276 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
277 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
278 case GL_MAX_RENDERBUFFER_SIZE:
279 case GL_MAX_TEXTURE_IMAGE_UNITS:
280 case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
281 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
282 case GL_LINE_WIDTH:
283 s = 1;
284 break;
285 case GL_ALIASED_LINE_WIDTH_RANGE:
286 case GL_ALIASED_POINT_SIZE_RANGE:
287 case GL_DEPTH_RANGE:
288 case GL_MAX_VIEWPORT_DIMS:
289 case GL_SMOOTH_POINT_SIZE_RANGE:
290 case GL_SMOOTH_LINE_WIDTH_RANGE:
291 s= 2;
292 break;
293 case GL_SPOT_DIRECTION:
294 case GL_POINT_DISTANCE_ATTENUATION:
295 case GL_CURRENT_NORMAL:
296 s = 3;
297 break;
298 case GL_CURRENT_VERTEX_ATTRIB:
299 case GL_CURRENT_TEXTURE_COORDS:
300 case GL_CURRENT_COLOR:
301 case GL_FOG_COLOR:
302 case GL_AMBIENT:
303 case GL_DIFFUSE:
304 case GL_SPECULAR:
305 case GL_EMISSION:
306 case GL_POSITION:
307 case GL_LIGHT_MODEL_AMBIENT:
308 case GL_TEXTURE_ENV_COLOR:
309 case GL_SCISSOR_BOX:
310 case GL_VIEWPORT:
311 case GL_TEXTURE_CROP_RECT_OES:
312 case GL_COLOR_CLEAR_VALUE:
313 case GL_COLOR_WRITEMASK:
314 case GL_AMBIENT_AND_DIFFUSE:
315 case GL_BLEND_COLOR:
316 s = 4;
317 break;
318 case GL_MODELVIEW_MATRIX:
319 case GL_PROJECTION_MATRIX:
320 case GL_TEXTURE_MATRIX:
321 s = 16;
322 break;
323 default:
324 ERR("glUtilsParamSize: unknow param 0x%08x\n", param);
325 s = 1; // assume 1
326 }
327 return s;
328 }
329
glUtilsPackPointerData(unsigned char * dst,unsigned char * src,int size,GLenum type,unsigned int stride,unsigned int datalen)330 void glUtilsPackPointerData(unsigned char *dst, unsigned char *src,
331 int size, GLenum type, unsigned int stride,
332 unsigned int datalen)
333 {
334 unsigned int vsize = size * glSizeof(type);
335 if (stride == 0) stride = vsize;
336
337 if (stride == vsize) {
338 memcpy(dst, src, datalen);
339 } else {
340 for (unsigned int i = 0; i < datalen; i += vsize) {
341 memcpy(dst, src, vsize);
342 dst += vsize;
343 src += stride;
344 }
345 }
346 }
347
glUtilsWritePackPointerData(void * _stream,unsigned char * src,int size,GLenum type,unsigned int stride,unsigned int datalen)348 void glUtilsWritePackPointerData(void* _stream, unsigned char *src,
349 int size, GLenum type, unsigned int stride,
350 unsigned int datalen)
351 {
352 IOStream* stream = reinterpret_cast<IOStream*>(_stream);
353
354 unsigned int vsize = size * glSizeof(type);
355 if (stride == 0) stride = vsize;
356
357 if (stride == vsize) {
358 stream->writeFully(src, datalen);
359 } else {
360 for (unsigned int i = 0; i < datalen; i += vsize) {
361 stream->writeFully(src, (size_t)vsize);
362 src += stride;
363 }
364 }
365 }
366
glUtilsPixelBitSize(GLenum format,GLenum type)367 int glUtilsPixelBitSize(GLenum format, GLenum type)
368 {
369 int components = 0;
370 int componentsize = 0;
371 int pixelsize = 0;
372 switch(type) {
373 case GL_BYTE:
374 case GL_UNSIGNED_BYTE:
375 componentsize = 8;
376 break;
377 case GL_SHORT:
378 case GL_UNSIGNED_SHORT:
379 case GL_UNSIGNED_SHORT_5_6_5:
380 case GL_UNSIGNED_SHORT_4_4_4_4:
381 case GL_UNSIGNED_SHORT_5_5_5_1:
382 case GL_RGB565_OES:
383 case GL_RGB5_A1_OES:
384 case GL_RGBA4_OES:
385 pixelsize = 16;
386 break;
387 case GL_INT:
388 case GL_UNSIGNED_INT:
389 case GL_FLOAT:
390 case GL_FIXED:
391 case GL_UNSIGNED_INT_24_8_OES:
392 pixelsize = 32;
393 break;
394 default:
395 ERR("glUtilsPixelBitSize: unknown pixel type - assuming pixel data 0\n");
396 componentsize = 0;
397 }
398
399 if (pixelsize == 0) {
400 switch(format) {
401 #if 0
402 case GL_RED:
403 case GL_GREEN:
404 case GL_BLUE:
405 #endif
406 case GL_ALPHA:
407 case GL_LUMINANCE:
408 case GL_DEPTH_COMPONENT:
409 case GL_DEPTH_STENCIL_OES:
410 components = 1;
411 break;
412 case GL_LUMINANCE_ALPHA:
413 components = 2;
414 break;
415 case GL_RGB:
416 #if 0
417 case GL_BGR:
418 #endif
419 components = 3;
420 break;
421 case GL_RGBA:
422 case GL_BGRA_EXT:
423 components = 4;
424 break;
425 default:
426 ERR("glUtilsPixelBitSize: unknown pixel format...\n");
427 components = 0;
428 }
429 pixelsize = components * componentsize;
430 }
431
432 return pixelsize;
433 }
434
435 // pack a list of strings into one.
glUtilsPackStrings(char * ptr,char ** strings,GLint * length,GLsizei count)436 void glUtilsPackStrings(char *ptr, char **strings, GLint *length, GLsizei count)
437 {
438 char *p = ptr;
439 *p = '\0';
440 for (int i = 0; i < count; i++) {
441 int l=0;
442 if (strings[i]!=NULL) {
443 if (length == NULL || length[i] < 0) {
444 l = strlen(strings[i]);
445 strcat(p, strings[i]);
446 } else {
447 l = length[i];
448 strncat(p, strings[i], l);
449 }
450 }
451 p += l;
452 }
453 }
454
455 // claculate the length of a list of strings
glUtilsCalcShaderSourceLen(char ** strings,GLint * length,GLsizei count)456 int glUtilsCalcShaderSourceLen( char **strings, GLint *length, GLsizei count)
457 {
458 int len = 0;
459 for (int i = 0; i < count; i++) {
460 int l;
461 if (length == NULL || length[i] < 0) {
462 l = strings[i]!=NULL ? strlen(strings[i]) : 0;
463 } else {
464 l = length[i];
465 }
466 len += l;
467 }
468 return len;
469
470 }
471