tizen 2.3 release
[framework/system/swap-probe.git] / include / da_gles20.h
1 /*
2  *  DA probe
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact:
7  *
8  * Sanghyun Lee <sanghyunnim.lee@samsung.com>
9  * Juyoung Kim <j0.kim@samsung.com>
10  * Vitaliy Cherepanov <v.cherepanov@samsung.com>
11  *
12  * This library is free software; you can redistribute it and/or modify it under
13  * the terms of the GNU Lesser General Public License as published by the
14  * Free Software Foundation; either version 2.1 of the License, or (at your option)
15  * any later version.
16  *
17  * This library is distributed in the hope that it will be useful, but WITHOUT ANY
18  * WARRANTY; without even the implied warranty of MERCHANTABILITY or
19  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
20  * License for more details.
21  *
22  * You should have received a copy of the GNU Lesser General Public License
23  * along with this library; if not, write to the Free Software Foundation, Inc., 51
24  * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25  *
26  * Contributors:
27  * - S-Core Co., Ltd
28  *
29  */
30
31 #ifndef DA_GLES20_H_
32 #define DA_GLES20_H_
33
34 /*
35  * TODO find this headers. need for EGL_Context and other
36 #include <egl.h>
37 #include <eglext.h>
38 #include <gl2.h>
39 #include <gl2ext.h>
40 */
41
42 #include <Evas_GL.h>
43 #include <Evas.h>
44
45 #include <errno.h>
46 #include "daprobe.h"
47 #include "dahelper.h"
48
49 /* TODO add egl header for next */
50 #define EGLContext void *
51 extern EGLContext eglGetCurrentContext(void);
52
53 #define NO_RETURN_FORMAT "%s"
54 #define NO_RETURN_VALUE 0
55 #define APITYPE_INIT 0
56 #define APITYPE_CONTEXT 1
57 #define APITYPE_NO_CONTEXT 2
58
59 #define FUNC(FUNCNAME) FUNCNAME
60 #define FUNCSTR(FUNCNAME) #FUNCNAME
61 #define FUNCID(FUNCNAME) API_ID_##FUNCNAME
62
63 #define PACK_GL_ADD_COMMON(GL_api_type, GL_elapsed_time)                        \
64         do {    /* PACK_GL_ADD_COMMON */                                        \
65                 /* TODO restore eglGetCurrentContext */                         \
66                 /*BUF_PTR = pack_int64(BUF_PTR, voidp_to_uint64((void *)eglGetCurrentContext()));*/\
67                 BUF_PTR = pack_int64(BUF_PTR, voidp_to_uint64((void *)0));\
68                 BUF_PTR = pack_int32(BUF_PTR, (uint32_t)GL_api_type);   \
69                 BUF_PTR = pack_int64(BUF_PTR, (uint64_t)GL_elapsed_time); \
70         } while (0)
71
72 #define PACK_GL_ADD(GL_api_type, GL_elapsed_time, GL_context_value)             \
73         do {    /* PACK_GL_ADD */                                               \
74                 PACK_GL_ADD_COMMON(GL_api_type, GL_elapsed_time);               \
75                 BUF_PTR = pack_string(BUF_PTR, GL_context_value);       \
76         } while (0)
77
78 #define PACK_GL_SHADER(GL_api_type, GL_elapsed_time, GL_shader, GL_shader_size) \
79         do {    /* PACK_GL_SHADER */                                            \
80                 PACK_GL_ADD_COMMON(GL_api_type, GL_elapsed_time);               \
81                 uint32_t min = (sizeof(LOCAL_BUF) - (BUF_PTR - LOCAL_BUF));     \
82                 if (min > MAX_SHADER_LEN)                                       \
83                         min = MAX_SHADER_LEN;                                   \
84                 BUF_PTR = pack_string_to_file(BUF_PTR, GL_shader,               \
85                                               GL_shader_size, min);             \
86         } while (0)
87
88 #define BEFORE_GL_ORIG(FUNCNAME)                                        \
89         DECLARE_VARIABLE_STANDARD_NORET;                                \
90         GLenum error = GL_NO_ERROR;                                     \
91         static methodType FUNCNAME ## p = 0;                            \
92         int32_t vAPI_ID = API_ID_ ## FUNCNAME;                          \
93         uint64_t start_nsec = 0;                                        \
94         PRE_PROBEBLOCK();                                               \
95         if(blockresult != 0)                                            \
96                 start_nsec = get_current_nsec();                        \
97         if(!FUNCNAME##p) {                                              \
98                 init_probe_gl(#FUNCNAME, (void **)&FUNCNAME##p,         \
99                               LIBGLES20, blockresult, vAPI_ID);         \
100         }
101
102 #define BEFORE_GL_API(FUNCNAME)                                         \
103         DECLARE_VARIABLE_STANDARD_NORET;                                \
104         GLenum error = GL_NO_ERROR;                                     \
105         int32_t vAPI_ID = API_ID_ ## FUNCNAME;                          \
106         uint64_t start_nsec = 0;                                        \
107         PRE_PROBEBLOCK();                                               \
108         if(blockresult != 0)                                            \
109                 start_nsec = get_current_nsec();                        \
110         if(!__gl_api->FUNCNAME) {                                               \
111                 probe_terminate_with_err("api not initialized",         \
112                                          #FUNCNAME, LIBGLES20);         \
113         }
114
115 #define INIT_LIB_ID_STR(LIB_ID, LIB_STR, KEYS)                                                  \
116                 if (lib_handle[LIB_ID] == ((void *) 0)) {               \
117                         lib_handle[LIB_ID] = dlopen(LIB_STR, RTLD_LAZY | RTLD_GLOBAL); \
118                         if (lib_handle[LIB_ID] == ((void *) 0)) {       \
119                                 char perror_msg[128];                   \
120                                 sprintf(perror_msg, "dlopen failed : [%s],%s", \
121                                         __FUNCTION__, LIB_STR);                 \
122                                 perror(perror_msg);                             \
123                                 exit(0);                                \
124                         }                                               \
125                 }
126
127 #define INIT_LIB(LIB_ID, KEYS)                                          \
128         INIT_LIB_ID_STR(LIB_ID, lib_string[LIB_ID], KEYS)
129
130
131 #define BEFORE_EGL_NATIVE(FUNCNAME)                                     \
132         DECLARE_VARIABLE_STANDARD_NORET;                                \
133         GLenum error = EGL_SUCCESS;                                     \
134         static methodType FUNCNAME ## p = 0;                            \
135         int32_t vAPI_ID = API_ID_ ## FUNCNAME;                          \
136         uint64_t start_nsec = 0;                                        \
137         PRE_PROBEBLOCK();                                               \
138         if(blockresult != 0)                                            \
139                 start_nsec = get_current_nsec();                        \
140         if(!FUNCNAME##p)                                                \
141                 init_probe_egl(#FUNCNAME, (void **)&FUNCNAME##p, LIBEGL)
142
143 #define EGL_GET_ERROR()                                                 \
144         if (blockresult != 0) {                                         \
145                 error = eglGetError();                                  \
146         }
147
148 #define AFTER(RET_TYPE, RET_VAL, APITYPE, CONTEXT_VAL, INPUTFORMAT, ...)        \
149         POST_PACK_PROBEBLOCK_BEGIN();                                           \
150         PREPARE_LOCAL_BUF();                                                    \
151         PACK_COMMON_BEGIN(MSG_PROBE_GL, vAPI_ID, INPUTFORMAT, __VA_ARGS__);     \
152         PACK_COMMON_END(RET_TYPE, RET_VAL, error, blockresult);                 \
153         PACK_GL_ADD(APITYPE, get_current_nsec() - start_nsec, CONTEXT_VAL);     \
154         FLUSH_LOCAL_BUF();                                                      \
155         POST_PACK_PROBEBLOCK_END()
156
157 #define AFTER_NO_PARAM(RET_TYPE, RETVAL, APITYPE, CONTEXTVALUE) \
158                 AFTER(RET_TYPE, RETVAL, APITYPE, CONTEXTVALUE, "", 0)
159
160 #define GL_GET_ERROR()                                                  \
161         if (blockresult != 0) {                                         \
162                 error = REAL_NAME(glGetError)();                                        \
163         }
164
165 #define AFTER_SHADER(RET_TYPE, RET_VAL, APITYPE, CONTEXT_VAL, CONTEXT_SIZE, INPUTFORMAT, ...)   \
166         POST_PACK_PROBEBLOCK_BEGIN();                                           \
167         PREPARE_LOCAL_BUF();                                                    \
168         PACK_COMMON_BEGIN(MSG_PROBE_GL, vAPI_ID, INPUTFORMAT, __VA_ARGS__);     \
169         PACK_COMMON_END(RET_TYPE, RET_VAL, error, blockresult);                 \
170         PACK_GL_SHADER(APITYPE, get_current_nsec() - start_nsec, CONTEXT_VAL, CONTEXT_SIZE);    \
171         FLUSH_LOCAL_BUF();                                                      \
172         POST_PACK_PROBEBLOCK_END()
173
174 #define BEFORE_EVAS_GL(FUNCNAME)                                        \
175         DECLARE_VARIABLE_STANDARD_NORET;                                \
176         GLenum error = GL_NO_ERROR;                                     \
177         static methodType FUNCNAME ## p = 0;                            \
178         int32_t vAPI_ID = API_ID_ ## FUNCNAME;                          \
179         uint64_t start_nsec = 0;                                        \
180         PRE_PROBEBLOCK();                                               \
181         if(blockresult != 0)                                            \
182                 start_nsec = get_current_nsec();                        \
183         GET_REAL_FUNC_RTLD_NEXT(FUNCNAME)
184
185 GLenum glGetError(void);
186 void glGetIntegerv(GLenum pname, GLint * params);
187 extern Evas_GL_API *__gl_api;
188 extern void save_orig_gl_api_list(Evas_GL_API *api);
189 extern void change_gl_api_list(Evas_GL_API *api);
190
191 #endif /* DA_GLES20_H_ */
192