Merge branch 'master' of slp-info.sec.samsung.net:slp/pkgs/c/coregl
[platform/core/uifw/coregl.git] / src / coregl_internal.h
1 #ifndef COREGL_INTERNAL_H
2 #define COREGL_INTERNAL_H
3
4 #include <stdio.h>
5
6 #include "coregl.h"
7
8 #define unlikely(x) __builtin_expect(x, 0)
9
10 // Symbol definition for real
11 #define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST)     extern RET_TYPE (*_sym_##FUNC_NAME) PARAM_LIST;
12 # include "headers/sym.h"
13 #undef _COREGL_SYMBOL
14
15 #define COREGL_DEBUG
16
17 # define ERR(...) \
18      fprintf(stderr, __VA_ARGS__)
19 # ifdef COREGL_DEBUG
20 #  define DBG(...) \
21      fprintf(stderr, __VA_ARGS__)
22 # else
23 #  define DBG(...)
24 # endif
25
26 # define LOG(...) \
27      fprintf(stderr, __VA_ARGS__)
28
29 # define TRACE(...) \
30      fprintf(trace_fp, __VA_ARGS__)
31
32 # define TRACE_END() \
33      fflush(trace_fp)
34
35 #ifdef COREGL_DEBUG
36 # define AST(expr) \
37      if (!(expr)) { fprintf(stderr, "\E[0;31;1m%s(%d) error. '"#expr"'\E[0m\n", __func__, __LINE__); }
38 #else
39 # define AST(expr) \
40      if (expr)
41 #endif
42
43 typedef GLvoid *     GLvoidptr;
44 typedef GLuint       GLuintmask;
45
46 //#define COREGL_TRACE_ALL
47 #define COREGL_TRACE_CONTEXT_INFO
48 #define COREGL_TRACE_STATE_INFO
49 //#define COREGL_TRACE_APICALL_INFO
50
51 #ifdef COREGL_TRACE_ALL
52 #define COREGL_TRACE_CONTEXT_INFO   // Context state & thread state & Glue-context info
53 #define COREGL_TRACE_STATE_INFO     // Glue-context state info
54 #define COREGL_TRACE_APICALL_INFO   // API call frequency info
55 #endif
56
57 #define _COREGL_TRACE_OUTPUT_INTERVAL_SEC 5
58
59 #define _COREGL_INT_INIT_VALUE -3
60
61 #ifdef COREGL_ERRORS
62 # define GLERR(fn, fl, ln, op)
63 #else
64 # define GLERR(fn, fl, ln, op)
65 #endif
66
67 #define _COREGL_NAME_MANGLE(name) ovr_##name
68
69 typedef struct _Trace_Data Trace_Data;
70
71 #ifdef COREGL_TRACE_APICALL_INFO
72 # define _COREGL_TRACE_API_BEGIN(api, hint, trace_total_time) \
73    trace_begin(api, hint, trace_total_time);
74 # define _COREGL_TRACE_API_END(api, hint, trace_total_time) \
75    trace_end(api, hint, trace_total_time);
76 # define _COREGL_TRACE_API_OUTPUT(force_output) \
77    trace_output(force_output);
78 #else
79 # define _COREGL_TRACE_API_BEGIN(api, hint, trace_total_time) NULL;
80 # define _COREGL_TRACE_API_END(api, hint, trace_total_time)
81 # define _COREGL_TRACE_API_OUTPUT(force_output)
82 #endif
83
84
85 #define _COREGL_FAST_FUNC_BEGIN()
86
87 #define _COREGL_FAST_FUNC_END()
88
89 #define _COREGL_FAST_FUNC_SYMCALL_BEGIN()
90
91 #define _COREGL_FAST_FUNC_SYMCALL_END()
92
93 #define _COREGL_WRAP_FUNC_BEGIN() \
94         static void *trace_hint = NULL; \
95         if (unlikely(trace_api_flag == 1)) \
96                 trace_hint = _COREGL_TRACE_API_BEGIN(__func__, trace_hint, 1);
97
98 #define _COREGL_WRAP_FUNC_END() \
99         if (unlikely(trace_api_flag == 1)) \
100                 _COREGL_TRACE_API_END(__func__, trace_hint, 1);
101
102 typedef enum _CoreGL_Opt_Flag
103 {
104     COREGL_UNKNOWN_PATH,
105     COREGL_NORMAL_PATH,
106     COREGL_FAST_PATH
107 } CoreGL_Opt_Flag;
108
109 extern CoreGL_Opt_Flag api_opt;
110
111 #ifndef _COREGL_DESKTOP_GL
112 typedef EGLSurface     GLSurface;
113 typedef EGLDisplay     GLDisplay;
114 typedef EGLContext     GLContext;
115 #else
116 typedef GLXDrawable    GLSurface;
117 typedef Display        GLDisplay;
118 typedef GLXContext     GLContext;
119 #endif
120
121 typedef struct _GLContextState
122 {
123         int                      ref_count;
124         GLContext               *rctx;
125         GLDisplay               *rdpy;
126         void                    *data;
127 } GLContextState;
128
129 typedef struct _GLThreadState
130 {
131         int                      thread_id;
132         EGLenum                  binded_api;
133         GLContextState          *cstate;
134         GLSurface               *rsurf_draw;
135         GLSurface               *rsurf_read;
136         Trace_Data             **ftd_table;
137 } GLThreadState;
138
139 typedef struct _GLContext_List
140 {
141         void                    *option;
142         int                      option_len;
143         int                      thread_id;
144         GLContextState          *cstate;
145         struct _GLContext_List *next;
146 } GLContext_List;
147
148 extern void                *glue_lib_handle;
149 extern void                *egl_lib_handle;
150
151 extern GLContext_List      *glctx_list;
152
153 #include "coregl_thread_pthread.h"
154 extern Mutex                ctx_list_access_mutex;
155
156 typedef struct _General_Trace_List
157 {
158         void                          *value;
159         struct _General_Trace_List    *next;
160 } General_Trace_List;
161
162 extern General_Trace_List  *thread_trace_list;
163 extern Mutex                general_trace_lists_access_mutex;
164
165 extern int                 trace_api_flag;
166 extern int                 trace_ctx_flag;
167 extern int                 trace_ctx_force_flag;
168 extern int                 trace_state_flag;
169 extern int                 debug_nofp;
170 extern FILE               *trace_fp;
171
172 // Environment functions
173 extern const char         *get_env_setting(const char *name);
174
175 // Main utility functions
176 extern int                 init_new_thread_state();
177
178 // Thread functions
179 extern int                 mutex_lock(Mutex *mt);
180 extern int                 mutex_unlock(Mutex *mt);
181 extern int                 get_current_thread();
182 extern int                 set_current_thread_state(Mutex *mt, GLThreadState *tstate);
183 extern GLThreadState      *get_current_thread_state();
184
185
186 // Context state functions
187 extern int                 add_context_state_to_list(const void *data, const int datalen, GLContextState *cstate, Mutex *mtx);
188 extern int                 remove_context_states_from_list(GLContextState *cstate, Mutex *mtx);
189 extern GLContextState     *get_context_state_from_list(const void *data, const int datalen, Mutex *mtx);
190
191
192 // Override functions
193 extern void                override_glue_normal_path();
194 extern void                override_glue_fast_path();
195 extern void                override_gl_normal_path();
196 extern void                override_gl_fast_path();
197 extern void                override_glue_apis(CoreGL_Opt_Flag opt);
198 extern void                override_gl_apis(CoreGL_Opt_Flag opt);
199
200
201 // Debug & Trace functions
202 extern int                 add_to_general_trace_list(General_Trace_List **gtl, void *value);
203 extern int                 remove_from_general_trace_list(General_Trace_List **gtl, void *value);
204 extern void               *trace_begin(const char *name, void *hint, int trace_total_time);
205 extern void               *trace_end(const char *name, void *hint, int trace_total_time);
206 extern void                trace_output(int force_output);
207
208 #endif // COREGL_INTERNAL_H
209