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