1 #include "coregl_tracepath.h"
11 static int api_gl_version;
14 #define _COREGL_SYMBOL(RET_TYPE, FUNC_NAME, PARAM_LIST) RET_TYPE (*_orig_tracepath_##FUNC_NAME) PARAM_LIST = NULL;
15 #include "../../headers/sym.h"
18 #define TIMEVAL_INIT { 0, 0 }
22 char name[MAX_TRACE_NAME_LENGTH];
23 struct _Trace_Data *next;
28 struct _Trace_Data trace_data;
32 struct timeval elapsed_time;
33 struct timeval elapsed_time_max;
34 struct timeval last_elapsed_time;
35 struct timeval total_elapsed_time;
36 struct timeval last_total_elapsed_time;
37 struct timeval last_time;
44 struct _Trace_Data trace_data;
53 struct _Trace_Data trace_data;
67 typedef struct _GLGlueFakeContext
69 GLuint gl_num_draw_buffers[1];
70 GLuint gl_num_tex_units[1];
71 GLuint gl_num_vertex_attribs[1];
72 GLuint gl_num_transform_feedback_separate_attribs[1];
73 GLuint gl_num_uniform_buffer_bindings[1];
76 GLGlueFakeContext initial_fake_ctx_real;
77 GLGlueFakeContext *initial_fake_ctx = &initial_fake_ctx_real;
79 struct timeval initial_time = TIMEVAL_INIT;
80 struct timeval last_initial_time = TIMEVAL_INIT;
82 struct timeval last_trace_time = TIMEVAL_INIT;
83 struct timeval other_elapsed_time = TIMEVAL_INIT;
84 struct timeval traced_other_elapsed_time = TIMEVAL_INIT;
86 Mutex mtd_access_mutex = MUTEX_INITIALIZER;
87 Memuse_Data **mtd_table;
89 Mutex std_access_mutex = MUTEX_INITIALIZER;
90 Surface_Data **std_table;
93 _state_get_texture_states(GLenum pname, GLint *params)
95 GLuint cur_active_tex = 0;
97 AST(initial_fake_ctx != NULL);
99 _orig_tracepath_glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint *)&cur_active_tex);
101 for (i = 0; i < initial_fake_ctx->gl_num_tex_units[0]; i++)
103 _orig_tracepath_glActiveTexture(GL_TEXTURE0 + i);
104 _orig_tracepath_glGetIntegerv(pname, (GLint *)¶ms[i]);
106 _orig_tracepath_glActiveTexture(cur_active_tex);
110 _state_get_draw_buffers(GLenum *params)
112 AST(initial_fake_ctx != NULL);
115 for (i = 0; i < initial_fake_ctx->gl_num_draw_buffers[0]; i++)
117 _orig_tracepath_glGetIntegerv(GL_DRAW_BUFFER0 + i, (GLint *)¶ms[i]);
122 _state_get_transform_feedback_buffer_bindings(GLuint *params)
124 AST(initial_fake_ctx != NULL);
127 for (i = 0; i < initial_fake_ctx->gl_num_transform_feedback_separate_attribs[0]; i++)
129 _orig_tracepath_glGetIntegeri_v(GL_TRANSFORM_FEEDBACK_BUFFER_BINDING, i, (GLint *)¶ms[i]);
134 _state_get_transform_feedback_buffer_bindings_offset(GLintptr *params)
136 AST(initial_fake_ctx != NULL);
139 for (i = 0; i < initial_fake_ctx->gl_num_transform_feedback_separate_attribs[0]; i++)
141 _orig_tracepath_glGetIntegeri_v(GL_TRANSFORM_FEEDBACK_BUFFER_START, i, (GLint *)¶ms[i]);
146 _state_get_transform_feedback_buffer_bindings_size(GLsizeiptr *params)
148 AST(initial_fake_ctx != NULL);
151 for (i = 0; i < initial_fake_ctx->gl_num_transform_feedback_separate_attribs[0]; i++)
153 _orig_tracepath_glGetIntegeri_v(GL_TRANSFORM_FEEDBACK_BUFFER_SIZE, i, (GLint *)¶ms[i]);
158 _state_get_uniform_buffer_bindings(GLuint *params)
160 AST(initial_fake_ctx != NULL);
163 for (i = 0; i < initial_fake_ctx->gl_num_uniform_buffer_bindings[0]; i++)
165 /////////////////////////////////////////////////////////////////////////////////
166 // XXXX : AVOID SEGFAULT in ADRENO
167 ((GLint *)params)[i] = 0;
168 // _orig_tracepath_glGetIntegeri_v(GL_UNIFORM_BUFFER_BINDING, i, (GLint *)¶ms[i]);
169 /////////////////////////////////////////////////////////////////////////////////
174 _state_get_uniform_buffer_bindings_offset(GLintptr *params)
176 AST(initial_fake_ctx != NULL);
179 for (i = 0; i < initial_fake_ctx->gl_num_uniform_buffer_bindings[0]; i++)
181 _orig_tracepath_glGetIntegeri_v(GL_UNIFORM_BUFFER_START, i, (GLint *)¶ms[i]);
186 _state_get_uniform_buffer_bindings_size(GLsizeiptr *params)
188 AST(initial_fake_ctx != NULL);
191 for (i = 0; i < initial_fake_ctx->gl_num_uniform_buffer_bindings[0]; i++)
193 _orig_tracepath_glGetIntegeri_v(GL_UNIFORM_BUFFER_SIZE, i, (GLint *)¶ms[i]);
198 init_modules_tracepath()
201 const char *output_file = NULL;
202 output_file = get_env_setting("COREGL_LOG_FILE");
203 if (strlen(output_file) > 0)
205 trace_fp = fopen(output_file, "w");
209 #ifdef COREGL_TRACEPATH_TRACE_APICALL_INFO
210 trace_api_flag = atoi(get_env_setting("COREGL_TRACE_API"));
211 trace_api_all_flag = atoi(get_env_setting("COREGL_TRACE_API_ALL"));
212 trace_api_frame_flag = atoi(get_env_setting("COREGL_TRACE_API_FRAME"));
214 #ifdef COREGL_TRACEPATH_TRACE_MEMUSE_INFO
215 trace_mem_flag = atoi(get_env_setting("COREGL_TRACE_MEM"));
216 trace_mem_all_flag = atoi(get_env_setting("COREGL_TRACE_MEM_ALL"));
218 #ifdef COREGL_TRACEPATH_TRACE_SURFACE_INFO
219 trace_surface_flag = atoi(get_env_setting("COREGL_TRACE_SURFACE"));
220 trace_surface_sequence_sort_flag = atoi(get_env_setting("COREGL_TRACE_SURFACE_SEQUENCE_SORT"));
221 trace_surface_print_only_flag = atoi(get_env_setting("COREGL_TRACE_SURFACE_PRINT_ONLY"));
223 { // COREGL_TRACE_SURFACE_FILTER_PERIOD=40~60
224 char tmp[64 + 1] = { 0 }, *tmpp = NULL;
225 strncpy(tmp, get_env_setting("COREGL_TRACE_SURFACE_FILTER_PERIOD"), 64);
226 for (tmpp = &tmp[0]; ; tmpp++)
228 if (*tmpp == 0x00) break;
232 trace_surface_filter_period_begin = atoi(tmp);
233 trace_surface_filter_period_end = atoi(tmpp + 1);
239 { // COREGL_TRACE_SURFACE_FILTER_TYPE=EGL|FBO
240 char tmp[64 + 1] = { 0 };
241 strncpy(tmp, get_env_setting("COREGL_TRACE_SURFACE_FILTER_TYPE"), 64);
242 if (strcmp(tmp, "EGL") == 0) trace_surface_filter_type = 1;
243 if (strcmp(tmp, "FBO") == 0) trace_surface_filter_type = 2;
246 { // COREGL_TRACE_SURFACE_FILTER_HANDLE=0x3234
247 char tmp[64 + 1] = { 0 }, *tmpp = NULL;
248 strncpy(tmp, get_env_setting("COREGL_TRACE_SURFACE_FILTER_HANDLE"), 64);
249 if (tmp[0] == '0' && tmp[1] == 'x')
251 for (tmpp = &tmp[2]; ; tmpp++)
253 if (*tmpp == 0x00) break;
254 trace_surface_filter_handle *= 16;
257 case '1' : trace_surface_filter_handle += 1; break;
258 case '2' : trace_surface_filter_handle += 2; break;
259 case '3' : trace_surface_filter_handle += 3; break;
260 case '4' : trace_surface_filter_handle += 4; break;
261 case '5' : trace_surface_filter_handle += 5; break;
262 case '6' : trace_surface_filter_handle += 6; break;
263 case '7' : trace_surface_filter_handle += 7; break;
264 case '8' : trace_surface_filter_handle += 8; break;
265 case '9' : trace_surface_filter_handle += 9; break;
266 case 'A' : case 'a' : trace_surface_filter_handle += 10; break;
267 case 'B' : case 'b' : trace_surface_filter_handle += 11; break;
268 case 'C' : case 'c' : trace_surface_filter_handle += 12; break;
269 case 'D' : case 'd' : trace_surface_filter_handle += 13; break;
270 case 'E' : case 'e' : trace_surface_filter_handle += 14; break;
271 case 'F' : case 'f' : trace_surface_filter_handle += 15; break;
277 trace_surface_filter_handle = atoi(tmp);
281 { // COREGL_TRACE_SURFACE_FILTER_SIZE=640x480
282 char tmp[64 + 1] = { 0 }, *tmpp = NULL;
283 strncpy(tmp, get_env_setting("COREGL_TRACE_SURFACE_FILTER_SIZE"), 64);
284 for (tmpp = &tmp[0]; ; tmpp++)
286 if (*tmpp == 0x00) break;
290 trace_surface_filter_size_w = atoi(tmp);
291 trace_surface_filter_size_h = atoi(tmpp + 1);
298 #ifdef COREGL_TRACEPATH_TRACE_CONTEXT_INFO
299 trace_ctx_flag = atoi(get_env_setting("COREGL_TRACE_CTX"));
300 trace_ctx_force_flag = atoi(get_env_setting("COREGL_TRACE_CTX_FORCE"));
302 #ifdef COREGL_TRACEPATH_TRACE_STATE_INFO
303 trace_state_flag = atoi(get_env_setting("COREGL_TRACE_STATE"));
308 COREGL_LOG("[CoreGL] \E[40;32;1m<Trace> \E[40;37;1m: ");
310 if (trace_api_flag == 1)
312 COREGL_LOG("\E[40;31;1m(API)\E[0m ");
313 if (trace_api_all_flag == 1) COREGL_LOG("\E[40;31;1m(API-ALL)\E[0m ");
314 if (trace_api_frame_flag == 1) COREGL_LOG("\E[40;31;1m(API-FRAME)\E[0m ");
316 if (trace_ctx_flag == 1) {
317 COREGL_LOG("\E[40;33;1m(CONTEXT)\E[0m ");
318 if (trace_ctx_force_flag == 1) COREGL_LOG("\E[40;33;1m(CONTEXT-FORCE)\E[0m ");
320 if (trace_state_flag == 1) COREGL_LOG("\E[40;36;1m(STATE)\E[0m ");
321 if (trace_mem_flag == 1)
323 COREGL_LOG("\E[40;35;1m(MEM)\E[0m ");
324 if (trace_mem_all_flag == 1) COREGL_LOG("\E[40;35;1m(MEM-ALL)\E[0m ");
326 if (trace_surface_flag == 1) {
327 COREGL_LOG("\E[40;36;1m(SURFACE)\E[0m ");
328 if (trace_surface_sequence_sort_flag == 1) COREGL_LOG("\E[40;36;1m(SURFACE-SEQUENCE SORT)\E[0m ");
329 if (trace_surface_print_only_flag == 1) COREGL_LOG("\E[40;36;1m(PRINT ONLY)\E[0m ");
330 if (trace_surface_filter_period_begin != 0 || trace_surface_filter_period_end != 0)
331 COREGL_LOG("\E[40;36;1m(SURFACE-PERIOD:%d~%d)\E[0m ", trace_surface_filter_period_begin, trace_surface_filter_period_end);
332 if (trace_surface_filter_type == 1) COREGL_LOG("\E[40;36;1m(SURFACE-TYPE:EGL)\E[0m ");
333 if (trace_surface_filter_type == 2) COREGL_LOG("\E[40;36;1m(SURFACE-TYPE:FBO)\E[0m ");
334 if (trace_surface_filter_handle != 0) COREGL_LOG("\E[40;36;1m(SURFACE-HANDLE:0x%x(%d))\E[0m ", trace_surface_filter_handle, trace_surface_filter_handle);
335 if (trace_surface_filter_size_w > 0 && trace_surface_filter_size_h > 0)
336 COREGL_LOG("\E[40;36;1m(SURFACE-SIZE:%dx%d)\E[0m ", trace_surface_filter_size_w, trace_surface_filter_size_h);
339 COREGL_LOG("\E[40;37;1menabled\E[0m\n");
344 deinit_modules_tracepath()
349 init_modules_tstate_tracepath(GLThreadState *tstate)
351 MY_MODULE_TSTATE *tstate_mt = NULL;
353 tstate_mt = (MY_MODULE_TSTATE *)calloc(1, sizeof(MY_MODULE_TSTATE));
356 tstate->module_data[MY_MODULE_ID] = tstate_mt;
360 deinit_modules_tstate_tracepath(GLThreadState *tstate)
362 if (tstate->module_data[MY_MODULE_ID] != NULL)
364 free(tstate->module_data[MY_MODULE_ID]);
365 tstate->module_data[MY_MODULE_ID] = NULL;
370 tracepath_apply_overrides()
374 tracepath_apply_overrides_egl(1);
375 tracepath_apply_overrides_gl(1);
380 tracepath_apply_overrides_egl(int enable)
382 #define _COREGL_SYMBOL(RET_TYPE, FUNC_NAME, PARAM_LIST) COREGL_INIT_ORIGINAL(_orig_tracepath_, FUNC_NAME);
383 # include "../../headers/sym_egl.h"
384 #undef _COREGL_SYMBOL
386 #define _COREGL_SYMBOL(RET_TYPE, FUNC_NAME, PARAM_LIST) COREGL_OVERRIDE(tracepath_, FUNC_NAME);
387 # include "../../headers/sym_egl.h"
388 #undef _COREGL_SYMBOL
392 tracepath_apply_overrides_gl(int enable)
394 #define _COREGL_START_API(version) api_gl_version = version;
395 #define _COREGL_END_API(version) api_gl_version = COREGL_GLAPI_2;
396 #define _COREGL_SYMBOL(RET_TYPE, FUNC_NAME, PARAM_LIST) \
397 if(api_gl_version <= driver_gl_version) COREGL_INIT_ORIGINAL(_orig_tracepath_, FUNC_NAME);
398 # include "../../headers/sym_gl.h"
399 #undef _COREGL_SYMBOL
401 #define _COREGL_SYMBOL(RET_TYPE, FUNC_NAME, PARAM_LIST) \
402 if(api_gl_version <= driver_gl_version) COREGL_OVERRIDE(tracepath_, FUNC_NAME);
403 # include "../../headers/sym_gl.h"
404 #undef _COREGL_SYMBOL
405 #undef _COREGL_START_API
406 #undef _COREGL_END_API
412 tracepath_dump_context_states(int force_output)
414 static struct timeval tv_last = { 0, 0 };
416 if (unlikely(trace_state_flag != 1)) return;
418 _sym_glGetIntegerv(GL_MAX_DRAW_BUFFERS, (GLint *)initial_fake_ctx->gl_num_draw_buffers);
419 _sym_glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, (GLint *)initial_fake_ctx->gl_num_tex_units);
420 _sym_glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, (GLint *)initial_fake_ctx->gl_num_vertex_attribs);
421 _sym_glGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, (GLint *)initial_fake_ctx->gl_num_transform_feedback_separate_attribs);
422 _sym_glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, (GLint *)initial_fake_ctx->gl_num_uniform_buffer_bindings);
426 struct timeval tv_now = { 0, 0 };
427 AST(gettimeofday(&tv_now, NULL) == 0);
428 if (tv_now.tv_sec - tv_last.tv_sec < _COREGL_TRACE_OUTPUT_INTERVAL_SEC)
436 TRACE("\E[0;40;34m===================================================================================================================\E[0m\n");
437 TRACE("\E[40;32;1m State info \E[1;37;1m: <PID = %d> (CURRENT BINDED CONTEXT)\E[0m\n", getpid());
438 TRACE("\E[0;40;34m===================================================================================================================\E[0m\n");
440 #define PRINTF_CHAR_GLenum "0x%8X"
441 #define PRINTF_CHAR_GLboolean "%10d"
442 #define PRINTF_CHAR_GLint "%10d"
443 #define PRINTF_CHAR_GLsizei "%10u"
444 #define PRINTF_CHAR_GLuint "%10u"
445 #define PRINTF_CHAR_GLuintmask "0x%8X"
446 #define PRINTF_CHAR_GLintptr "%10ld"
447 #define PRINTF_CHAR_GLsizeiptr "%10ld"
449 #define PRINTF_CHAR_GLclampf "%10.6f"
450 #define PRINTF_CHAR_GLfloat "%10.6f"
452 #define PRINTF_CHAR_GLvoidptr "%10p"
454 #define PRINTF_CHAR(type) PRINTF_CHAR_##type
456 #define INITIAL_CTX initial_fake_ctx
458 #define GLUE_STATE(TYPE, NAME, SIZE, ARRAY_SIZE, DEFAULT_STMT, GET_STMT) \
460 TYPE valuedata[SIZE]; \
461 TYPE *value = NULL; \
462 value = valuedata; GET_STMT; value = valuedata; \
463 TRACE("\E[40;37;1m %-30.30s : (\E[0m ", #NAME); \
464 for (int i = 0; i < SIZE; i++) \
468 TRACE("\n %-30.30s ", "");\
472 TRACE("["PRINTF_CHAR(TYPE)"]", value[i]); \
474 TRACE(" \E[40;37;1m)\E[0m\n"); \
476 # include "../fastpath/coregl_fastpath_state.h"
479 TRACE("\E[0;40;34m===================================================================================================================\E[0m\n");
490 _add_timeval_period(struct timeval *tv_dst, struct timeval tv_now, struct timeval tv_old)
492 tv_dst->tv_sec += tv_now.tv_sec - tv_old.tv_sec;
493 tv_dst->tv_usec += 1000000 + (tv_now.tv_usec - tv_old.tv_usec);
494 tv_dst->tv_sec += (tv_dst->tv_usec / 1000000) - 1;
495 tv_dst->tv_usec = tv_dst->tv_usec % 1000000;
499 _add_timeval(struct timeval *tv_dst, struct timeval tv_src)
501 tv_dst->tv_sec += tv_src.tv_sec;
502 tv_dst->tv_usec += tv_src.tv_usec;
503 if (tv_dst->tv_usec > 1000000)
505 tv_dst->tv_usec -= 1000000;
508 else if (tv_dst->tv_usec < 0)
510 tv_dst->tv_usec += 1000000;
516 _get_timeval_period(struct timeval time_now, struct timeval time_old)
518 return ((time_now.tv_sec - time_old.tv_sec) * 1000) + ((time_now.tv_usec - time_old.tv_usec) / 1000.0);
522 _get_timeval(struct timeval time)
524 return (time.tv_sec * 1000) + (time.tv_usec / 1000.0);
527 static unsigned short
528 _generate_hash_short(const char *string)
530 unsigned short hash = 0;
533 for (i = 0; i < strlen(string); i++)
535 hash = 253 * hash + string[i];
537 return (hash ^ (hash >> 8)) % MAX_TRACE_TABLE_SIZE;
541 _get_trace_data(Trace_Data **ftd_table, size_t td_size, const char *name)
543 Trace_Data *ret = NULL;
544 Trace_Data *current = NULL;
545 Trace_Data *prev = NULL;
546 unsigned short hash = 0;
548 AST(strlen(name) < MAX_TRACE_NAME_LENGTH);
550 hash = _generate_hash_short(name);
552 current = ftd_table[hash];
554 while (current != NULL && current->next != NULL)
556 if (strcmp(current->name, name) == 0)
559 current = current->next;
568 Trace_Data *newitm = NULL;
569 newitm = (Trace_Data *)calloc(1, td_size);
570 /* Prevent CID : 390717 */
571 if (newitm == NULL) goto finish;
572 strncpy(newitm->name, name, strlen(name));
581 ftd_table[hash] = newitm;
593 tracepath_mem_trace_add(const char *desc, int alloc_size)
595 Memuse_Data *mtd = NULL;
597 if (trace_mem_flag == 1)
599 AST(mutex_lock(&mtd_access_mutex) == 1);
601 if (mtd_table == NULL)
603 mtd_table = (Memuse_Data **)calloc(1, sizeof(Memuse_Data *) * MAX_TRACE_TABLE_SIZE);
606 mtd = (Memuse_Data *)_get_trace_data((Trace_Data **)mtd_table, sizeof(Memuse_Data), desc);
612 if (mtd->memsize == 0)
613 mtd->memsize = alloc_size;
615 AST(mtd->memsize == alloc_size);
617 AST(mutex_unlock(&mtd_access_mutex) == 1);
619 if (trace_mem_all_flag == 1)
620 _COREGL_TRACE_MEM_OUTPUT(1);
626 tracepath_mem_trace_remove(const char *desc, int alloc_size)
628 Memuse_Data *mtd = NULL;
630 if (trace_mem_flag == 1)
632 AST(mutex_lock(&mtd_access_mutex) == 1);
634 if (mtd_table == NULL)
636 mtd_table = (Memuse_Data **)calloc(1, sizeof(Memuse_Data *) * MAX_TRACE_TABLE_SIZE);
639 mtd = (Memuse_Data *)_get_trace_data((Trace_Data **)mtd_table, sizeof(Memuse_Data), desc);
642 AST(mtd->memsize == alloc_size);
644 AST(mtd->alloc_count > mtd->remove_count);
647 AST(mutex_unlock(&mtd_access_mutex) == 1);
649 if (trace_mem_all_flag == 1)
650 _COREGL_TRACE_MEM_OUTPUT(1);
655 tracepath_api_trace_begin(const char *funcname, void *hint, int trace_total_time)
657 Apicall_Data *ftd = NULL;
658 struct timeval t = TIMEVAL_INIT;
660 if (trace_api_flag == 1)
662 AST(gettimeofday(&t, NULL) == 0);
664 ftd = (Apicall_Data *)hint;
668 MY_MODULE_TSTATE *tstate = NULL;
669 GET_MY_TSTATE(tstate, get_current_thread_state());
673 init_new_thread_state();
675 GET_MY_TSTATE(tstate, get_current_thread_state());
678 /* Prevent CID : 389488 */
679 if (tstate == NULL) return NULL;
682 if (tstate->ftd_table == NULL)
684 tstate->ftd_table = (Apicall_Data **)calloc(1, sizeof(Apicall_Data *) * MAX_TRACE_TABLE_SIZE);
685 /* Prevent CID : 393786 */
686 if (tstate->ftd_table == NULL) return NULL;
689 ftd = (Apicall_Data *)_get_trace_data((Trace_Data **)tstate->ftd_table, sizeof(Apicall_Data), funcname);
695 AST(ftd->last_time.tv_sec == 0);
697 AST(gettimeofday(&ftd->last_time, NULL) == 0);
699 if (initial_time.tv_sec == 0)
701 initial_time = ftd->last_time;
702 last_initial_time = ftd->last_time;
705 if (trace_total_time == 1)
707 if (last_trace_time.tv_sec != 0)
709 _add_timeval_period(&other_elapsed_time, t, last_trace_time);
710 last_trace_time.tv_sec = 0;
720 tracepath_api_trace_end(const char *funcname, void *hint, int trace_total_time)
722 Apicall_Data *ftd = NULL;
723 struct timeval t = TIMEVAL_INIT;
725 if (trace_api_flag == 1)
727 MY_MODULE_TSTATE *tstate = NULL;
728 struct timeval elapsed_time = TIMEVAL_INIT;
730 AST(gettimeofday(&t, NULL) == 0);
732 ftd = (Apicall_Data *)hint;
736 GET_MY_TSTATE(tstate, get_current_thread_state());
740 init_new_thread_state();
742 GET_MY_TSTATE(tstate, get_current_thread_state());
744 /* Prevent CID : 389595 */
745 if (tstate == NULL) return NULL;
749 AST(tstate->ftd_table != NULL);
751 ftd = (Apicall_Data *)_get_trace_data((Trace_Data **)tstate->ftd_table, sizeof(Apicall_Data), funcname);
756 _add_timeval_period(&elapsed_time, t, ftd->last_time);
758 _add_timeval(&ftd->elapsed_time, elapsed_time);
760 if (elapsed_time.tv_sec >= ftd->elapsed_time_max.tv_sec &&
761 elapsed_time.tv_usec > ftd->elapsed_time_max.tv_usec)
763 ftd->elapsed_time_max.tv_sec = elapsed_time.tv_sec;
764 ftd->elapsed_time_max.tv_usec = elapsed_time.tv_usec;
767 ftd->last_time.tv_sec = 0;
769 if (trace_total_time == 1)
771 _add_timeval(&ftd->total_elapsed_time, elapsed_time);
773 AST(gettimeofday(&last_trace_time, NULL) == 0);
775 if (initial_time.tv_sec == 0)
778 last_initial_time = t;
789 tracepath_api_trace_output(int force_output)
791 static struct timeval tv_last = TIMEVAL_INIT;
792 struct timeval total_now = TIMEVAL_INIT;
793 GLThreadState *tstate = NULL;
794 MY_MODULE_TSTATE *tstate_tm = NULL;
795 Apicall_Data **ftd_table = NULL;
797 double total_elapsed_time = 0.0;
798 double total_elapsed_time_period = 0.0;
799 double total_opengl_elapsed_time = 0.0;
800 double total_opengl_elapsed_time_period = 0.0;
801 double total_other_elapsed_time = 0.0;
802 double total_other_elapsed_time_period = 0.0;
804 double swaps_per_sec = 0.0;
808 if (trace_api_flag != 1)
815 struct timeval tv_now = TIMEVAL_INIT;
816 AST(gettimeofday(&tv_now, NULL) == 0);
817 if (tv_now.tv_sec - tv_last.tv_sec < _COREGL_TRACE_OUTPUT_INTERVAL_SEC)
824 AST(gettimeofday(&total_now, NULL) == 0);
826 total_elapsed_time = _get_timeval_period(total_now, initial_time);
827 total_elapsed_time_period = _get_timeval_period(total_now, last_initial_time);
828 last_initial_time = total_now;
830 total_other_elapsed_time = _get_timeval(other_elapsed_time);
831 total_other_elapsed_time_period = _get_timeval_period(other_elapsed_time, traced_other_elapsed_time);
832 traced_other_elapsed_time = other_elapsed_time;
834 tstate = get_current_thread_state();
838 init_new_thread_state();
840 tstate = get_current_thread_state();
844 GET_MY_TSTATE(tstate_tm, tstate);
845 if (tstate_tm == NULL) goto finish;
847 ftd_table = tstate_tm->ftd_table;
848 if (ftd_table == NULL) goto finish;
851 static Apicall_Data *trace_hint_swap = NULL;
852 if (trace_hint_swap == NULL)
853 trace_hint_swap = (Apicall_Data *)_get_trace_data((Trace_Data **)ftd_table, sizeof(Apicall_Data), "tracepath_eglSwapBuffers");
855 if (trace_hint_swap != NULL && total_elapsed_time_period > 0)
857 swaps_per_sec = (trace_hint_swap->call_count - trace_hint_swap->last_call_count) / (total_elapsed_time_period / 1000);
863 TRACE("\E[40;34m========================================================================================================================\E[0m\n");
864 TRACE("\E[40;32;1m API call info \E[1;37;1m: <PID = %d> Thread ID = 0x%x [Swaps per Second(P) = %7.2f]\E[0m\n", getpid(), tstate->thread_id, swaps_per_sec);
865 TRACE("\E[40;34m========================================================================================================================\E[0m\n");
868 for (i = 0; i < MAX_TRACE_TABLE_SIZE; i++)
870 if (ftd_table[i] != NULL)
872 Apicall_Data *current = ftd_table[i];
874 while (current != NULL)
876 double elapsed_time = _get_timeval(current->elapsed_time);
877 double elapsed_time_per_call = elapsed_time / current->call_count;
879 total_opengl_elapsed_time += _get_timeval(current->total_elapsed_time);
880 total_opengl_elapsed_time_period += _get_timeval(current->total_elapsed_time) - _get_timeval(current->last_total_elapsed_time);
884 if (current->call_count > current->last_call_count)
886 double elapsed_time_period = _get_timeval_period(current->elapsed_time, current->last_elapsed_time);
887 double elapsed_time_max = _get_timeval(current->elapsed_time_max);
888 double elapsed_time_per_call_period = elapsed_time_period / (current->call_count - current->last_call_count);
889 char *fname = current->trace_data.name;
891 if (!strncmp(fname, "tracepath_", 10))
892 fname = ¤t->trace_data.name[10];
894 if (elapsed_time_per_call_period >= 0.01 || current->call_count - current->last_call_count > 1000)
896 TRACE("\E[40;37;1m %-39.39s : %10d call(s), %9.3f ms/API, %9.2f ms(MAX), %9.3f ms/API(P)\E[0m\n",
897 fname, current->call_count, elapsed_time_per_call, elapsed_time_max, elapsed_time_per_call_period);
901 current = (Apicall_Data *)current->trace_data.next;
908 fp_env = atoi(get_env_setting("COREGL_TRACE_API_ALL"));
912 for (i = 0; i < MAX_TRACE_TABLE_SIZE; i++)
914 if (ftd_table[i] != NULL)
916 Apicall_Data *current = ftd_table[i];
918 while (current != NULL)
920 if (current->traced == 0 && current->call_count > 0)
922 double elapsed_time = _get_timeval(current->elapsed_time);
923 double elapsed_time_per_call = elapsed_time / current->call_count;
924 double elapsed_time_max = _get_timeval(current->elapsed_time_max);
925 char *fname = current->trace_data.name;
927 if (!strncmp(fname, "tracepath_", 10))
928 fname = ¤t->trace_data.name[10];
930 TRACE(" %-39.39s : %10d call(s), %9.3f ms/API, %9.2f ms(MAX)\n",
931 fname, current->call_count, elapsed_time_per_call, elapsed_time_max);
933 current = (Apicall_Data *)current->trace_data.next;
940 TRACE("\E[40;34m========================================================================================================================\E[0m\n");
942 if (trace_api_frame_flag == 0)
944 TRACE("\E[40;36;1m %-39.39s : %13.2f ms[%6.2f%%], %13.2f ms(P)[%6.2f%%]\E[0m\n",
945 "TOTAL elapsed Time",
948 total_elapsed_time_period,
952 TRACE("\E[40;36;1m %-39.39s : %13.2f ms[%6.2f%%], %13.2f ms(P)[%6.2f%%]\E[0m\n",
953 "OpenGL elapsed Time",
954 total_opengl_elapsed_time,
955 total_opengl_elapsed_time * 100.0 / total_elapsed_time,
956 total_opengl_elapsed_time_period,
957 total_opengl_elapsed_time_period * 100.0 / total_elapsed_time_period);
959 TRACE("\E[40;36;1m %-39.39s : %13.2f ms[%6.2f%%], %13.2f ms(P)[%6.2f%%]\E[0m\n",
960 "Out of OpenGL elapsed time",
961 total_other_elapsed_time,
962 total_other_elapsed_time * 100.0 / total_elapsed_time,
963 total_other_elapsed_time_period,
964 total_other_elapsed_time_period * 100.0 / total_elapsed_time_period);
966 TRACE("\E[40;36;1m %-39.39s : %13.2f ms[%6.2f%%], %13.2f ms(P)[%6.2f%%]\E[0m\n",
967 "CoreGL API tracing overhead",
968 total_elapsed_time - total_opengl_elapsed_time - total_other_elapsed_time,
969 (total_elapsed_time - total_opengl_elapsed_time - total_other_elapsed_time) * 100.0 / total_elapsed_time,
970 total_elapsed_time_period - total_opengl_elapsed_time_period - total_other_elapsed_time_period,
971 (total_elapsed_time_period - total_opengl_elapsed_time_period - total_other_elapsed_time_period) * 100.0 / total_elapsed_time_period);
973 TRACE("\E[40;34m========================================================================================================================\E[0m\n");
977 for (i = 0; i < MAX_TRACE_TABLE_SIZE; i++)
979 if (ftd_table[i] != NULL)
981 Apicall_Data *current = ftd_table[i];
983 while (current != NULL)
985 current->last_call_count = current->call_count;
986 current->last_elapsed_time = current->elapsed_time;
987 current->last_total_elapsed_time = current->total_elapsed_time;
988 current = (Apicall_Data *)current->trace_data.next;
1002 tracepath_api_trace_reset_frame()
1004 GLThreadState *tstate = NULL;
1005 MY_MODULE_TSTATE *tstate_tm = NULL;
1006 Apicall_Data **ftd_table = NULL;
1010 if (trace_api_flag != 1)
1015 tstate = get_current_thread_state();
1019 init_new_thread_state();
1021 tstate = get_current_thread_state();
1022 AST(tstate != NULL);
1025 GET_MY_TSTATE(tstate_tm, tstate);
1026 if (tstate_tm == NULL) goto finish;
1028 ftd_table = tstate_tm->ftd_table;
1029 if (ftd_table == NULL) goto finish;
1031 for (i = 0; i < MAX_TRACE_TABLE_SIZE; i++)
1033 if (ftd_table[i] != NULL)
1035 Apicall_Data *current = ftd_table[i];
1037 while (current != NULL)
1039 current->call_count = 0;
1040 current->last_call_count = 0;
1041 current->elapsed_time.tv_sec = 0;
1042 current->elapsed_time.tv_usec = 0;
1043 current->last_elapsed_time.tv_sec = 0;
1044 current->last_elapsed_time.tv_usec = 0;
1045 current->last_total_elapsed_time.tv_sec = 0;
1046 current->last_total_elapsed_time.tv_usec = 0;
1047 current->total_elapsed_time.tv_sec = 0;
1048 current->total_elapsed_time.tv_usec = 0;
1049 current = (Apicall_Data *)current->trace_data.next;
1053 AST(gettimeofday(&last_initial_time, NULL) == 0);
1061 tracepath_mem_trace_output(int force_output)
1063 static struct timeval tv_last = TIMEVAL_INIT;
1067 if (trace_mem_flag != 1)
1074 struct timeval tv_now = TIMEVAL_INIT;
1075 AST(gettimeofday(&tv_now, NULL) == 0);
1076 if (tv_now.tv_sec - tv_last.tv_sec < _COREGL_TRACE_OUTPUT_INTERVAL_SEC)
1084 TRACE("\E[40;34m========================================================================================================================\E[0m\n");
1085 TRACE("\E[40;32;1m Memory usage info \E[1;37;1m: <PID = %d>\E[0m\n", getpid());
1086 TRACE("\E[40;34m========================================================================================================================\E[0m\n");
1088 if (mtd_table != NULL)
1090 for (i = 0; i < MAX_TRACE_TABLE_SIZE; i++)
1092 if (mtd_table[i] != NULL)
1094 Memuse_Data *current = mtd_table[i];
1096 while (current != NULL)
1098 int obj_count = current->alloc_count - current->remove_count;
1101 TRACE("\E[40;37;1m %-46.46s : %12d byte(s)(E), %9d object(s) [%9d+/%9d-]\E[0m\n",
1102 current->trace_data.name, current->memsize, obj_count, current->alloc_count, current->remove_count);
1104 current = (Memuse_Data *)current->trace_data.next;
1109 for (i = 0; i < MAX_TRACE_TABLE_SIZE; i++)
1111 if (mtd_table[i] != NULL)
1113 Memuse_Data *current = mtd_table[i];
1115 while (current != NULL)
1117 int obj_count = current->alloc_count - current->remove_count;
1120 TRACE(" %-46.46s : %12d byte(s)(E), %9d object(s) [%9d+/%9d-]\n",
1121 current->trace_data.name, current->memsize, obj_count, current->alloc_count, current->remove_count);
1123 current = (Memuse_Data *)current->trace_data.next;
1129 TRACE("\E[40;34m========================================================================================================================\E[0m\n");
1142 void *png_lib_handle = NULL;
1144 png_structp (*dl_png_create_write_struct) (png_const_charp user_png_ver,
1145 png_voidp error_ptr,
1146 png_error_ptr error_fn,
1147 png_error_ptr warn_fn);
1150 void (*dl_png_destroy_write_struct) (png_structpp png_ptr_ptr,
1151 png_infopp info_ptr_ptr);
1154 png_infop (*dl_png_create_info_struct) (png_structp png_ptr);
1156 void (*dl_png_init_io) (png_structp png_ptr,
1160 void (*dl_png_set_IHDR) (png_structp png_ptr,
1166 int interlace_method,
1167 int compression_method,
1170 void (*dl_png_set_bKGD) (png_structp png_ptr,
1172 png_color_16p background);
1174 void (*dl_png_set_bgr) (png_structp png_ptr);
1176 void (*dl_png_write_info) (png_structp png_ptr,
1177 png_infop info_ptr);
1179 void (*dl_png_write_image) (png_structp png_ptr,
1182 void (*dl_png_write_end) (png_structp png_ptr,
1183 png_infop info_ptr);
1186 _dump_surface(int force_output, int type, const char *position, Surface_Data *sdata)
1188 static int alldumpcount = 0;
1189 unsigned char *data = NULL;
1190 EGLint width = -1, height = -1, channel = -1;
1192 FILE *write_fd = NULL;
1193 png_struct *png = NULL;
1194 png_info *info = NULL;
1195 png_byte **rows = NULL;
1197 if (!png_lib_handle)
1199 png_lib_handle = dlopen("libpng.so.3", RTLD_NOW);
1201 dl_png_create_write_struct = dlsym(png_lib_handle, "png_create_write_struct");
1202 dl_png_destroy_write_struct = dlsym(png_lib_handle, "png_destroy_write_struct");
1203 dl_png_create_info_struct = dlsym(png_lib_handle, "png_create_info_struct");
1205 dl_png_init_io = dlsym(png_lib_handle, "png_init_io");
1207 dl_png_set_IHDR = dlsym(png_lib_handle, "png_set_IHDR");
1208 dl_png_set_bKGD = dlsym(png_lib_handle, "png_set_bKGD");
1209 dl_png_set_bgr = dlsym(png_lib_handle, "png_set_bgr");
1211 dl_png_write_info = dlsym(png_lib_handle, "png_write_info");
1212 dl_png_write_image = dlsym(png_lib_handle, "png_write_image");
1213 dl_png_write_end = dlsym(png_lib_handle, "png_write_end");
1217 if (!png_lib_handle ||
1218 dl_png_create_write_struct == NULL ||
1219 dl_png_destroy_write_struct == NULL ||
1220 dl_png_create_info_struct == NULL ||
1221 dl_png_init_io == NULL ||
1222 dl_png_set_IHDR == NULL ||
1223 dl_png_set_bKGD == NULL ||
1224 dl_png_set_bgr == NULL ||
1225 dl_png_write_info == NULL ||
1226 dl_png_write_image == NULL ||
1227 dl_png_write_end == NULL)
1229 COREGL_ERR("Can't trace surface : Failed to use libpng (recommend : 1.2.50-3.4)");
1233 if (trace_surface_sequence_sort_flag == 1)
1234 snprintf(name,sizeof(name), "[%d (%06d)%p-%p] %s %04d (%s).png", getpid(), alldumpcount, sdata->display, sdata->context, sdata->trace_data.name, sdata->dump_count, position);
1236 snprintf(name,sizeof(name), "[%d %p-%p] %s %04d (%s).png", getpid(), sdata->display, sdata->context, sdata->trace_data.name, sdata->dump_count, position);
1238 if (!strncmp(sdata->trace_data.name, "EGL", 3) && type != 2)
1240 if (trace_surface_filter_type != 0 &&
1241 trace_surface_filter_type != 1) goto finish;;
1243 if (trace_surface_filter_handle != 0 &&
1244 trace_surface_filter_handle != (int)sdata->surface) goto finish;
1246 EGLConfig eglconfig;
1247 GLint asize, rsize, gsize, bsize;
1248 _orig_tracepath_eglQuerySurface(sdata->display, sdata->surface, EGL_WIDTH, &width);
1249 _orig_tracepath_eglQuerySurface(sdata->display, sdata->surface, EGL_HEIGHT, &height);
1250 _orig_tracepath_eglQuerySurface(sdata->display, sdata->surface, EGL_CONFIG_ID, (GLint *)&eglconfig);
1251 _orig_tracepath_eglGetConfigAttrib(sdata->display, eglconfig, EGL_ALPHA_SIZE, &asize);
1252 _orig_tracepath_eglGetConfigAttrib(sdata->display, eglconfig, EGL_RED_SIZE, &rsize);
1253 _orig_tracepath_eglGetConfigAttrib(sdata->display, eglconfig, EGL_GREEN_SIZE, &gsize);
1254 _orig_tracepath_eglGetConfigAttrib(sdata->display, eglconfig, EGL_BLUE_SIZE, &bsize);
1256 if (asize == 0) channel = 3;
1257 if (bsize == 0) channel = 2;
1258 if (gsize == 0) channel = 1;
1259 if (rsize == 0) channel = 0;
1261 if (channel == 2) channel = 3;
1262 if (width <= 0 || height <= 0 || channel <= 0) goto finish;
1263 if (trace_surface_filter_size_w > 0 && trace_surface_filter_size_h > 0 &&
1264 (trace_surface_filter_size_w != width || trace_surface_filter_size_h != height))
1267 if ((trace_surface_filter_period_begin > 0 || trace_surface_filter_period_end > 0) &&
1268 (trace_surface_filter_period_begin > alldumpcount || trace_surface_filter_period_end < alldumpcount))
1271 sdata->dump_count++;
1275 if (channel == 3) channel = 4;
1277 TRACE("\E[40;31;1m[[TRACE SURFACE]] : '%s' is dumped (%dx%dx%d).\E[0m\n", name, width, height, channel);
1278 if (trace_surface_print_only_flag == 1 && force_output == 0)
1281 sdata->dump_count++;
1285 data = (unsigned char *)calloc(1, width * height * channel * sizeof(unsigned char));
1288 COREGL_ERR("Can't trace surface : Failed to allocate memory");
1293 _orig_tracepath_glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldfb);
1294 _orig_tracepath_glBindFramebuffer(GL_FRAMEBUFFER, 0);
1298 case 4: _orig_tracepath_glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data); break;
1299 //case 3: _orig_tracepath_glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, data); break;
1300 case 1: _orig_tracepath_glReadPixels(0, 0, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, data); break;
1303 _orig_tracepath_glBindFramebuffer(GL_FRAMEBUFFER, oldfb);
1305 if (!strncmp(sdata->trace_data.name, "FBO", 3) && type != 1)
1307 if (sdata->fbo == 0) goto finish;
1309 if (trace_surface_filter_type != 0 &&
1310 trace_surface_filter_type != 2) goto finish;
1312 if (trace_surface_filter_handle != 0 &&
1313 trace_surface_filter_handle != sdata->tex &&
1314 trace_surface_filter_handle != sdata->rb) goto finish;
1317 _orig_tracepath_glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldfb);
1318 _orig_tracepath_glBindFramebuffer(GL_FRAMEBUFFER, sdata->fbo);
1320 if (_orig_tracepath_glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE)
1322 _orig_tracepath_glBindFramebuffer(GL_FRAMEBUFFER, oldfb);
1323 width = sdata->tex_w;
1324 height = sdata->tex_h;
1325 channel = sdata->tex_format;
1327 if (channel == 2) channel = 3;
1328 if (width <= 0 || height <= 0 || channel <= 0) goto finish;
1329 if (trace_surface_filter_size_w > 0 && trace_surface_filter_size_h > 0 &&
1330 (trace_surface_filter_size_w != width || trace_surface_filter_size_h != height))
1333 if ((trace_surface_filter_period_begin > 0 || trace_surface_filter_period_end > 0) &&
1334 (trace_surface_filter_period_begin > alldumpcount || trace_surface_filter_period_end < alldumpcount))
1337 sdata->dump_count++;
1341 TRACE("\E[40;31;1m[[TRACE SURFACE]] : '%s' is dumped (%dx%dx%d).\E[0m\n", name, width, height, channel);
1342 if (trace_surface_print_only_flag == 1 && force_output == 0)
1345 sdata->dump_count++;
1349 if (channel == 3) channel = 4;
1351 data = (unsigned char *)calloc(1, width * height * channel * sizeof(unsigned char));
1354 COREGL_ERR("Can't trace surface : Failed to allocate memory");
1358 _orig_tracepath_glBindFramebuffer(GL_FRAMEBUFFER, sdata->fbo);
1359 int atttype = _COREGL_INT_INIT_VALUE;
1360 _orig_tracepath_glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &atttype);
1361 AST(atttype != sdata->tex);
1362 int attname = _COREGL_INT_INIT_VALUE;
1363 _orig_tracepath_glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &attname);
1367 AST(attname == sdata->tex);
1369 case GL_RENDERBUFFER:
1370 AST(attname == sdata->rb);
1376 case 4: _orig_tracepath_glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data); break;
1377 //case 3: _orig_tracepath_glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, data); break;
1378 case 1: _orig_tracepath_glReadPixels(0, 0, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, data); break;
1381 _orig_tracepath_glBindFramebuffer(GL_FRAMEBUFFER, oldfb);
1386 if (data == NULL) goto finish;
1389 write_fd = fopen(name, "wb");
1391 if (write_fd == NULL)
1393 COREGL_ERR("Can't trace surface : Failed to create png file");
1397 rows = (png_byte **)malloc(height * sizeof(png_byte *));
1400 COREGL_ERR("Can't trace surface : Failed to allocate memory");
1404 for (int i = 0; i < height; i++)
1406 rows[i] = data + (height - i - 1) * (width * channel);
1409 png = dl_png_create_write_struct(PNG_LIBPNG_VER_STRING,
1415 COREGL_ERR("Can't trace surface : Failed to create write structure of png file");
1419 info = dl_png_create_info_struct(png);
1422 COREGL_ERR("Can't trace surface : Failed to create info structure of png file");
1426 dl_png_init_io(png, write_fd);
1430 case 4: dl_png_set_IHDR(png, info, width, height, 8, PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); break;
1431 //case 3: dl_png_set_IHDR(png, info, width, height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); break;
1432 case 1: dl_png_set_IHDR(png, info, width, height, 8, PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); break;
1435 dl_png_write_info(png, info);
1437 dl_png_write_image(png, rows);
1439 dl_png_write_end(png, info);
1441 dl_png_destroy_write_struct(&png, &info);
1444 sdata->dump_count++;
1455 if (write_fd != NULL)
1469 dl_png_destroy_write_struct(&png, &info);
1473 dl_png_destroy_write_struct(&png, NULL);
1479 tracepath_surface_trace_add(const char *desc, GLDisplay dpy, GLContext ctx, GLSurface surf, GLint fbo, GLint tex, GLint rb, GLint tex_w, GLint tex_h, GLint tex_format, const char *dump)
1481 Surface_Data *std = NULL;
1483 if (trace_surface_flag == 1)
1485 AST(mutex_lock(&std_access_mutex) == 1);
1487 if (std_table == NULL)
1489 std_table = (Surface_Data **)calloc(1, sizeof(Surface_Data *) * MAX_TRACE_TABLE_SIZE);
1492 std = (Surface_Data *)_get_trace_data((Trace_Data **)std_table, sizeof(Surface_Data), desc);
1498 _dump_surface(0, 0, dump, std);
1502 std->surface = surf;
1504 if (fbo >= 0) std->fbo = fbo;
1507 if (tex_w >= 0) std->tex_w = tex_w;
1508 if (tex_h >= 0) std->tex_h = tex_h;
1509 if (tex_format >= 0) std->tex_format = tex_format;
1511 AST(mutex_unlock(&std_access_mutex) == 1);
1518 tracepath_surface_trace(int force_output, int type, const char *position)
1522 if (trace_surface_flag != 1)
1527 AST(mutex_lock(&std_access_mutex) == 1);
1529 if (std_table != NULL)
1531 EGLDisplay olddpy = _orig_tracepath_eglGetCurrentDisplay();
1532 EGLContext oldctx = _orig_tracepath_eglGetCurrentContext();
1533 EGLSurface oldsurf_read = _orig_tracepath_eglGetCurrentSurface(EGL_READ);
1534 EGLSurface oldsurf_draw = _orig_tracepath_eglGetCurrentSurface(EGL_DRAW);
1536 for (i = 0; i < MAX_TRACE_TABLE_SIZE; i++)
1538 if (std_table[i] != NULL)
1540 Surface_Data *current = std_table[i];
1542 while (current != NULL)
1544 if (current->surface != EGL_NO_SURFACE && current->display != EGL_NO_DISPLAY && current->context != EGL_NO_CONTEXT)
1546 if (_orig_tracepath_eglMakeCurrent(current->display, current->surface, current->surface, current->context) == EGL_TRUE)
1548 _dump_surface(force_output, type, position, current);
1552 current = (Surface_Data *)current->trace_data.next;
1556 _orig_tracepath_eglMakeCurrent(olddpy, oldsurf_read, oldsurf_draw, oldctx);
1560 AST(mutex_unlock(&std_access_mutex) == 1);
1570 coregl_dump_surface()
1572 _COREGL_TRACE_SURFACE(1, 0, "USER CALL");