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