a789e223ec3e6f518ebc17f936fd0b10d1f8e1cb
[platform/core/system/swap-probe.git] / probe_graphics / 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 #include <egl.h>
35 #include <eglext.h>
36 #include <gl2.h>
37 #include <gl2ext.h>
38 #include <errno.h>
39 #include "daprobe.h"
40 #include "dahelper.h"
41
42 #define NO_RETURN_FORMAT "%s"
43 #define NO_RETURN_VALUE 0
44 #define APITYPE_INIT 0
45 #define APITYPE_CONTEXT 1
46 #define APITYPE_NO_CONTEXT 2
47
48 #define FUNC(FUNCNAME) FUNCNAME
49 #define FUNCSTR(FUNCNAME) #FUNCNAME
50 #define FUNCID(FUNCNAME) API_ID_##FUNCNAME
51
52 #define PACK_GL_ADD_COMMON(GL_api_type, GL_elapsed_time)                        \
53         do {    /* PACK_GL_ADD_COMMON */                                        \
54                 BUF_PTR = pack_int64(BUF_PTR, voidp_to_uint64((void *)eglGetCurrentContext()));\
55                 BUF_PTR = pack_int32(BUF_PTR, (uint32_t)GL_api_type);   \
56                 BUF_PTR = pack_int64(BUF_PTR, (uint64_t)GL_elapsed_time); \
57         } while (0)
58
59 #define PACK_GL_ADD(GL_api_type, GL_elapsed_time, GL_context_value)             \
60         do {    /* PACK_GL_ADD */                                               \
61                 PACK_GL_ADD_COMMON(GL_api_type, GL_elapsed_time);               \
62                 BUF_PTR = pack_string(BUF_PTR, GL_context_value);       \
63         } while (0)
64
65 #define PACK_GL_SHADER(GL_api_type, GL_elapsed_time, GL_shader, GL_shader_size) \
66         do {    /* PACK_GL_SHADER */                                            \
67                 PACK_GL_ADD_COMMON(GL_api_type, GL_elapsed_time);               \
68                 uint32_t min = (sizeof(LOCAL_BUF) - (BUF_PTR - LOCAL_BUF));     \
69                 if (min > MAX_SHADER_LEN)                                       \
70                         min = MAX_SHADER_LEN;                                   \
71                 BUF_PTR = pack_string_to_file(BUF_PTR, GL_shader,               \
72                                               GL_shader_size, min);             \
73         } while (0)
74
75 #define BEFORE(FUNCNAME)                                                \
76         DECLARE_VARIABLE_STANDARD_NORET;                                \
77         GLenum error = GL_NO_ERROR;                                     \
78         static methodType FUNCNAME ## p = 0;                            \
79         int32_t vAPI_ID = API_ID_ ## FUNCNAME;                          \
80         uint64_t start_nsec = 0;                                        \
81         PRE_PROBEBLOCK();                                               \
82         if(blockresult != 0)                                            \
83                 start_nsec = get_current_nsec();                        \
84         if(!FUNCNAME##p) {                                              \
85                 init_probe_gl(#FUNCNAME, (void **)&FUNCNAME##p,         \
86                               LIBGLES20, blockresult, vAPI_ID);         \
87         }
88
89 #define INIT_LIB_ID_STR(LIB_ID, LIB_STR, KEYS)                                                  \
90                 if (lib_handle[LIB_ID] == ((void *) 0)) {               \
91                         lib_handle[LIB_ID] = dlopen(LIB_STR, RTLD_LAZY | RTLD_GLOBAL); \
92                         if (lib_handle[LIB_ID] == ((void *) 0)) {       \
93                                 char perror_msg[128];                   \
94                                 sprintf(perror_msg, "dlopen failed : [%s],%s", \
95                                         __FUNCTION__, LIB_STR);                 \
96                                 perror(perror_msg);                             \
97                                 exit(0);                                \
98                         }                                               \
99                 }
100
101 #define INIT_LIB(LIB_ID, KEYS)                                          \
102         INIT_LIB_ID_STR(LIB_ID, lib_string[LIB_ID], KEYS)
103
104
105 #define BEFORE_EGL_NATIVE(FUNCNAME)                                     \
106         DECLARE_VARIABLE_STANDARD_NORET;                                \
107         GLenum error = EGL_SUCCESS;                                     \
108         static methodType FUNCNAME ## p = 0;                            \
109         int32_t vAPI_ID = API_ID_ ## FUNCNAME;                          \
110         uint64_t start_nsec = 0;                                        \
111         PRE_PROBEBLOCK();                                               \
112         if(blockresult != 0)                                            \
113                 start_nsec = get_current_nsec();                        \
114         if(!FUNCNAME##p)                                                \
115                 init_probe_egl(#FUNCNAME, (void **)&FUNCNAME##p, LIBEGL)
116
117 #define BEFORE_EGL_TIZEN(FUNCNAME)                                      \
118         DECLARE_VARIABLE_STANDARD_NORET;                                \
119         GLenum error = EGL_SUCCESS;                                     \
120         static methodType FUNCNAME##p = 0;                              \
121         int32_t vAPI_ID = FUNCID(FUNCNAME);                             \
122         uint64_t start_nsec = 0;                                        \
123         PRE_PROBEBLOCK();                                               \
124         if(blockresult != 0)                                            \
125                 start_nsec = get_current_nsec();                        \
126         if(!FUNCNAME##p)                                                \
127                 init_probe_egl(FUNCSTR(FUNCNAME), (void **)&FUNCNAME##p, LIBOSP_UIFW)
128
129 #define EGL_GET_ERROR()                                                 \
130         if (blockresult != 0) {                                         \
131                 error = eglGetError();                                  \
132         }
133
134 #define BEFORE_OSP_UIFW(FUNCNAME)                                       \
135         DECLARE_VARIABLE_STANDARD_NORET;                        \
136         GLenum error = GL_NO_ERROR;                             \
137         static methodType FUNCNAME ## p = 0;                    \
138         void* tmpPtr = 0;                                       \
139         int32_t vAPI_ID = API_ID_ ## FUNCNAME;                  \
140         uint64_t start_nsec = 0;                                        \
141         PRE_PROBEBLOCK();                                               \
142         if(blockresult != 0)                                            \
143                 start_nsec = get_current_nsec();                        \
144         if(!FUNCNAME##p) {                                              \
145                 probeBlockStart();                                      \
146                 INIT_LIB(LIBOSP_UIFW, RTLD_LAZY);                       \
147                 tmpPtr = dlsym(lib_handle[LIBOSP_UIFW], #FUNCNAME);     \
148                 if (tmpPtr == NULL || dlerror() != NULL) {              \
149                         perror("dlsym failed : " #FUNCNAME);            \
150                         exit(0);                                        \
151                 }                                                       \
152                 memcpy(&FUNCNAME##p, &tmpPtr, sizeof(tmpPtr));          \
153                 probeBlockEnd();                                        \
154         }
155
156 #define AFTER(RET_TYPE, RET_VAL, APITYPE, CONTEXT_VAL, INPUTFORMAT, ...)        \
157         POST_PACK_PROBEBLOCK_BEGIN();                                           \
158         PREPARE_LOCAL_BUF();                                                    \
159         PACK_COMMON_BEGIN(MSG_PROBE_GL, vAPI_ID, INPUTFORMAT, __VA_ARGS__);     \
160         PACK_COMMON_END(RET_TYPE, RET_VAL, error, blockresult);                 \
161         PACK_GL_ADD(APITYPE, get_current_nsec() - start_nsec, CONTEXT_VAL);     \
162         FLUSH_LOCAL_BUF();                                                      \
163         POST_PACK_PROBEBLOCK_END()
164
165 #define AFTER_NO_PARAM(RET_TYPE, RETVAL, APITYPE, CONTEXTVALUE) \
166                 AFTER(RET_TYPE, RETVAL, APITYPE, CONTEXTVALUE, "", 0)
167
168 #define GL_GET_ERROR()                                                  \
169         if (blockresult != 0) {                                         \
170                 error = glGetError();                                   \
171         }
172
173 #define AFTER_SHADER(RET_TYPE, RET_VAL, APITYPE, CONTEXT_VAL, CONTEXT_SIZE, INPUTFORMAT, ...)   \
174         POST_PACK_PROBEBLOCK_BEGIN();                                           \
175         PREPARE_LOCAL_BUF();                                                    \
176         PACK_COMMON_BEGIN(MSG_PROBE_GL, vAPI_ID, INPUTFORMAT, __VA_ARGS__);     \
177         PACK_COMMON_END(RET_TYPE, RET_VAL, error, blockresult);                 \
178         PACK_GL_SHADER(APITYPE, get_current_nsec() - start_nsec, CONTEXT_VAL, CONTEXT_SIZE);    \
179         FLUSH_LOCAL_BUF();                                                      \
180         POST_PACK_PROBEBLOCK_END()
181
182 #endif /* DA_GLES20_H_ */
183