1.add fastpath APIs for OpenGLES_DDK
[platform/core/uifw/coregl.git] / src / modules / fastpath / coregl_fastpath.c
1 #include "coregl_fastpath.h"
2
3 #include <stdlib.h>
4 #include <string.h>
5 #include <sys/time.h>
6
7 #include <sys/types.h>
8 #include <unistd.h>
9
10 #define _COREGL_SYMBOL(RET_TYPE, FUNC_NAME, PARAM_LIST)     RET_TYPE (*_orig_fastpath_##FUNC_NAME) PARAM_LIST = NULL;
11 #include "../../headers/sym.h"
12 #undef _COREGL_SYMBOL
13
14 Fastpath_Opt_Flag   fp_opt = FP_UNKNOWN_PATH;
15
16 int                 debug_nofp = 0;
17 FILE               *trace_fp = NULL;
18
19 GLenum              FPGL_Error = GL_NO_ERROR;
20
21 GLGlueContext_List *gctx_list = NULL;
22
23 Mutex               init_context_mutex = MUTEX_INITIALIZER;
24 GLGlueContext      *initial_ctx = NULL;
25
26 Mutex               ctx_list_access_mutex = MUTEX_INITIALIZER;
27
28 GLContext_List     *glctx_list = NULL;
29 static int          api_gl_version=COREGL_GLAPI_2;
30
31 static void
32 _state_get_texture_states(GLenum pname, GLint *params)
33 {
34         GLuint cur_active_tex = 0;
35
36         AST(initial_ctx != NULL);
37
38         _orig_fastpath_glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint *)&cur_active_tex);
39         int i;
40         for (i = 0; i < initial_ctx->gl_num_tex_units[0]; i++)
41         {
42                 _orig_fastpath_glActiveTexture(GL_TEXTURE0 + i);
43                 _orig_fastpath_glGetIntegerv(pname, (GLint *)&params[i]);
44         }
45         _orig_fastpath_glActiveTexture(cur_active_tex);
46 }
47
48 static void
49 _state_get_draw_buffers(GLenum *params)
50 {
51         AST(initial_ctx != NULL);
52
53         int i;
54         for (i = 0; i < initial_ctx->gl_num_draw_buffers[0]; i++)
55         {
56                 _orig_fastpath_glGetIntegerv(GL_DRAW_BUFFER0 + i, (GLint *)&params[i]);
57         }
58 }
59
60 static void
61 _state_get_transform_feedback_buffer_bindings(GLuint *params)
62 {
63         AST(initial_ctx != NULL);
64
65         int i;
66         for (i = 0; i < initial_ctx->gl_num_transform_feedback_separate_attribs[0]; i++)
67         {
68                 _orig_fastpath_glGetIntegeri_v(GL_TRANSFORM_FEEDBACK_BUFFER_BINDING, i, (GLint *)&params[i]);
69         }
70 }
71
72 static void
73 _state_get_transform_feedback_buffer_bindings_offset(GLintptr *params)
74 {
75         AST(initial_ctx != NULL);
76
77         int i;
78         for (i = 0; i < initial_ctx->gl_num_transform_feedback_separate_attribs[0]; i++)
79         {
80                 _orig_fastpath_glGetIntegeri_v(GL_TRANSFORM_FEEDBACK_BUFFER_START, i, (GLint *)&params[i]);
81         }
82 }
83
84 static void
85 _state_get_transform_feedback_buffer_bindings_size(GLsizeiptr *params)
86 {
87         AST(initial_ctx != NULL);
88
89         int i;
90         for (i = 0; i < initial_ctx->gl_num_transform_feedback_separate_attribs[0]; i++)
91         {
92                 _orig_fastpath_glGetIntegeri_v(GL_TRANSFORM_FEEDBACK_BUFFER_SIZE, i, (GLint *)&params[i]);
93         }
94 }
95
96 static void
97 _state_get_uniform_buffer_bindings(GLuint *params)
98 {
99         AST(initial_ctx != NULL);
100
101         int i;
102         for (i = 0; i < initial_ctx->gl_num_uniform_buffer_bindings[0]; i++)
103         {
104 /////////////////////////////////////////////////////////////////////////////////
105 // XXXX : AVOID SEGFAULT in ADRENO
106                 ((GLint *)params)[i] = 0;
107 //              _orig_fastpath_glGetIntegeri_v(GL_UNIFORM_BUFFER_BINDING, i, (GLint *)&params[i]);
108 /////////////////////////////////////////////////////////////////////////////////
109         }
110 }
111
112 static void
113 _state_get_uniform_buffer_bindings_offset(GLintptr *params)
114 {
115         AST(initial_ctx != NULL);
116
117         int i;
118         for (i = 0; i < initial_ctx->gl_num_uniform_buffer_bindings[0]; i++)
119         {
120                 _orig_fastpath_glGetIntegeri_v(GL_UNIFORM_BUFFER_START, i, (GLint *)&params[i]);
121         }
122 }
123
124 static void
125 _state_get_uniform_buffer_bindings_size(GLsizeiptr *params)
126 {
127         AST(initial_ctx != NULL);
128
129         int i;
130         for (i = 0; i < initial_ctx->gl_num_uniform_buffer_bindings[0]; i++)
131         {
132                 _orig_fastpath_glGetIntegeri_v(GL_UNIFORM_BUFFER_SIZE, i, (GLint *)&params[i]);
133         }
134 }
135
136 void
137 fastpath_state_get_draw_buffers(GLenum *params)
138 {
139         _state_get_draw_buffers(params);
140 }
141
142 void
143 init_modules_fastpath()
144 {
145         int fastpath_opt = 0;
146         int fastpath_force_off_opt = 0;
147
148         COREGL_LOG("[CoreGL] <Fastpath> : ");
149
150         fastpath_opt = atoi(get_env_setting("COREGL_FASTPATH"));
151         fastpath_force_off_opt = atoi(get_env_setting("COREGL_FASTPATH_FORCE_OFF"));
152
153         if (fastpath_force_off_opt == 1)
154         {
155                 COREGL_LOG("\E[40;31;1m(DISABLED by force option)\E[0m ");
156                 fastpath_opt = 0;
157         }
158
159         switch (fastpath_opt)
160         {
161                 case 1:
162                         COREGL_LOG("(%d) Fastpath enabled...\n", fastpath_opt);
163                         fp_opt = FP_FAST_PATH;
164                         break;
165                 default:
166                         COREGL_LOG("(%d) Default API path enabled...\n", fastpath_opt);
167                         fp_opt = FP_NORMAL_PATH;
168                         break;
169         }
170
171         debug_nofp = atoi(get_env_setting("COREGL_DEBUG_NOFP"));
172
173 }
174
175 void
176 deinit_modules_fastpath()
177 {
178         GLContext_List *current = NULL;
179
180         AST(mutex_lock(&ctx_list_access_mutex) == 1);
181
182         // Destroy remained context & Detect leaks
183         int retry_destroy = 0;
184
185         while (1)
186         {
187                 retry_destroy = 0;
188                 current = glctx_list;
189                 while (current)
190                 {
191                         if (current->cstate != NULL)
192                         {
193                                 COREGL_WRN("\E[40;31;1mContext attached to [dpy=%p|rctx=%p] has not been completely destroyed.(leak)\E[0m\n", current->cstate->rdpy, current->cstate->rctx);
194
195                                 _orig_fastpath_eglMakeCurrent(current->cstate->rdpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
196                                 _orig_fastpath_eglDestroyContext(current->cstate->rdpy, current->cstate->rctx);
197
198                                 fastpath_remove_context_states_from_list(current->cstate, NULL);
199                                 retry_destroy = 1;
200                                 break;
201                         }
202
203                         glctx_list = current->next;
204                         free(current);
205                         current = glctx_list;
206                 }
207                 if (retry_destroy == 0) break;
208         }
209         goto finish;
210
211 finish:
212         AST(mutex_unlock(&ctx_list_access_mutex) == 1);
213 }
214
215 void
216 init_modules_tstate_fastpath(GLThreadState *tstate)
217 {
218         MY_MODULE_TSTATE *tstate_mt = NULL;
219
220         tstate_mt = (MY_MODULE_TSTATE *)calloc(1, sizeof(MY_MODULE_TSTATE));
221
222         tstate_mt->binded_api = EGL_OPENGL_ES_API;
223
224         tstate->module_data[MY_MODULE_ID] = tstate_mt;
225 }
226
227 void
228 deinit_modules_tstate_fastpath(GLThreadState *tstate)
229 {
230         if (tstate->module_data[MY_MODULE_ID] != NULL)
231         {
232                 free(tstate->module_data[MY_MODULE_ID]);
233                 tstate->module_data[MY_MODULE_ID] = NULL;
234         }
235 }
236
237 void
238 fastpath_apply_overrides()
239 {
240         switch(fp_opt)
241         {
242                 case FP_FAST_PATH:
243                         fastpath_apply_overrides_egl(1);
244                         fastpath_apply_overrides_gl(1);
245                         break;
246                 case FP_NORMAL_PATH:
247                         break;
248                 default:
249                         COREGL_ERR("Invalide GL Override Option!!!\n");
250                         break;
251         }
252 }
253
254
255 void
256 fastpath_apply_overrides_egl(int enable)
257 {
258 #define _COREGL_SYMBOL(RET_TYPE, FUNC_NAME, PARAM_LIST)     COREGL_INIT_ORIGINAL(_orig_fastpath_, FUNC_NAME);
259 # include "../../headers/sym_egl.h"
260 #undef _COREGL_SYMBOL
261
262         COREGL_OVERRIDE(fastpath_, eglGetProcAddress);
263
264         COREGL_OVERRIDE(fastpath_, eglBindAPI);
265         COREGL_OVERRIDE(fastpath_, eglQueryAPI);
266
267         COREGL_OVERRIDE(fastpath_, eglCreateContext);
268         COREGL_OVERRIDE(fastpath_, eglCreateImageKHR);
269         COREGL_OVERRIDE(fastpath_, eglMakeCurrent);
270         COREGL_OVERRIDE(fastpath_, eglDestroyContext);
271         COREGL_OVERRIDE(fastpath_, eglQueryContext);
272         COREGL_OVERRIDE(fastpath_, eglGetCurrentContext);
273         COREGL_OVERRIDE(fastpath_, eglReleaseThread);
274         COREGL_OVERRIDE(fastpath_, eglGetCurrentSurface);
275         COREGL_OVERRIDE(fastpath_, eglTerminate);
276         COREGL_OVERRIDE(fastpath_, eglGetCurrentDisplay);
277
278 }
279
280 void
281 fastpath_apply_overrides_gl(int enable)
282 {
283 #define _COREGL_START_API(version) api_gl_version = version;
284 #define _COREGL_END_API(version) api_gl_version = COREGL_GLAPI_2;
285 #define _COREGL_SYMBOL(RET_TYPE, FUNC_NAME, PARAM_LIST)     \
286    if(api_gl_version <= driver_gl_version) COREGL_INIT_ORIGINAL(_orig_fastpath_, FUNC_NAME);
287
288 # include "../../headers/sym_gl.h"
289 #undef _COREGL_SYMBOL
290 #undef _COREGL_START_API
291 #undef _COREGL_END_API
292
293         if (debug_nofp != 1)
294         {
295                 COREGL_OVERRIDE(fastpath_, glGetError);
296                 COREGL_OVERRIDE(fastpath_, glGetString);
297
298                 COREGL_OVERRIDE(fastpath_, glGetIntegerv);
299                 COREGL_OVERRIDE(fastpath_, glGetFloatv);
300                 COREGL_OVERRIDE(fastpath_, glGetBooleanv);
301
302                 COREGL_OVERRIDE(fastpath_, glActiveTexture);
303                 COREGL_OVERRIDE(fastpath_, glGenTextures);
304                 COREGL_OVERRIDE(fastpath_, glBindTexture);
305                 COREGL_OVERRIDE(fastpath_, glIsTexture);
306                 COREGL_OVERRIDE(fastpath_, glDeleteTextures);
307                 COREGL_OVERRIDE(fastpath_, glFramebufferTexture2D);
308
309                 COREGL_OVERRIDE(fastpath_, glGenBuffers);
310                 COREGL_OVERRIDE(fastpath_, glBindBuffer);
311                 COREGL_OVERRIDE(fastpath_, glIsBuffer);
312                 COREGL_OVERRIDE(fastpath_, glDeleteBuffers);
313
314                 COREGL_OVERRIDE(fastpath_, glGenFramebuffers);
315                 COREGL_OVERRIDE(fastpath_, glBindFramebuffer);
316                 COREGL_OVERRIDE(fastpath_, glIsFramebuffer);
317                 COREGL_OVERRIDE(fastpath_, glDeleteFramebuffers);
318                 COREGL_OVERRIDE(fastpath_, glGetFramebufferAttachmentParameteriv);
319
320                 COREGL_OVERRIDE(fastpath_, glGenRenderbuffers);
321                 COREGL_OVERRIDE(fastpath_, glBindRenderbuffer);
322                 COREGL_OVERRIDE(fastpath_, glFramebufferRenderbuffer);
323                 COREGL_OVERRIDE(fastpath_, glIsRenderbuffer);
324                 COREGL_OVERRIDE(fastpath_, glDeleteRenderbuffers);
325
326                 COREGL_OVERRIDE(fastpath_, glCreateShader);
327                 COREGL_OVERRIDE(fastpath_, glCreateProgram);
328                 COREGL_OVERRIDE(fastpath_, glAttachShader);
329                 COREGL_OVERRIDE(fastpath_, glCompileShader);
330                 COREGL_OVERRIDE(fastpath_, glShaderBinary);
331                 COREGL_OVERRIDE(fastpath_, glDeleteShader);
332                 COREGL_OVERRIDE(fastpath_, glDetachShader);
333                 COREGL_OVERRIDE(fastpath_, glGetShaderiv);
334                 COREGL_OVERRIDE(fastpath_, glGetShaderInfoLog);
335                 COREGL_OVERRIDE(fastpath_, glGetShaderSource);
336                 COREGL_OVERRIDE(fastpath_, glIsShader);
337                 COREGL_OVERRIDE(fastpath_, glShaderSource);
338                 COREGL_OVERRIDE(fastpath_, glBindAttribLocation);
339                 COREGL_OVERRIDE(fastpath_, glDeleteProgram);
340                 COREGL_OVERRIDE(fastpath_, glGetActiveAttrib);
341                 COREGL_OVERRIDE(fastpath_, glGetActiveUniform);
342                 COREGL_OVERRIDE(fastpath_, glGetAttachedShaders);
343                 COREGL_OVERRIDE(fastpath_, glGetAttribLocation);
344                 COREGL_OVERRIDE(fastpath_, glGetProgramiv);
345                 COREGL_OVERRIDE(fastpath_, glGetProgramInfoLog);
346                 COREGL_OVERRIDE(fastpath_, glGetUniformfv);
347                 COREGL_OVERRIDE(fastpath_, glGetUniformiv);
348                 COREGL_OVERRIDE(fastpath_, glGetUniformLocation);
349                 COREGL_OVERRIDE(fastpath_, glIsProgram);
350                 COREGL_OVERRIDE(fastpath_, glLinkProgram);
351                 COREGL_OVERRIDE(fastpath_, glUseProgram);
352                 COREGL_OVERRIDE(fastpath_, glValidateProgram);
353
354                 COREGL_OVERRIDE(fastpath_, glBlendColor);
355                 COREGL_OVERRIDE(fastpath_, glBlendEquation);
356                 COREGL_OVERRIDE(fastpath_, glBlendEquationSeparate);
357                 COREGL_OVERRIDE(fastpath_, glBlendFunc);
358                 COREGL_OVERRIDE(fastpath_, glBlendFuncSeparate);
359                 COREGL_OVERRIDE(fastpath_, glClearColor);
360                 COREGL_OVERRIDE(fastpath_, glClearDepthf);
361                 COREGL_OVERRIDE(fastpath_, glClearStencil);
362                 COREGL_OVERRIDE(fastpath_, glColorMask);
363                 COREGL_OVERRIDE(fastpath_, glCullFace);
364                 COREGL_OVERRIDE(fastpath_, glDepthFunc);
365                 COREGL_OVERRIDE(fastpath_, glDepthMask);
366                 COREGL_OVERRIDE(fastpath_, glDepthRangef);
367                 COREGL_OVERRIDE(fastpath_, glDisable);
368                 COREGL_OVERRIDE(fastpath_, glDisableVertexAttribArray);
369                 COREGL_OVERRIDE(fastpath_, glEnable);
370                 COREGL_OVERRIDE(fastpath_, glEnableVertexAttribArray);
371                 COREGL_OVERRIDE(fastpath_, glFrontFace);
372                 COREGL_OVERRIDE(fastpath_, glHint);
373                 COREGL_OVERRIDE(fastpath_, glLineWidth);
374                 COREGL_OVERRIDE(fastpath_, glPixelStorei);
375                 COREGL_OVERRIDE(fastpath_, glPolygonOffset);
376                 COREGL_OVERRIDE(fastpath_, glSampleCoverage);
377                 COREGL_OVERRIDE(fastpath_, glScissor);
378                 COREGL_OVERRIDE(fastpath_, glStencilFunc);
379                 COREGL_OVERRIDE(fastpath_, glStencilFuncSeparate);
380                 COREGL_OVERRIDE(fastpath_, glStencilMask);
381                 COREGL_OVERRIDE(fastpath_, glStencilMaskSeparate);
382                 COREGL_OVERRIDE(fastpath_, glStencilOp);
383                 COREGL_OVERRIDE(fastpath_, glStencilOpSeparate);
384                 COREGL_OVERRIDE(fastpath_, glVertexAttrib1f);
385                 COREGL_OVERRIDE(fastpath_, glVertexAttrib1fv);
386                 COREGL_OVERRIDE(fastpath_, glVertexAttrib2f);
387                 COREGL_OVERRIDE(fastpath_, glVertexAttrib2fv);
388                 COREGL_OVERRIDE(fastpath_, glVertexAttrib3f);
389                 COREGL_OVERRIDE(fastpath_, glVertexAttrib3fv);
390                 COREGL_OVERRIDE(fastpath_, glVertexAttrib4f);
391                 COREGL_OVERRIDE(fastpath_, glVertexAttrib4fv);
392                 COREGL_OVERRIDE(fastpath_, glVertexAttribPointer);
393                 COREGL_OVERRIDE(fastpath_, glViewport);
394
395                 COREGL_OVERRIDE(fastpath_, glGetProgramBinaryOES);
396                 COREGL_OVERRIDE(fastpath_, glProgramBinaryOES);
397
398                 COREGL_OVERRIDE(fastpath_, glUseProgramStagesEXT);
399                 COREGL_OVERRIDE(fastpath_, glActiveShaderProgramEXT);
400                 COREGL_OVERRIDE(fastpath_, glProgramParameteriEXT);
401                 COREGL_OVERRIDE(fastpath_, glProgramUniform1iEXT);
402                 COREGL_OVERRIDE(fastpath_, glProgramUniform2iEXT);
403                 COREGL_OVERRIDE(fastpath_, glProgramUniform3iEXT);
404                 COREGL_OVERRIDE(fastpath_, glProgramUniform4iEXT);
405                 COREGL_OVERRIDE(fastpath_, glProgramUniform1fEXT);
406                 COREGL_OVERRIDE(fastpath_, glProgramUniform2fEXT);
407                 COREGL_OVERRIDE(fastpath_, glProgramUniform3fEXT);
408                 COREGL_OVERRIDE(fastpath_, glProgramUniform4fEXT);
409                 COREGL_OVERRIDE(fastpath_, glProgramUniform1ivEXT);
410                 COREGL_OVERRIDE(fastpath_, glProgramUniform2ivEXT);
411                 COREGL_OVERRIDE(fastpath_, glProgramUniform3ivEXT);
412                 COREGL_OVERRIDE(fastpath_, glProgramUniform4ivEXT);
413                 COREGL_OVERRIDE(fastpath_, glProgramUniform1fvEXT);
414                 COREGL_OVERRIDE(fastpath_, glProgramUniform2fvEXT);
415                 COREGL_OVERRIDE(fastpath_, glProgramUniform3fvEXT);
416                 COREGL_OVERRIDE(fastpath_, glProgramUniform4fvEXT);
417                 COREGL_OVERRIDE(fastpath_, glProgramUniformMatrix2fvEXT);
418                 COREGL_OVERRIDE(fastpath_, glProgramUniformMatrix3fvEXT);
419                 COREGL_OVERRIDE(fastpath_, glProgramUniformMatrix4fvEXT);
420
421                 COREGL_OVERRIDE(fastpath_, glFramebufferTexture2DMultisampleEXT);
422                 COREGL_OVERRIDE(fastpath_, glFramebufferTexture3DOES);
423
424                 COREGL_OVERRIDE(fastpath_, glBindFramebufferOES);
425                 COREGL_OVERRIDE(fastpath_, glBindRenderbufferOES);
426                 COREGL_OVERRIDE(fastpath_, glClearBufferfi);
427                 COREGL_OVERRIDE(fastpath_, glClearBufferfv);
428                 COREGL_OVERRIDE(fastpath_, glClearBufferiv);
429                 COREGL_OVERRIDE(fastpath_, glClearBufferuiv);
430                 COREGL_OVERRIDE(fastpath_, glDeleteFramebuffersOES);
431                 COREGL_OVERRIDE(fastpath_, glDeleteRenderbuffersOES);
432                 COREGL_OVERRIDE(fastpath_, glDepthRangefOES);
433                 COREGL_OVERRIDE(fastpath_, glDepthRangexOES);
434                 COREGL_OVERRIDE(fastpath_, glFramebufferParameteri);
435                 COREGL_OVERRIDE(fastpath_, glGetFramebufferParameteriv);
436                 COREGL_OVERRIDE(fastpath_, glFramebufferRenderbufferOES);
437                 COREGL_OVERRIDE(fastpath_, glFramebufferTexture2DOES);
438                 COREGL_OVERRIDE(fastpath_, glGenFramebuffersOES);
439                 COREGL_OVERRIDE(fastpath_, glGenRenderbuffersOES);
440                 COREGL_OVERRIDE(fastpath_, glGetFramebufferAttachmentParameterivOES);
441                 COREGL_OVERRIDE(fastpath_, glGetQueryObjecti64vEXT);
442                 COREGL_OVERRIDE(fastpath_, glGetQueryObjectivEXT);
443                 COREGL_OVERRIDE(fastpath_, glGetQueryObjectui64vEXT);
444                 COREGL_OVERRIDE(fastpath_, glGetQueryObjectuivEXT);
445                 COREGL_OVERRIDE(fastpath_, glGetQueryivEXT);
446                 COREGL_OVERRIDE(fastpath_, glBeginQueryEXT);
447                 COREGL_OVERRIDE(fastpath_, glDeleteQueriesEXT);
448                 COREGL_OVERRIDE(fastpath_, glGenQueriesEXT);
449                 COREGL_OVERRIDE(fastpath_, glIsFramebufferOES);
450                 COREGL_OVERRIDE(fastpath_, glIsQueryEXT);
451                 COREGL_OVERRIDE(fastpath_, glIsRenderbufferOES);
452                 COREGL_OVERRIDE(fastpath_, glBlendEquationOES);
453                 COREGL_OVERRIDE(fastpath_, glBlendEquationSeparateOES);
454                 COREGL_OVERRIDE(fastpath_, glBlendFuncSeparateOES);
455                 COREGL_OVERRIDE(fastpath_, glPolygonOffsetxOES);
456                 COREGL_OVERRIDE(fastpath_, glLineWidthxOES);
457                 COREGL_OVERRIDE(fastpath_, glSampleCoveragexOES);
458                 COREGL_OVERRIDE(fastpath_, glQueryCounterEXT);
459                 COREGL_OVERRIDE(fastpath_, glBindVertexArrayOES);
460                 COREGL_OVERRIDE(fastpath_, glDeleteVertexArraysOES);
461                 COREGL_OVERRIDE(fastpath_, glGenVertexArraysOES);
462                 COREGL_OVERRIDE(fastpath_, glIsVertexArrayOES);
463                 COREGL_OVERRIDE(fastpath_, glClearDepthfOES );
464                 COREGL_OVERRIDE(fastpath_, glClearDepthxOES );
465                 /* Start overriding GLES 3.0 */
466                 if(driver_gl_version >= COREGL_GLAPI_3) {
467                         COREGL_OVERRIDE(fastpath_, glReadBuffer);
468
469                         COREGL_OVERRIDE(fastpath_, glGenQueries);
470                         COREGL_OVERRIDE(fastpath_, glDeleteQueries);
471                         COREGL_OVERRIDE(fastpath_, glIsQuery);
472                         COREGL_OVERRIDE(fastpath_, glBeginQuery);
473                         COREGL_OVERRIDE(fastpath_, glGetQueryiv);
474                         COREGL_OVERRIDE(fastpath_, glGetQueryObjectuiv);
475                         COREGL_OVERRIDE(fastpath_, glDrawBuffers);
476                         COREGL_OVERRIDE(fastpath_, glFramebufferTextureLayer);
477
478                         COREGL_OVERRIDE(fastpath_, glBindVertexArray);
479                         COREGL_OVERRIDE(fastpath_, glDeleteVertexArrays);
480                         COREGL_OVERRIDE(fastpath_, glGenVertexArrays);
481                         COREGL_OVERRIDE(fastpath_, glIsVertexArray);
482
483                         COREGL_OVERRIDE(fastpath_, glGetIntegeri_v);
484
485                         COREGL_OVERRIDE(fastpath_, glBindTransformFeedback);
486                         COREGL_OVERRIDE(fastpath_, glDeleteTransformFeedbacks);
487                         COREGL_OVERRIDE(fastpath_, glGenTransformFeedbacks);
488                         COREGL_OVERRIDE(fastpath_, glIsTransformFeedback);
489
490                         COREGL_OVERRIDE(fastpath_, glBindBufferRange);
491                         COREGL_OVERRIDE(fastpath_, glBindBufferBase);
492                         COREGL_OVERRIDE(fastpath_, glTransformFeedbackVaryings);
493                         COREGL_OVERRIDE(fastpath_, glGetTransformFeedbackVarying);
494                         COREGL_OVERRIDE(fastpath_, glVertexAttribIPointer);
495                         COREGL_OVERRIDE(fastpath_, glVertexAttribI4i);
496                         COREGL_OVERRIDE(fastpath_, glVertexAttribI4ui);
497                         COREGL_OVERRIDE(fastpath_, glVertexAttribI4iv);
498                         COREGL_OVERRIDE(fastpath_, glVertexAttribI4uiv);
499                         COREGL_OVERRIDE(fastpath_, glGetUniformuiv);
500                         COREGL_OVERRIDE(fastpath_, glGetFragDataLocation);
501                         COREGL_OVERRIDE(fastpath_, glGetStringi);
502                         COREGL_OVERRIDE(fastpath_, glGetUniformIndices);
503                         COREGL_OVERRIDE(fastpath_, glGetActiveUniformsiv);
504                         COREGL_OVERRIDE(fastpath_, glGetUniformBlockIndex);
505                         COREGL_OVERRIDE(fastpath_, glGetActiveUniformBlockiv);
506                         COREGL_OVERRIDE(fastpath_, glGetActiveUniformBlockName);
507                         COREGL_OVERRIDE(fastpath_, glUniformBlockBinding);
508                         COREGL_OVERRIDE(fastpath_, glGetInteger64v);
509                         COREGL_OVERRIDE(fastpath_, glGetInteger64i_v);
510                         COREGL_OVERRIDE(fastpath_, glGenSamplers);
511                         COREGL_OVERRIDE(fastpath_, glDeleteSamplers);
512                         COREGL_OVERRIDE(fastpath_, glIsSampler);
513                         COREGL_OVERRIDE(fastpath_, glBindSampler);
514                         COREGL_OVERRIDE(fastpath_, glSamplerParameteri);
515                         COREGL_OVERRIDE(fastpath_, glSamplerParameteriv);
516                         COREGL_OVERRIDE(fastpath_, glSamplerParameterf);
517                         COREGL_OVERRIDE(fastpath_, glSamplerParameterfv);
518                         COREGL_OVERRIDE(fastpath_, glGetSamplerParameteriv);
519                         COREGL_OVERRIDE(fastpath_, glGetSamplerParameterfv);
520                         COREGL_OVERRIDE(fastpath_, glVertexAttribDivisor);
521                         COREGL_OVERRIDE(fastpath_, glGetProgramBinary);
522                         COREGL_OVERRIDE(fastpath_, glProgramBinary);
523                         COREGL_OVERRIDE(fastpath_, glProgramParameteri);
524                 } // End of GLES 3.0
525
526                 if(driver_gl_version >= COREGL_GLAPI_31)
527                 {
528                         COREGL_OVERRIDE(fastpath_, glCreateShaderProgramv);
529                         COREGL_OVERRIDE(fastpath_, glGenProgramPipelines);
530                         COREGL_OVERRIDE(fastpath_, glGetProgramPipelineiv);
531                         COREGL_OVERRIDE(fastpath_, glBindProgramPipeline);
532                         COREGL_OVERRIDE(fastpath_, glDeleteProgramPipelines);
533                         COREGL_OVERRIDE(fastpath_, glIsProgramPipeline);
534                         COREGL_OVERRIDE(fastpath_, glValidateProgramPipeline);
535                         COREGL_OVERRIDE(fastpath_, glGetProgramPipelineInfoLog);
536                         COREGL_OVERRIDE(fastpath_, glDispatchCompute);
537                         COREGL_OVERRIDE(fastpath_, glDispatchComputeIndirect);
538                         COREGL_OVERRIDE(fastpath_, glGetProgramInterfaceiv);
539                         COREGL_OVERRIDE(fastpath_, glGetProgramResourceIndex);
540                         COREGL_OVERRIDE(fastpath_, glGetProgramResourceName);
541                         COREGL_OVERRIDE(fastpath_, glGetProgramResourceiv);
542                         COREGL_OVERRIDE(fastpath_, glGetProgramResourceLocation);
543                         COREGL_OVERRIDE(fastpath_, glUseProgramStages);
544                         COREGL_OVERRIDE(fastpath_, glActiveShaderProgram);
545                         COREGL_OVERRIDE(fastpath_, glProgramUniform1iv);
546                         COREGL_OVERRIDE(fastpath_, glProgramUniform2iv);
547                         COREGL_OVERRIDE(fastpath_, glProgramUniform3iv);
548                         COREGL_OVERRIDE(fastpath_, glProgramUniform4iv);
549                         COREGL_OVERRIDE(fastpath_, glProgramUniform1fv);
550                         COREGL_OVERRIDE(fastpath_, glProgramUniform2fv);
551                         COREGL_OVERRIDE(fastpath_, glProgramUniform3fv);
552                         COREGL_OVERRIDE(fastpath_, glProgramUniform4fv);
553                         COREGL_OVERRIDE(fastpath_, glProgramUniformMatrix2fv);
554                         COREGL_OVERRIDE(fastpath_, glProgramUniformMatrix3fv);
555                         COREGL_OVERRIDE(fastpath_, glProgramUniformMatrix4fv);
556                         COREGL_OVERRIDE(fastpath_, glProgramUniform1i);
557                         COREGL_OVERRIDE(fastpath_, glProgramUniform2i);
558                         COREGL_OVERRIDE(fastpath_, glProgramUniform3i);
559                         COREGL_OVERRIDE(fastpath_, glProgramUniform4i);
560                         COREGL_OVERRIDE(fastpath_, glProgramUniform1f);
561                         COREGL_OVERRIDE(fastpath_, glProgramUniform2f);
562                         COREGL_OVERRIDE(fastpath_, glProgramUniform3f);
563                         COREGL_OVERRIDE(fastpath_, glProgramUniform4f);
564                         COREGL_OVERRIDE(fastpath_, glProgramUniform1uiv);
565                         COREGL_OVERRIDE(fastpath_, glProgramUniform2uiv);
566                         COREGL_OVERRIDE(fastpath_, glProgramUniform3uiv);
567                         COREGL_OVERRIDE(fastpath_, glProgramUniform4uiv);
568                         COREGL_OVERRIDE(fastpath_, glProgramUniform1ui);
569                         COREGL_OVERRIDE(fastpath_, glProgramUniform2ui);
570                         COREGL_OVERRIDE(fastpath_, glProgramUniform3ui);
571                         COREGL_OVERRIDE(fastpath_, glProgramUniform4ui);
572                         COREGL_OVERRIDE(fastpath_, glProgramUniformMatrix2x3fv);
573                         COREGL_OVERRIDE(fastpath_, glProgramUniformMatrix3x2fv);
574                         COREGL_OVERRIDE(fastpath_, glProgramUniformMatrix4x2fv);
575                         COREGL_OVERRIDE(fastpath_, glProgramUniformMatrix2x4fv);
576                         COREGL_OVERRIDE(fastpath_, glProgramUniformMatrix3x4fv);
577                         COREGL_OVERRIDE(fastpath_, glProgramUniformMatrix4x3fv);
578                         COREGL_OVERRIDE(fastpath_, glBindImageTexture);
579                         COREGL_OVERRIDE(fastpath_, glGetBooleani_v);
580                         COREGL_OVERRIDE(fastpath_, glMemoryBarrier);
581                         COREGL_OVERRIDE(fastpath_, glMemoryBarrierByRegion);
582                         COREGL_OVERRIDE(fastpath_, glTexStorage2DMultisample);
583                         COREGL_OVERRIDE(fastpath_, glGetMultisamplefv);
584                         COREGL_OVERRIDE(fastpath_, glSampleMaski);
585                         COREGL_OVERRIDE(fastpath_, glGetTexLevelParameteriv);
586                         COREGL_OVERRIDE(fastpath_, glGetTexLevelParameterfv);
587                         COREGL_OVERRIDE(fastpath_, glBindVertexBuffer);
588                         COREGL_OVERRIDE(fastpath_, glVertexAttribFormat);
589                         COREGL_OVERRIDE(fastpath_, glVertexAttribIFormat);
590                         COREGL_OVERRIDE(fastpath_, glVertexAttribBinding);
591                         COREGL_OVERRIDE(fastpath_, glVertexBindingDivisor);
592                 }
593         }
594         else
595         {
596                 COREGL_LOG("\E[40;35;1m[CoreGL] SKIP GL FASTPATH...\E[0m\n");
597         }
598 }
599
600 #undef OVERRIDE
601
602 static inline GL_Object_Hash_Base *
603 _lock_gl_object_hash(GL_Object_State *ostate, GL_Object_Type type)
604 {
605         switch (type)
606         {
607                 case GL_OBJECT_TYPE_QUERY:
608                         return &ostate->query;
609                 case GL_OBJECT_TYPE_TEXTURE:
610                         AST(mutex_lock(&ostate->shared->access_mutex) == 1);
611                         return &ostate->shared->texture;
612                 case GL_OBJECT_TYPE_BUFFER:
613                         AST(mutex_lock(&ostate->shared->access_mutex) == 1);
614                         return &ostate->shared->buffer;
615                 case GL_OBJECT_TYPE_FRAMEBUFFER:
616                         return &ostate->framebuffer;
617                 case GL_OBJECT_TYPE_RENDERBUFFER:
618                         AST(mutex_lock(&ostate->shared->access_mutex) == 1);
619                         return &ostate->shared->renderbuffer;
620                 case GL_OBJECT_TYPE_PROGRAM:
621                         AST(mutex_lock(&ostate->shared->access_mutex) == 1);
622                         return &ostate->shared->program;
623                 case GL_OBJECT_TYPE_VERTEXARRAY:
624                         return &ostate->vertexarray;
625                 case GL_OBJECT_TYPE_SAMPLER:
626                         AST(mutex_lock(&ostate->shared->access_mutex) == 1);
627                         return &ostate->shared->sampler;
628                 case GL_OBJECT_TYPE_TRANSFORMFEEDBACK:
629                         return &ostate->transformfeedback;
630                 case GL_OBJECT_TYPE_PROGRAMPIPELINE:
631                         AST(mutex_lock(&ostate->shared->access_mutex) == 1);
632                         return &ostate->shared->programpipeline;
633                 default:
634                         return NULL;
635         }
636 }
637
638 static inline void
639 _unlock_gl_object_hash(GL_Object_State *ostate, GL_Object_Type type)
640 {
641         switch (type)
642         {
643                 case GL_OBJECT_TYPE_TEXTURE:
644                 case GL_OBJECT_TYPE_BUFFER:
645                 case GL_OBJECT_TYPE_RENDERBUFFER:
646                 case GL_OBJECT_TYPE_PROGRAM:
647                 case GL_OBJECT_TYPE_SAMPLER:
648                 case GL_OBJECT_TYPE_PROGRAMPIPELINE:
649                         AST(mutex_unlock(&ostate->shared->access_mutex) == 1);
650                 default:
651                         break;
652         }
653 }
654
655 static inline GL_Object_Hash_Base *
656 _lock_gl_object_hash_real(GL_Object_State *ostate, GL_Object_Type type)
657 {
658         switch (type)
659         {
660                 case GL_OBJECT_TYPE_QUERY:
661                         return &ostate->query_real;
662                 case GL_OBJECT_TYPE_TEXTURE:
663                         AST(mutex_lock(&ostate->shared->real_access_mutex) == 1);
664                         return &ostate->shared->texture_real;
665                 case GL_OBJECT_TYPE_BUFFER:
666                         AST(mutex_lock(&ostate->shared->real_access_mutex) == 1);
667                         return &ostate->shared->buffer_real;
668                 case GL_OBJECT_TYPE_FRAMEBUFFER:
669                         return &ostate->framebuffer_real;
670                 case GL_OBJECT_TYPE_RENDERBUFFER:
671                         AST(mutex_lock(&ostate->shared->real_access_mutex) == 1);
672                         return &ostate->shared->renderbuffer_real;
673                 case GL_OBJECT_TYPE_PROGRAM:
674                         AST(mutex_lock(&ostate->shared->real_access_mutex) == 1);
675                         return &ostate->shared->program_real;
676                 case GL_OBJECT_TYPE_VERTEXARRAY:
677                         return &ostate->vertexarray_real;
678                 case GL_OBJECT_TYPE_SAMPLER:
679                         AST(mutex_lock(&ostate->shared->real_access_mutex) == 1);
680                         return &ostate->shared->sampler_real;
681                 case GL_OBJECT_TYPE_TRANSFORMFEEDBACK:
682                         return &ostate->transformfeedback_real;
683                 case GL_OBJECT_TYPE_PROGRAMPIPELINE:
684                         AST(mutex_lock(&ostate->shared->real_access_mutex) == 1);
685                         return &ostate->shared->programpipeline_real;
686                 default:
687                         return NULL;
688         }
689 }
690
691 static inline void
692 _unlock_gl_object_hash_real(GL_Object_State *ostate, GL_Object_Type type)
693 {
694         switch (type)
695         {
696                 case GL_OBJECT_TYPE_TEXTURE:
697                 case GL_OBJECT_TYPE_BUFFER:
698                 case GL_OBJECT_TYPE_RENDERBUFFER:
699                 case GL_OBJECT_TYPE_PROGRAM:
700                 case GL_OBJECT_TYPE_SAMPLER:
701                 case GL_OBJECT_TYPE_PROGRAMPIPELINE:
702                         AST(mutex_unlock(&ostate->shared->real_access_mutex) == 1);
703                         break;
704                 default:
705                         break;
706         }
707 }
708
709 int
710 fastpath_add_context_state_to_list(const void *option, const int option_len, GLContextState *cstate, Mutex *mtx)
711 {
712         int ret = 0;
713         int tid = 0;
714         GLContext_List *current = NULL;
715         GLContext_List *newitm = NULL;
716
717         if (mtx != NULL) AST(mutex_lock(mtx) == 1);
718
719         AST(cstate != NULL);
720
721         tid = get_current_thread();
722
723         current = glctx_list;
724         while (current != NULL)
725         {
726                 if (current->option_len == option_len &&
727                     memcmp(current->option, option, option_len) == 0 &&
728                     current->thread_id == tid)
729                 {
730                         AST(current->cstate == cstate);
731                         goto finish;
732                 }
733                 current = current->next;
734         }
735
736         newitm = (GLContext_List *)calloc(1, sizeof(GLContext_List));
737         if (newitm == NULL)
738         {
739                 COREGL_ERR("Failed to create context list.\n");
740                 goto finish;
741         }
742
743         newitm->cstate = cstate;
744         newitm->thread_id = tid;
745         newitm->option_len = option_len;
746         newitm->option = (void *)malloc(option_len);
747         memcpy(newitm->option, option, option_len);
748
749         if (glctx_list != NULL)
750                 newitm->next = glctx_list;
751
752         glctx_list = newitm;
753
754         ret = 1;
755         goto finish;
756
757 finish:
758         if (ret != 1)
759         {
760                 if (newitm != NULL)
761                 {
762                         free(newitm);
763                         newitm = NULL;
764                 }
765                 if (cstate != NULL)
766                 {
767                         free(cstate);
768                         cstate = NULL;
769                 }
770         }
771         if (mtx != NULL) AST(mutex_unlock(mtx) == 1);
772
773         return ret;
774 }
775
776 GLContextState *
777 fastpath_get_context_state_from_list(const void *option, const int option_len, Mutex *mtx)
778 {
779         GLContextState *ret = NULL;
780         GLContext_List *current = NULL;
781         int tid = 0;
782
783         if (mtx != NULL) AST(mutex_lock(mtx) == 1);
784
785         tid = get_current_thread();
786
787         current = glctx_list;
788         while (current != NULL)
789         {
790                 if (current->option_len == option_len &&
791                     memcmp(current->option, option, option_len) == 0 &&
792                     current->thread_id == tid)
793                 {
794                         ret = current->cstate;
795                         goto finish;
796                 }
797                 current = current->next;
798         }
799         goto finish;
800
801 finish:
802         if (mtx != NULL) AST(mutex_unlock(mtx) == 1);
803         return ret;
804 }
805
806 int
807 fastpath_remove_context_states_from_list(GLContextState *cstate, Mutex *mtx)
808 {
809         int ret = 0;
810         GLContext_List *olditm = NULL;
811         GLContext_List *current = NULL;
812
813         if (mtx != NULL) AST(mutex_lock(mtx) == 1);
814
815         AST(cstate != NULL);
816
817         current = glctx_list;
818
819         while (current != NULL)
820         {
821                 if (current->cstate == cstate)
822                 {
823                         GLContext_List *nextitm = NULL;
824                         if (olditm != NULL)
825                         {
826                                 olditm->next = current->next;
827                                 nextitm = olditm->next;
828                         }
829                         else
830                         {
831                                 glctx_list = current->next;
832                                 nextitm = glctx_list;
833                         }
834                         if (current->option != NULL)
835                         {
836                                 AST(current->option_len > 0);
837                                 free(current->option);
838                                 current->option = NULL;
839                                 current->option_len = 0;
840                         }
841                         free(current);
842                         ret = 1;
843                         current = nextitm;
844                         continue;
845                 }
846                 olditm = current;
847                 current = current->next;
848         }
849         goto finish;
850
851 finish:
852         if (mtx != NULL) AST(mutex_unlock(mtx) == 1);
853         return ret;
854 }
855
856
857
858 #define HASH_INIT(hash_base) \
859         hash_base.hash_field = (GL_Object_Hash **)calloc(1, sizeof(GL_Object_Hash *) * GL_OBJECT_HASH_BASE); \
860         hash_base.hash_size = GL_OBJECT_HASH_BASE;
861
862 void
863 fastpath_ostate_init(GL_Object_State *ostate)
864 {
865         HASH_INIT(ostate->query);
866         HASH_INIT(ostate->framebuffer);
867         HASH_INIT(ostate->vertexarray);
868         HASH_INIT(ostate->transformfeedback);
869
870         HASH_INIT(ostate->query_real);
871         HASH_INIT(ostate->framebuffer_real);
872         HASH_INIT(ostate->vertexarray_real);
873         HASH_INIT(ostate->transformfeedback_real);
874 }
875
876 void
877 fastpath_sostate_init(GL_Shared_Object_State *sostate)
878 {
879         mutex_init(&sostate->access_mutex);
880
881         HASH_INIT(sostate->texture);
882         HASH_INIT(sostate->buffer);
883         HASH_INIT(sostate->renderbuffer);
884         HASH_INIT(sostate->program);
885         HASH_INIT(sostate->sampler);
886         HASH_INIT(sostate->programpipeline);
887
888         HASH_INIT(sostate->texture_real);
889         HASH_INIT(sostate->buffer_real);
890         HASH_INIT(sostate->renderbuffer_real);
891         HASH_INIT(sostate->program_real);
892         HASH_INIT(sostate->sampler_real);
893         HASH_INIT(sostate->programpipeline_real);
894 }
895
896 #undef HASH_INIT
897
898
899 static void
900 _add_hash(GL_Object_Hash_Base *hash_base, GL_Object_Hash *data)
901 {
902         int array_idx = data->hash_key & (hash_base->hash_size - 1);
903         if (hash_base->hash_field[array_idx] == NULL)
904         {
905                 hash_base->hash_field[array_idx] = data;
906         }
907         else
908         {
909                 GL_Object_Hash *current = hash_base->hash_field[array_idx];
910                 while(current->next)
911                 {
912                         AST(current->hash_key != data->hash_key);
913                         current = current->next;
914                 }
915                 current->next = data;
916         }
917         data->next = NULL;
918         hash_base->item_size++;
919 }
920
921 static int
922 _remove_hash(GL_Object_Hash_Base *hash_base, GLuint hash)
923 {
924         int ret = 0;
925         int array_idx = hash & (hash_base->hash_size - 1);
926
927         GL_Object_Hash *current = hash_base->hash_field[array_idx];
928         GL_Object_Hash *prev = NULL;
929
930         while(current)
931         {
932                 if (current->hash_key == hash)
933                 {
934                         if (prev != NULL)
935                                 prev->next = current->next;
936                         else
937                                 hash_base->hash_field[array_idx] = current->next;
938                         hash_base->item_size--;
939                         ret = 1;
940                         break;
941                 }
942                 prev = current;
943                 current = current->next;
944         }
945
946         return ret;
947 }
948
949 static void
950 _free_hash_list(GL_Object_Hash_Base *hash_base, int free_data)
951 {
952         if (hash_base->item_size == 0) return;
953
954         for (int i = 0; i < hash_base->hash_size; i++)
955         {
956                 if (hash_base->hash_field[i] != NULL)
957                 {
958                         GL_Object_Hash *current = hash_base->hash_field[i];
959
960                         while (current != NULL)
961                         {
962                                 GL_Object_Hash *current_next = current->next;
963
964                                 if (free_data == 1 && current->item != NULL)
965                                 {
966                                         free(current->item);
967                                 }
968
969                                 free(current);
970                                 hash_base->item_size--;
971                                 current = current_next;
972                         }
973                 }
974         }
975 }
976
977
978
979 #define HASH_DEINIT(hash_base, free_data) \
980         _free_hash_list(&hash_base, free_data); \
981         free(hash_base.hash_field); \
982         hash_base.hash_size = 0;
983
984 void
985 fastpath_ostate_deinit(GL_Object_State *ostate)
986 {
987         HASH_DEINIT(ostate->query, 1);
988         HASH_DEINIT(ostate->framebuffer, 1);
989         HASH_DEINIT(ostate->vertexarray, 1);
990         HASH_DEINIT(ostate->transformfeedback, 1);
991
992         HASH_DEINIT(ostate->query_real, 0);
993         HASH_DEINIT(ostate->framebuffer_real, 0);
994         HASH_DEINIT(ostate->vertexarray_real, 0);
995         HASH_DEINIT(ostate->transformfeedback_real, 0);
996 }
997
998 void
999 fastpath_sostate_deinit(GL_Shared_Object_State *sostate)
1000 {
1001         HASH_DEINIT(sostate->texture, 1);
1002         HASH_DEINIT(sostate->buffer, 1);
1003         HASH_DEINIT(sostate->renderbuffer, 1);
1004         HASH_DEINIT(sostate->program, 1);
1005         HASH_DEINIT(sostate->sampler, 1);
1006         HASH_DEINIT(sostate->programpipeline, 1);
1007
1008         HASH_DEINIT(sostate->texture_real, 0);
1009         HASH_DEINIT(sostate->buffer_real, 0);
1010         HASH_DEINIT(sostate->renderbuffer_real, 0);
1011         HASH_DEINIT(sostate->program_real, 0);
1012         HASH_DEINIT(sostate->sampler_real, 0);
1013
1014         HASH_DEINIT(sostate->programpipeline_real, 0);
1015 }
1016
1017 #undef HASH_DEINIT
1018
1019
1020
1021 #define FIND_HASH(hash_base, key, ret) \
1022 { \
1023         GL_Object_Hash *fh_current = hash_base->hash_field[(key) & (hash_base->hash_size - 1)]; \
1024         while(fh_current) \
1025         { \
1026                 if (fh_current->hash_key == (key)) \
1027                 { \
1028                         ret = fh_current; \
1029                         break; \
1030                 } \
1031                 fh_current = fh_current->next; \
1032         } \
1033 }
1034
1035 void
1036 _ostate_hash_check(GL_Object_Hash_Base *hash_base)
1037 {
1038         if (hash_base->item_size + 1 < hash_base->hash_size)
1039                 return;
1040
1041         int oldsize = hash_base->hash_size;
1042         GL_Object_Hash **oldfield = hash_base->hash_field;
1043
1044         hash_base->hash_size = oldsize << 1;
1045         hash_base->hash_field = (GL_Object_Hash **)calloc(1, sizeof(GL_Object_Hash *) * hash_base->hash_size);
1046         AST(hash_base->hash_field != NULL);
1047
1048         for (int i = 0; i < oldsize; i++)
1049         {
1050                 if (oldfield[i] != NULL)
1051                 {
1052                         GL_Object_Hash *current = oldfield[i];
1053
1054                         while (current != NULL)
1055                         {
1056                                 GL_Object_Hash *current_next = current->next;
1057                                 _add_hash(hash_base, current);
1058                                 hash_base->item_size--;
1059                                 current = current_next;
1060                         }
1061                 }
1062         }
1063         free(oldfield);
1064
1065 }
1066
1067 GLuint
1068 fastpath_ostate_create_object(GL_Object_State *ostate, GL_Object_Type type, GLuint real_name)
1069 {
1070         GLuint ret = _COREGL_INT_INIT_VALUE;
1071
1072         GL_Object_Hash_Base *hash_base = NULL;
1073         GL_Object_Hash_Base *hash_base_real = NULL;
1074         int newid = _COREGL_INT_INIT_VALUE;
1075
1076         hash_base = _lock_gl_object_hash(ostate, type);
1077         hash_base_real = _lock_gl_object_hash_real(ostate, type);
1078
1079         newid = hash_base->last_id + 1;
1080         if (newid >= hash_base->hash_size)
1081         {
1082                 hash_base->is_looped = 1;
1083                 newid = 1;
1084                 hash_base->last_id = 1;
1085         }
1086
1087         if (hash_base->is_looped != 0)
1088         {
1089                 int i;
1090                 int findingid = newid;
1091                 newid = -1;
1092                 for (i = 0; i < hash_base->hash_size; i++)
1093                 {
1094                         GL_Object_Hash *exist_hash = NULL;
1095                         FIND_HASH(hash_base, findingid, exist_hash);
1096                         if (exist_hash == NULL)
1097                         {
1098                                 newid = findingid;
1099                                 break;
1100                         }
1101                         findingid++;
1102                         if (findingid >= hash_base->hash_size) findingid = 1;
1103                 }
1104                 AST(newid != -1);
1105         }
1106         hash_base->last_id = newid;
1107
1108         {
1109                 GL_Object *newobj = (GL_Object *)calloc(1, sizeof(GL_Object));
1110                 AST(newobj != NULL);
1111                 newobj->id = (int)type + newid;
1112                 newobj->real_id = real_name;
1113                 newobj->ref_count = 1;
1114                 ret = newobj->id;
1115
1116                 GL_Object_Hash *newobj_hash = (GL_Object_Hash *)calloc(1, sizeof(GL_Object_Hash));
1117                 AST(newobj_hash != NULL);
1118                 newobj_hash->item = newobj;
1119                 newobj_hash->hash_key = newid;
1120                 _add_hash(hash_base, newobj_hash);
1121
1122                 GL_Object_Hash *newobj_hash_real = (GL_Object_Hash *)calloc(1, sizeof(GL_Object_Hash));
1123                 AST(newobj_hash_real != NULL);
1124                 newobj_hash_real->item = newobj;
1125                 newobj_hash_real->hash_key = real_name;
1126                 _add_hash(hash_base_real, newobj_hash_real);
1127         }
1128
1129         _ostate_hash_check(hash_base);
1130         _ostate_hash_check(hash_base_real);
1131
1132         goto finish;
1133
1134 finish:
1135         _unlock_gl_object_hash(ostate, type);
1136         _unlock_gl_object_hash_real(ostate, type);
1137         return ret;
1138 }
1139
1140 #define FIND_OBJ_FROM_HASH_WITH_VERIFY(hash_base, hash, object) \
1141         if (((int)(hash)) < 0) { ret = 0; goto finish; } \
1142         { \
1143                 GL_Object_Hash *object_hash = NULL; \
1144                 FIND_HASH((hash_base), (int)(hash), object_hash); \
1145                 if (object_hash == NULL) { ret = 0; goto finish; } \
1146                 (object) = object_hash->item; \
1147                 if ((object) == NULL) { ret = 0; goto finish; } \
1148         }
1149
1150 GLuint
1151 fastpath_ostate_remove_object(GL_Object_State *ostate, GL_Object_Type type, GLuint glue_name)
1152 {
1153         GLuint ret = _COREGL_INT_INIT_VALUE;
1154
1155         GL_Object_Hash_Base *hash_base = NULL;
1156         GL_Object_Hash_Base *hash_base_real = NULL;
1157         GL_Object *object = NULL;
1158
1159         hash_base = _lock_gl_object_hash(ostate, type);
1160         hash_base_real = _lock_gl_object_hash_real(ostate, type);
1161
1162         FIND_OBJ_FROM_HASH_WITH_VERIFY(hash_base, glue_name - (int)type, object);
1163
1164         object->ref_count--;
1165
1166         if (object->ref_count <= 0)
1167         {
1168                 GL_Object_Hash *object_hash = NULL;
1169
1170                 FIND_HASH(hash_base, object->id - (int)type, object_hash);
1171                 AST(object_hash != NULL);
1172                 _remove_hash(hash_base, object->id - (int)type);
1173                 free(object_hash);
1174                 object_hash = NULL;
1175
1176                 FIND_HASH(hash_base_real, object->real_id, object_hash);
1177                 AST(object_hash != NULL);
1178                 _remove_hash(hash_base_real, object->real_id);
1179                 free(object_hash);
1180                 object_hash = NULL;
1181
1182                 free(object);
1183                 object = NULL;
1184         }
1185
1186         ret = 1;
1187         goto finish;
1188
1189 finish:
1190         _unlock_gl_object_hash(ostate, type);
1191         _unlock_gl_object_hash_real(ostate, type);
1192         return ret;
1193 }
1194
1195 GLuint
1196 fastpath_ostate_get_object(GL_Object_State *ostate, GL_Object_Type type, GLuint glue_name)
1197 {
1198         GLuint ret = _COREGL_INT_INIT_VALUE;
1199
1200         GL_Object_Hash_Base *hash_base = NULL;
1201         GL_Object *object = NULL;
1202
1203         hash_base = _lock_gl_object_hash(ostate, type);
1204
1205         FIND_OBJ_FROM_HASH_WITH_VERIFY(hash_base, glue_name - (int)type, object);
1206
1207         ret = object->real_id;
1208         goto finish;
1209
1210 finish:
1211         _unlock_gl_object_hash(ostate, type);
1212         return ret;
1213 }
1214
1215
1216 /* Check if the context's state contains object of a given type */
1217 GLuint
1218 fastpath_ostate_has_object_type(GL_Object_State *ostate, GL_Object_Type type)
1219 {
1220         GLuint ret = _COREGL_INT_INIT_VALUE;
1221
1222         GL_Object_Hash_Base *hash_base = NULL;
1223         GL_Object *object = NULL;
1224         hash_base = _lock_gl_object_hash(ostate, type);
1225
1226         if(hash_base->hash_field == 0)
1227         {
1228                 ret = 0;
1229                 goto finish;
1230         }
1231
1232         FIND_OBJ_FROM_HASH_WITH_VERIFY(hash_base, 1, object);
1233
1234         ret = object->real_id;
1235         goto finish;
1236
1237 finish:
1238         _unlock_gl_object_hash(ostate, type);
1239         return ret;
1240 }
1241
1242
1243 GLint
1244 fastpath_ostate_set_object_tag(GL_Object_State *ostate, GL_Object_Type type, GLuint glue_name, GLvoid *tag)
1245 {
1246         GLint ret = _COREGL_INT_INIT_VALUE;
1247
1248         GL_Object_Hash_Base *hash_base = NULL;
1249         GL_Object *object = NULL;
1250         int hash = _COREGL_INT_INIT_VALUE;
1251
1252         hash_base = _lock_gl_object_hash(ostate, type);
1253
1254         hash = glue_name - (int)type;
1255
1256         FIND_OBJ_FROM_HASH_WITH_VERIFY(hash_base, hash, object);
1257
1258         AST(object->tag == NULL);
1259         object->tag = tag;
1260         ret = 1;
1261         goto finish;
1262
1263 finish:
1264         _unlock_gl_object_hash(ostate, type);
1265         return ret;
1266 }
1267
1268 GLvoid *
1269 fastpath_ostate_get_object_tag(GL_Object_State *ostate, GL_Object_Type type, GLuint glue_name)
1270 {
1271         GLvoid *ret = NULL;
1272
1273         GL_Object_Hash_Base *hash_base = NULL;
1274         GL_Object *object = NULL;
1275
1276         hash_base = _lock_gl_object_hash(ostate, type);
1277
1278         FIND_OBJ_FROM_HASH_WITH_VERIFY(hash_base, glue_name - (int)type, object);
1279
1280         ret = object->tag;
1281         goto finish;
1282
1283 finish:
1284         _unlock_gl_object_hash(ostate, type);
1285         return ret;
1286 }
1287
1288 GLuint
1289 fastpath_ostate_find_object(GL_Object_State *ostate, GL_Object_Type type, GLuint real_name)
1290 {
1291         GLuint ret = _COREGL_INT_INIT_VALUE;
1292
1293         GL_Object_Hash_Base *hash_base_real = NULL;
1294         GL_Object *object = NULL;
1295
1296         hash_base_real = _lock_gl_object_hash_real(ostate, type);
1297
1298         FIND_OBJ_FROM_HASH_WITH_VERIFY(hash_base_real, real_name, object);
1299
1300         ret = object->id;
1301         goto finish;
1302
1303 finish:
1304         _unlock_gl_object_hash_real(ostate, type);
1305         return ret;
1306 }
1307
1308 GLint
1309 fastpath_ostate_use_object(GL_Object_State *ostate, GL_Object_Type type, GLuint glue_name)
1310 {
1311         GLint ret = _COREGL_INT_INIT_VALUE;
1312
1313         GL_Object_Hash_Base *hash_base = NULL;
1314         GL_Object *object = NULL;
1315
1316         hash_base = _lock_gl_object_hash(ostate, type);
1317
1318         FIND_OBJ_FROM_HASH_WITH_VERIFY(hash_base, glue_name - (int)type, object);
1319
1320         object->ref_count++;
1321         ret = 1;
1322         goto finish;
1323
1324 finish:
1325         _unlock_gl_object_hash(ostate, type);
1326         return ret;
1327 }
1328
1329 void
1330 fastpath_dump_context_states(GLGlueContext *ctx, int force_output)
1331 {
1332         static struct timeval tv_last = { 0, 0 };
1333
1334         if (unlikely(trace_state_flag != 1)) return;
1335
1336         if (!force_output)
1337         {
1338                 struct timeval tv_now = { 0, 0 };
1339                 AST(gettimeofday(&tv_now, NULL) == 0);
1340                 if (tv_now.tv_sec - tv_last.tv_sec < _COREGL_TRACE_OUTPUT_INTERVAL_SEC)
1341                 {
1342                         goto finish;
1343                 }
1344                 tv_last = tv_now;
1345         }
1346
1347         TRACE("\n");
1348         TRACE("\E[0;40;34m========================================================================================================================\E[0m\n");
1349         TRACE("\E[40;32;1m  State info \E[1;37;1m: <PID = %d> GlueCTX = %p\E[0m\n", getpid(), ctx);
1350         TRACE("\E[0;40;34m========================================================================================================================\E[0m\n");
1351
1352 #define PRINTF_CHAR_GLenum "0x%8X"
1353 #define PRINTF_CHAR_GLboolean "%10d"
1354 #define PRINTF_CHAR_GLint "%10d"
1355 #define PRINTF_CHAR_GLsizei "%10u"
1356 #define PRINTF_CHAR_GLuint "%10u"
1357 #define PRINTF_CHAR_GLuintmask "0x%8X"
1358 #define PRINTF_CHAR_GLintptr "%10ld"
1359 #define PRINTF_CHAR_GLsizeiptr "%10ld"
1360
1361 #define PRINTF_CHAR_GLclampf "%10.6f"
1362 #define PRINTF_CHAR_GLfloat "%10.6f"
1363
1364 #define PRINTF_CHAR_GLvoidptr "%10p"
1365
1366 #define PRINTF_CHAR(type) PRINTF_CHAR_##type
1367
1368 #define _COREGL_START_API(version) api_gl_version = version;
1369 #define _COREGL_END_API(version) api_gl_version = COREGL_GLAPI_2;
1370 #define INITIAL_CTX initial_ctx
1371 #define GLUE_STATE(TYPE, NAME, SIZE, ARRAY_SIZE, DEFAULT_STMT, GET_STMT)  \
1372    { \
1373       TYPE valuedata[SIZE]; \
1374       TYPE *value = NULL; \
1375       if(api_gl_version <= driver_gl_version) { \
1376          value = valuedata; GET_STMT; value = valuedata; \
1377          TRACE("\E[40;37;1m %-30.30s : (\E[0m ", #NAME); \
1378          for (int i = 0; i < SIZE; i++) \
1379          { \
1380             if (i > 0) { \
1381                if (i % 4 == 0) \
1382                   TRACE("\n %-30.30s     ", "");\
1383                else \
1384                   TRACE(", "); \
1385             } \
1386             if (ctx->NAME[i] != value[i]) { TRACE("\E[40;31;1m"); } \
1387                TRACE(PRINTF_CHAR(TYPE), ctx->NAME[i]); \
1388                TRACE("["PRINTF_CHAR(TYPE)"]", value[i]); \
1389             if (ctx->NAME[i] != value[i]) { TRACE("\E[0m"); } \
1390          } \
1391          TRACE(" \E[40;37;1m)\E[0m\n"); \
1392       } \
1393    }
1394 # include "coregl_fastpath_state.h"
1395 #undef GLUE_STATE
1396 #undef INITIAL_CTX
1397 #undef _COREGL_START_API
1398 #undef _COREGL_END_API
1399
1400         TRACE("\E[0;40;34m========================================================================================================================\E[0m\n");
1401         TRACE("\n");
1402
1403         TRACE_END();
1404
1405 finish:
1406         return;
1407 }
1408
1409 int
1410 fastpath_init_context_states(GLGlueContext *ctx)
1411 {
1412         int ret = 0;
1413
1414         AST(mutex_lock(&init_context_mutex) == 1);
1415
1416         if (ctx == NULL)
1417         {
1418                 COREGL_ERR("Context NULL\n");
1419                 ret = 0;
1420                 goto finish;
1421         }
1422
1423         AST(ctx->initialized == 0);
1424         AST(ctx->ostate.shared != NULL);
1425
1426         if (initial_ctx == NULL)
1427         {
1428                 initial_ctx = (GLGlueContext *)calloc(1, sizeof(GLGlueContext));
1429                 AST(initial_ctx != NULL);
1430
1431 //#define FORCE_DEFAULT_VALUE
1432 #define _COREGL_START_API(version) api_gl_version = version;
1433 #define _COREGL_END_API(version) api_gl_version = COREGL_GLAPI_2;
1434 #ifdef FORCE_DEFAULT_VALUE
1435 # define INITIAL_CTX initial_ctx
1436 # define GLUE_STATE(TYPE, NAME, SIZE, ARRAY_SIZE, DEFAULT_STMT, GET_STMT)  \
1437       { \
1438          int i; \
1439          TYPE valuedata[SIZE]; \
1440          TYPE *value = NULL; \
1441          memset(valuedata, 0xcc, sizeof(TYPE) * SIZE); \
1442          if(api_gl_version <= driver_gl_version) { \
1443             value = valuedata; DEFAULT_STMT; value = valuedata; \
1444             for (i = 0; i < SIZE; i++) \
1445             { \
1446                if (*((char *)(&value[i])) == 0xcc) \
1447                { \
1448                   memset(&value[i], 0xaa, sizeof(TYPE)); \
1449                   value = valuedata; DEFAULT_STMT; value = valuedata; \
1450                   if (*((char *)(&value[i])) == 0xaa) \
1451                   { \
1452                      COREGL_WRN("\E[40;31;1mGL-state '"#NAME"' cannot be retrieved\E[0m\n"); \
1453                      break; \
1454                   } \
1455                } \
1456                initial_ctx->NAME[i] = value[i]; \
1457             } \
1458         }\
1459       }
1460 #  include "coregl_fastpath_state.h"
1461 # undef GLUE_STATE
1462 # undef INITIAL_CTX
1463 #else
1464 # define INITIAL_CTX initial_ctx
1465 # define SET_GLUE_VALUE(DEFAULT_STMT, FALLBACK_STMT) \
1466       if (try_step == 1) \
1467       { \
1468          value = valuedata; DEFAULT_STMT; value = valuedata; \
1469       } \
1470       else \
1471       { \
1472          value = valuedata; FALLBACK_STMT; value = valuedata; \
1473       }
1474
1475 # define GLUE_STATE(TYPE, NAME, SIZE, ARRAY_SIZE, DEFAULT_STMT, GET_STMT)  \
1476       { \
1477          int i; \
1478          int try_step = 0;\
1479          TYPE valuedata[SIZE]; \
1480          TYPE *value = NULL; \
1481          _sym_glGetError(); \
1482          memset(valuedata, 0xcc, sizeof(TYPE) * SIZE); \
1483          if(api_gl_version <= driver_gl_version) { \
1484             do { \
1485                try_step++; \
1486                SET_GLUE_VALUE(GET_STMT, DEFAULT_STMT); \
1487                if (_sym_glGetError() == GL_INVALID_ENUM) \
1488                { \
1489                   initial_ctx->NAME##_used = 0; \
1490                   value = valuedata; DEFAULT_STMT; value = valuedata; \
1491                   break; \
1492                } \
1493                initial_ctx->NAME##_used = 1; \
1494                for (i = 0; i < SIZE; i++) \
1495                { \
1496                   if (*((char *)(&value[i])) == 0xcc) \
1497                   { \
1498                      memset(&value[i], 0xaa, sizeof(TYPE)); \
1499                      SET_GLUE_VALUE(GET_STMT, DEFAULT_STMT); \
1500                      if (*((char *)(&value[i])) == 0xaa) \
1501                      { \
1502                         try_step++; \
1503                         if (try_step == 2) \
1504                         { \
1505                            COREGL_WRN("\E[40;31;1mGL-state '"#NAME"' cannot be retrieved\E[0m\n"); \
1506                         } \
1507                         break; \
1508                      } \
1509                   } \
1510                   initial_ctx->NAME[i] = value[i]; \
1511                } \
1512                if (try_step != 2) \
1513                { \
1514                   value = valuedata; DEFAULT_STMT; value = valuedata; \
1515                   for (i = 0; i < SIZE; i++) \
1516                   { \
1517                      if (initial_ctx->NAME[i] != value[i]) \
1518                      { \
1519                         COREGL_WRN("GL-state '"#NAME"'[%d] value ["PRINTF_CHAR(TYPE)"] is different from SPEC-DEFAULT ["PRINTF_CHAR(TYPE)"]\n", i, initial_ctx->NAME[i], value[i]); \
1520                      } \
1521                   } \
1522                } \
1523             } \
1524             while (try_step == 2); \
1525          }\
1526       }
1527 #  include "coregl_fastpath_state.h"
1528 # undef SET_GLUE_VALUE
1529 # undef GLUE_STATE
1530 # undef INITIAL_CTX
1531 #endif
1532 # undef _COREGL_END_API
1533 # undef _COREGL_START_API
1534
1535                 if (initial_ctx->gl_num_vertex_attribs[0] > MAX_VERTEX_ATTRIBS)
1536                 {
1537                         COREGL_WRN("\E[40;31;1mNumber of vertex attrib is too big! (%d-%d)\E[0m\n", MAX_VERTEX_ATTRIBS, initial_ctx->gl_num_vertex_attribs[0]);
1538                 }
1539                 if (initial_ctx->gl_num_tex_units[0] > MAX_TEXTURE_UNITS)
1540                 {
1541                         COREGL_WRN("\E[40;31;1mNumber of texture unit is too big! (%d-%d)\E[0m\n", MAX_TEXTURE_UNITS, initial_ctx->gl_num_tex_units[0]);
1542                 }
1543                 if (initial_ctx->gl_num_transform_feedback_separate_attribs[0] > MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS)
1544                 {
1545                         COREGL_WRN("\E[40;31;1mNumber of transform feedback separate attrib is too big! (%d-%d)\E[0m\n", MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, initial_ctx->gl_num_transform_feedback_separate_attribs[0]);
1546                 }
1547                 if (initial_ctx->gl_num_uniform_buffer_bindings[0] > MAX_UNIFORM_BUFFER_BINDINGS)
1548                 {
1549                         COREGL_WRN("\E[40;31;1mNumber of uniform buffer binding is too big! (%d-%d)\E[0m\n", MAX_UNIFORM_BUFFER_BINDINGS, initial_ctx->gl_num_uniform_buffer_bindings[0]);
1550                 }
1551         }
1552
1553         {
1554                 int i;
1555 #define _COREGL_START_API(version) api_gl_version = version;
1556 #define _COREGL_END_API(version) api_gl_version = COREGL_GLAPI_2;
1557 #define INITIAL_CTX initial_ctx
1558 #define GLUE_STATE(TYPE, NAME, SIZE, ARRAY_SIZE, DEFAULT_STMT, GET_STMT)  \
1559       if(api_gl_version <= driver_gl_version) { \
1560          for (i = 0; i < SIZE; i++) \
1561          { \
1562             ctx->NAME[i] = initial_ctx->NAME[i]; \
1563             ctx->NAME##_used = initial_ctx->NAME##_used; \
1564          }\
1565       }
1566 # include "coregl_fastpath_state.h"
1567 #undef GLUE_STATE
1568 #undef INITIAL_CTX
1569 #undef _COREGL_START_API
1570 #undef _COREGL_END_API
1571         }
1572
1573         ctx->initialized = 1;
1574         ret = 1;
1575         goto finish;
1576
1577 finish:
1578         AST(mutex_unlock(&init_context_mutex) == 1);
1579
1580         return ret;
1581 }
1582
1583 #ifdef COREGL_USE_MODULE_TRACEPATH
1584 extern void *tracepath_api_trace_begin(const char *name, void *hint, int trace_total_time);
1585 extern void *tracepath_api_trace_end(const char *name, void *hint, int trace_total_time);
1586 #endif
1587
1588 #define CHECK_GL_ERROR(func) \
1589         { \
1590                 func; \
1591                 int err = _orig_fastpath_glGetError(); \
1592                 if (err != GL_NO_ERROR) \
1593                 { \
1594                         COREGL_ERR("\E[40;31;1m(GL %p) : %s returns GL error 0x%X\E[0m\n", oldctx->cstate, #func, err); \
1595                         goto finish; \
1596                 } \
1597         }
1598
1599 int
1600 fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
1601 {
1602         int ret = 0;
1603         unsigned char flag = 0;
1604         int i = 0;
1605
1606         if (debug_nofp == 1)
1607         {
1608                 ret = 1;
1609                 goto finish;
1610         }
1611
1612         // Return if they're the same
1613         if (oldctx == newctx)
1614         {
1615                 ret = 1;
1616                 goto finish;
1617         }
1618
1619 #define STATE_COMPARE(state) \
1620    if ((oldctx->state) != (newctx->state))
1621
1622 #define STATES_COMPARE(state_ptr, bytes) \
1623    if ((memcmp((oldctx->state_ptr), (newctx->state_ptr), (bytes))) != 0)
1624
1625
1626 #ifdef COREGL_USE_MODULE_TRACEPATH
1627         static void *trace_hint_glfinish = NULL;
1628         trace_hint_glfinish = tracepath_api_trace_begin("eglMakeCurrent(FP glFinish)", trace_hint_glfinish, 0);
1629 #endif // COREGL_USE_MODULE_TRACEPATH
1630
1631         {
1632                 int err = _orig_fastpath_glGetError();
1633                 if (err != GL_NO_ERROR && oldctx->gl_error == GL_NO_ERROR)
1634                         oldctx->gl_error = err;
1635         }
1636
1637         CHECK_GL_ERROR(_orig_fastpath_glFlush())
1638
1639 #ifdef COREGL_USE_MODULE_TRACEPATH
1640         tracepath_api_trace_end("eglMakeCurrent(FP glFinish)", trace_hint_glfinish, 0);
1641 #endif // COREGL_USE_MODULE_TRACEPATH
1642
1643         // _varray_flag
1644 #ifdef COREGL_USE_MODULE_TRACEPATH
1645         static void *trace_hint_vertex_attrib = NULL;
1646         trace_hint_vertex_attrib = tracepath_api_trace_begin("eglMakeCurrent(FP vertex attrib)", trace_hint_vertex_attrib, 0);
1647 #endif // COREGL_USE_MODULE_TRACEPATH
1648
1649         flag = oldctx->_vattrib_flag | newctx->_vattrib_flag;
1650         if (flag)
1651         {
1652                 for (i = 0; i < oldctx->gl_num_vertex_attribs[0]; i++)
1653                 {
1654                         if (newctx->gl_vertex_array_buf_id[i] != oldctx->gl_vertex_array_buf_id[i])
1655                         {
1656                                 CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ARRAY_BUFFER, newctx->gl_vertex_array_buf_id[i]))
1657                         }
1658                         else
1659                         {
1660                                 CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ARRAY_BUFFER, 0))
1661                         }
1662
1663                         STATE_COMPARE(gl_vertex_array_divisor[i])
1664                         {
1665                                 CHECK_GL_ERROR(_orig_fastpath_glVertexAttribDivisor(i, newctx->gl_vertex_array_divisor[i]))
1666                         }
1667
1668                         if (newctx->gl_vertex_array_size[i] != 0)
1669                         {
1670                                 CHECK_GL_ERROR(_orig_fastpath_glVertexAttribPointer(i,
1671                                                newctx->gl_vertex_array_size[i],
1672                                                newctx->gl_vertex_array_type[i],
1673                                                newctx->gl_vertex_array_normalized[i],
1674                                                newctx->gl_vertex_array_stride[i],
1675                                                newctx->gl_vertex_array_pointer[i]))
1676                         }
1677                         else
1678                         {
1679                                 if (newctx->gl_vertex_array_integer[0] == GL_TRUE)
1680                                 {
1681                                         if (newctx->gl_vertex_array_type[0] == GL_UNSIGNED_INT)
1682                                         {
1683                                                 CHECK_GL_ERROR(_orig_fastpath_glVertexAttribI4uiv(i, &newctx->gl_vertex_attrib_value_unsigned_integer[4 * i]))
1684                                         }
1685                                         else
1686                                         {
1687                                                 CHECK_GL_ERROR(_orig_fastpath_glVertexAttribI4iv(i, &newctx->gl_vertex_attrib_value_integer[4 * i]))
1688                                         }
1689                                 }
1690                                 else
1691                                 {
1692                                         CHECK_GL_ERROR(_orig_fastpath_glVertexAttrib4fv(i, &newctx->gl_vertex_attrib_value[4 * i]))
1693                                 }
1694                         }
1695
1696                         if (newctx->gl_vertex_array_enabled[i] == GL_TRUE)
1697                         {
1698                                 CHECK_GL_ERROR(_orig_fastpath_glEnableVertexAttribArray(i))
1699                         }
1700                         else
1701                         {
1702                                 CHECK_GL_ERROR(_orig_fastpath_glDisableVertexAttribArray(i))
1703                         }
1704                 }
1705
1706         }
1707
1708 #ifdef COREGL_USE_MODULE_TRACEPATH
1709         tracepath_api_trace_end("eglMakeCurrent(FP vertex attrib)", trace_hint_vertex_attrib, 0);
1710 #endif // COREGL_USE_MODULE_TRACEPATH
1711
1712
1713 #ifdef COREGL_USE_MODULE_TRACEPATH
1714         static void *trace_hint_bindbuffers = NULL;
1715         trace_hint_bindbuffers = tracepath_api_trace_begin("eglMakeCurrent(FP bind buffers)", trace_hint_bindbuffers, 0);
1716 #endif // COREGL_USE_MODULE_TRACEPATH
1717
1718         //------------------//
1719         // _bind_flag1
1720         flag = oldctx->_bind_flag1 | newctx->_bind_flag1;
1721         if (flag)
1722         {
1723                 STATE_COMPARE(gl_array_buffer_binding[0])
1724                 {
1725                         CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ARRAY_BUFFER, newctx->gl_array_buffer_binding[0]))
1726                 }
1727                 STATE_COMPARE(gl_element_array_buffer_binding[0])
1728                 {
1729                         STATE_COMPARE(gl_vertex_array_binding[0])
1730                         {
1731                                 CHECK_GL_ERROR(_orig_fastpath_glBindVertexArray(newctx->gl_vertex_array_binding[0]))
1732                         }
1733                         CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, newctx->gl_element_array_buffer_binding[0]))
1734                 }
1735
1736                 if (newctx->gl_framebuffer_binding_read_used == 1)
1737                 {
1738                         STATE_COMPARE(gl_framebuffer_binding_read[0])
1739                         {
1740                                 if(driver_gl_version >=2)
1741                                         CHECK_GL_ERROR(_orig_fastpath_glBindFramebuffer(GL_READ_FRAMEBUFFER, newctx->gl_framebuffer_binding_read[0]))
1742                                 else
1743                                         CHECK_GL_ERROR(_orig_fastpath_glBindFramebufferOES(GL_READ_FRAMEBUFFER, newctx->gl_framebuffer_binding_read[0]))
1744                         }
1745                         STATE_COMPARE(gl_framebuffer_binding_draw[0])
1746                         {
1747                                 if(driver_gl_version >=2)
1748                                         CHECK_GL_ERROR(_orig_fastpath_glBindFramebuffer(GL_DRAW_FRAMEBUFFER, newctx->gl_framebuffer_binding_draw[0]))
1749                                 else
1750                                         CHECK_GL_ERROR(_orig_fastpath_glBindFramebufferOES(GL_DRAW_FRAMEBUFFER, newctx->gl_framebuffer_binding_draw[0]))
1751                         }
1752                 }
1753                 else
1754                 {
1755                         STATE_COMPARE(gl_framebuffer_binding[0])
1756                         {
1757                                 if(driver_gl_version >=2)
1758                                         CHECK_GL_ERROR(_orig_fastpath_glBindFramebuffer(GL_FRAMEBUFFER, newctx->gl_framebuffer_binding[0]))
1759                                 else
1760                                         CHECK_GL_ERROR(_orig_fastpath_glBindFramebufferOES(GL_FRAMEBUFFER, newctx->gl_framebuffer_binding[0]))
1761                         }
1762                 }
1763                 STATE_COMPARE(gl_renderbuffer_binding[0])
1764                 {
1765                         CHECK_GL_ERROR(_orig_fastpath_glBindRenderbuffer(GL_RENDERBUFFER, newctx->gl_renderbuffer_binding[0]))
1766                 }
1767         }
1768
1769         //------------------//
1770         // _bind_flag2
1771         flag = oldctx->_bind_flag2 | newctx->_bind_flag2;
1772         if (flag)
1773         {
1774                 STATE_COMPARE(gl_copy_read_buffer_binding[0])
1775                 {
1776                         CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_COPY_READ_BUFFER, newctx->gl_copy_read_buffer_binding[0]))
1777                 }
1778                 STATE_COMPARE(gl_copy_write_buffer_binding[0])
1779                 {
1780                         CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_COPY_WRITE_BUFFER, newctx->gl_copy_write_buffer_binding[0]))
1781                 }
1782                 STATE_COMPARE(gl_pixel_pack_buffer_binding[0])
1783                 {
1784                         CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_PIXEL_PACK_BUFFER, newctx->gl_pixel_pack_buffer_binding[0]))
1785                 }
1786                 STATE_COMPARE(gl_pixel_unpack_buffer_binding[0])
1787                 {
1788                         CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_PIXEL_UNPACK_BUFFER, newctx->gl_pixel_unpack_buffer_binding[0]))
1789                 }
1790                 STATE_COMPARE(gl_transform_feedback_buffer_binding[0])
1791                 {
1792                         CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, newctx->gl_transform_feedback_buffer_binding[0]))
1793                 }
1794                 STATE_COMPARE(gl_uniform_buffer_binding[0])
1795                 {
1796                         CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_UNIFORM_BUFFER, newctx->gl_uniform_buffer_binding[0]))
1797                 }
1798         }
1799 #ifdef COREGL_USE_MODULE_TRACEPATH
1800         tracepath_api_trace_end("eglMakeCurrent(FP bind buffers)", trace_hint_bindbuffers, 0);
1801 #endif // COREGL_USE_MODULE_TRACEPATH
1802
1803
1804         //------------------//
1805         // Enable States
1806         // _enable_flag1
1807 #ifdef COREGL_USE_MODULE_TRACEPATH
1808         static void *trace_hint_enable_states = NULL;
1809         trace_hint_enable_states = tracepath_api_trace_begin("eglMakeCurrent(FP enable states)", trace_hint_enable_states, 0);
1810 #endif // COREGL_USE_MODULE_TRACEPATH
1811
1812         flag = oldctx->_enable_flag1 | newctx->_enable_flag1;
1813         if (flag)
1814         {
1815                 STATE_COMPARE(gl_blend[0])
1816                 {
1817                         if (newctx->gl_blend[0])
1818                         {
1819                                 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_BLEND))
1820                         }
1821                         else
1822                                 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_BLEND))
1823                 }
1824                 STATE_COMPARE(gl_cull_face[0])
1825                 {
1826                         if (newctx->gl_cull_face[0])
1827                         {
1828                                 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_CULL_FACE))
1829                         }
1830                         else
1831                                 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_CULL_FACE))
1832                 }
1833                 STATE_COMPARE(gl_depth_test[0])
1834                 {
1835                         if (newctx->gl_depth_test[0])
1836                         {
1837                                 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_DEPTH_TEST))
1838                         }
1839                         else
1840                                 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_DEPTH_TEST))
1841                 }
1842                 STATE_COMPARE(gl_dither[0])
1843                 {
1844                         if (newctx->gl_dither[0])
1845                         {
1846                                 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_DITHER))
1847                         }
1848                         else
1849                                 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_DITHER))
1850                 }
1851         }
1852
1853         // _enable_flag2
1854         flag = oldctx->_enable_flag2 | newctx->_enable_flag2;
1855         if (flag)
1856         {
1857                 STATE_COMPARE(gl_polygon_offset_fill[0])
1858                 {
1859                         if (newctx->gl_polygon_offset_fill[0])
1860                         {
1861                                 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_POLYGON_OFFSET_FILL))
1862                         }
1863                         else
1864                                 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_POLYGON_OFFSET_FILL))
1865                 }
1866                 STATE_COMPARE(gl_sample_alpha_to_coverage[0])
1867                 {
1868                         if (newctx->gl_sample_alpha_to_coverage[0])
1869                         {
1870                                 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE))
1871                         }
1872                         else
1873                                 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE))
1874                 }
1875                 STATE_COMPARE(gl_sample_coverage[0])
1876                 {
1877                         if (newctx->gl_sample_coverage[0])
1878                         {
1879                                 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_SAMPLE_COVERAGE))
1880                         }
1881                         else
1882                                 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_SAMPLE_COVERAGE))
1883                 }
1884                 STATE_COMPARE(gl_scissor_test[0])
1885                 {
1886                         if (newctx->gl_scissor_test[0])
1887                         {
1888                                 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_SCISSOR_TEST))
1889                         }
1890                         else
1891                                 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_SCISSOR_TEST))
1892                 }
1893                 STATE_COMPARE(gl_stencil_test[0])
1894                 {
1895                         if (newctx->gl_stencil_test[0])
1896                         {
1897                                 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_STENCIL_TEST))
1898                         }
1899                         else
1900                                 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_STENCIL_TEST))
1901                 }
1902         }
1903
1904         // _enable_flag3
1905         flag = oldctx->_enable_flag3 | newctx->_enable_flag3;
1906         if (flag)
1907         {
1908                 STATE_COMPARE(gl_primitive_restart_fixed_index[0])
1909                 {
1910                         if (newctx->gl_primitive_restart_fixed_index[0])
1911                         {
1912                                 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX))
1913                         }
1914                         else
1915                                 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_PRIMITIVE_RESTART_FIXED_INDEX))
1916                 }
1917                 STATE_COMPARE(gl_rasterizer_discard[0])
1918                 {
1919                         if (newctx->gl_rasterizer_discard[0])
1920                         {
1921                                 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_RASTERIZER_DISCARD))
1922                         }
1923                         else
1924                                 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_RASTERIZER_DISCARD))
1925                 }
1926         }
1927
1928 #ifdef COREGL_USE_MODULE_TRACEPATH
1929         tracepath_api_trace_end("eglMakeCurrent(FP enable states)", trace_hint_enable_states, 0);
1930 #endif // COREGL_USE_MODULE_TRACEPATH
1931
1932         //------------------//
1933         // _clear_flag1
1934 #ifdef COREGL_USE_MODULE_TRACEPATH
1935         static void *trace_hint_clear_viewport = NULL;
1936         trace_hint_clear_viewport = tracepath_api_trace_begin("eglMakeCurrent(FP clear/viewport)", trace_hint_clear_viewport, 0);
1937 #endif // COREGL_USE_MODULE_TRACEPATH
1938
1939         flag = oldctx->_clear_flag1 | newctx->_clear_flag1;
1940         if (flag)
1941         {
1942                 // Viewport.
1943                 STATES_COMPARE(gl_viewport, 4 * sizeof(GLint))
1944                 {
1945                         CHECK_GL_ERROR(_orig_fastpath_glViewport(newctx->gl_viewport[0],
1946                                        newctx->gl_viewport[1],
1947                                        newctx->gl_viewport[2],
1948                                        newctx->gl_viewport[3]))
1949                 }
1950
1951                 STATE_COMPARE(gl_current_program[0])
1952                 {
1953                         CHECK_GL_ERROR(_orig_fastpath_glUseProgram(newctx->gl_current_program[0]))
1954                 }
1955                 STATES_COMPARE(gl_color_clear_value, 4 * sizeof(GLclampf))
1956                 {
1957                         CHECK_GL_ERROR(_orig_fastpath_glClearColor(newctx->gl_color_clear_value[0],
1958                                        newctx->gl_color_clear_value[1],
1959                                        newctx->gl_color_clear_value[2],
1960                                        newctx->gl_color_clear_value[3]))
1961                 }
1962         }
1963
1964
1965         // _clear_flag2
1966         flag = oldctx->_clear_flag2 | newctx->_clear_flag2;
1967         if (flag)
1968         {
1969                 STATES_COMPARE(gl_color_writemask, 4 * sizeof(GLboolean))
1970                 {
1971                         CHECK_GL_ERROR(_orig_fastpath_glColorMask(newctx->gl_color_writemask[0],
1972                                        newctx->gl_color_writemask[1],
1973                                        newctx->gl_color_writemask[2],
1974                                        newctx->gl_color_writemask[3]))
1975                 }
1976                 STATES_COMPARE(gl_depth_range, 2 * sizeof(GLclampf))
1977                 {
1978                         CHECK_GL_ERROR(_orig_fastpath_glDepthRangef(newctx->gl_depth_range[0],
1979                                        newctx->gl_depth_range[1]))
1980                 }
1981                 STATE_COMPARE(gl_depth_clear_value[0])
1982                 {
1983                         CHECK_GL_ERROR(_orig_fastpath_glClearDepthf(newctx->gl_depth_clear_value[0]))
1984                 }
1985                 STATE_COMPARE(gl_depth_func[0])
1986                 {
1987                         CHECK_GL_ERROR(_orig_fastpath_glDepthFunc(newctx->gl_depth_func[0]))
1988                 }
1989                 STATE_COMPARE(gl_depth_writemask[0])
1990                 {
1991                         CHECK_GL_ERROR(_orig_fastpath_glDepthMask(newctx->gl_depth_writemask[0]))
1992                 }
1993                 STATE_COMPARE(gl_cull_face_mode[0])
1994                 {
1995                         CHECK_GL_ERROR(_orig_fastpath_glCullFace(newctx->gl_cull_face_mode[0]))
1996                 }
1997
1998         }
1999
2000 #ifdef COREGL_USE_MODULE_TRACEPATH
2001         tracepath_api_trace_end("eglMakeCurrent(FP clear/viewport)", trace_hint_clear_viewport, 0);
2002 #endif // COREGL_USE_MODULE_TRACEPATH
2003
2004         //------------------//
2005         // Texture here...
2006 #ifdef COREGL_USE_MODULE_TRACEPATH
2007         static void *trace_hint_bind_textures = NULL;
2008         trace_hint_bind_textures = tracepath_api_trace_begin("eglMakeCurrent(FP bind textures)", trace_hint_bind_textures, 0);
2009 #endif // COREGL_USE_MODULE_TRACEPATH
2010
2011         flag = oldctx->_tex_flag1 | newctx->_tex_flag1;
2012         if (flag)
2013         {
2014
2015                 for (i = 0; i < oldctx->gl_num_tex_units[0]; i++)
2016                 {
2017                         STATE_COMPARE(gl_tex_2d_state[i])
2018                         {
2019                                 CHECK_GL_ERROR(_orig_fastpath_glActiveTexture(GL_TEXTURE0 + i))
2020                                 CHECK_GL_ERROR(_orig_fastpath_glBindTexture(GL_TEXTURE_2D, newctx->gl_tex_2d_state[i]))
2021                         }
2022                         STATE_COMPARE(gl_tex_3d_state[i])
2023                         {
2024                                 CHECK_GL_ERROR(_orig_fastpath_glActiveTexture(GL_TEXTURE0 + i))
2025                                 CHECK_GL_ERROR(_orig_fastpath_glBindTexture(GL_TEXTURE_3D, newctx->gl_tex_3d_state[i]))
2026                         }
2027                         STATE_COMPARE(gl_tex_2d_array_state[i])
2028                         {
2029                                 CHECK_GL_ERROR(_orig_fastpath_glActiveTexture(GL_TEXTURE0 + i))
2030                                 CHECK_GL_ERROR(_orig_fastpath_glBindTexture(GL_TEXTURE_2D_ARRAY, newctx->gl_tex_2d_array_state[i]))
2031                         }
2032                         STATE_COMPARE(gl_tex_cube_state[i])
2033                         {
2034                                 CHECK_GL_ERROR(_orig_fastpath_glActiveTexture(GL_TEXTURE0 + i))
2035                                 CHECK_GL_ERROR(_orig_fastpath_glBindTexture(GL_TEXTURE_CUBE_MAP, newctx->gl_tex_cube_state[i]))
2036                         }
2037                         STATE_COMPARE(gl_tex_external_oes_state[i])
2038                         {
2039                                 CHECK_GL_ERROR(_orig_fastpath_glActiveTexture(GL_TEXTURE0 + i))
2040                                 CHECK_GL_ERROR(_orig_fastpath_glBindTexture(GL_TEXTURE_EXTERNAL_OES, newctx->gl_tex_external_oes_state[i]))
2041                         }
2042                 }
2043
2044                 // Restore active texture
2045                 CHECK_GL_ERROR(_orig_fastpath_glActiveTexture(newctx->gl_active_texture[0]))
2046
2047                 STATE_COMPARE(gl_generate_mipmap_hint[0])
2048                 {
2049                         CHECK_GL_ERROR(_orig_fastpath_glHint(GL_GENERATE_MIPMAP_HINT, newctx->gl_generate_mipmap_hint[0]))
2050                 }
2051         }
2052 #ifdef COREGL_USE_MODULE_TRACEPATH
2053         tracepath_api_trace_end("eglMakeCurrent(FP bind textures)", trace_hint_bind_textures, 0);
2054 #endif // COREGL_USE_MODULE_TRACEPATH
2055
2056         //------------------//
2057 #ifdef COREGL_USE_MODULE_TRACEPATH
2058         static void *trace_hint_etc = NULL;
2059         trace_hint_etc = tracepath_api_trace_begin("eglMakeCurrent(FP etc.)", trace_hint_etc, 0);
2060 #endif // COREGL_USE_MODULE_TRACEPATH
2061
2062         flag = oldctx->_blend_flag | newctx->_blend_flag;
2063         if (flag)
2064         {
2065                 STATES_COMPARE(gl_blend_color, 4 * sizeof(GLclampf))
2066                 {
2067                         CHECK_GL_ERROR(_orig_fastpath_glBlendColor(newctx->gl_blend_color[0],
2068                                        newctx->gl_blend_color[1],
2069                                        newctx->gl_blend_color[2],
2070                                        newctx->gl_blend_color[3]))
2071                 }
2072                 if ((oldctx->gl_blend_src_rgb[0] != newctx->gl_blend_src_rgb[0]) ||
2073                     (oldctx->gl_blend_dst_rgb[0] != newctx->gl_blend_dst_rgb[0]) ||
2074                     (oldctx->gl_blend_src_alpha[0] != newctx->gl_blend_src_alpha[0]) ||
2075                     (oldctx->gl_blend_dst_alpha[0] != newctx->gl_blend_dst_alpha[0]))
2076                 {
2077                         CHECK_GL_ERROR(_orig_fastpath_glBlendFuncSeparate(newctx->gl_blend_src_rgb[0],
2078                                        newctx->gl_blend_dst_rgb[0],
2079                                        newctx->gl_blend_src_alpha[0],
2080                                        newctx->gl_blend_dst_alpha[0]))
2081                 }
2082                 if ((oldctx->gl_blend_equation_rgb[0] != newctx->gl_blend_equation_rgb[0]) ||
2083                     (oldctx->gl_blend_equation_alpha[0] != newctx->gl_blend_equation_alpha[0]))
2084                 {
2085                         CHECK_GL_ERROR(_orig_fastpath_glBlendEquationSeparate(newctx->gl_blend_equation_rgb[0], newctx->gl_blend_equation_alpha[0]))
2086                 }
2087
2088         }
2089
2090         //------------------//
2091         // _stencil_flag1
2092         flag = oldctx->_stencil_flag1 | newctx->_stencil_flag1;
2093         if (flag)
2094         {
2095                 if ((oldctx->gl_stencil_func[0] != newctx->gl_stencil_func[0]) ||
2096                     (oldctx->gl_stencil_ref[0]  != newctx->gl_stencil_ref[0])  ||
2097                     (oldctx->gl_stencil_value_mask[0] != newctx->gl_stencil_value_mask[0]))
2098                 {
2099                         CHECK_GL_ERROR(_orig_fastpath_glStencilFuncSeparate(GL_FRONT,
2100                                        newctx->gl_stencil_func[0],
2101                                        newctx->gl_stencil_ref[0],
2102                                        newctx->gl_stencil_value_mask[0]))
2103                 }
2104                 if ((oldctx->gl_stencil_fail[0] != newctx->gl_stencil_fail[0]) ||
2105                     (oldctx->gl_stencil_pass_depth_fail[0] != newctx->gl_stencil_pass_depth_fail[0]) ||
2106                     (oldctx->gl_stencil_pass_depth_pass[0] != newctx->gl_stencil_pass_depth_pass[0]))
2107                 {
2108                         CHECK_GL_ERROR(_orig_fastpath_glStencilOpSeparate(GL_FRONT,
2109                                        newctx->gl_stencil_fail[0],
2110                                        newctx->gl_stencil_pass_depth_fail[0],
2111                                        newctx->gl_stencil_pass_depth_pass[0]))
2112                 }
2113
2114                 STATE_COMPARE(gl_stencil_writemask[0])
2115                 {
2116                         CHECK_GL_ERROR(_orig_fastpath_glStencilMaskSeparate(GL_FRONT, newctx->gl_stencil_writemask[0]))
2117                 }
2118         }
2119
2120
2121         // _stencil_flag1
2122         flag = oldctx->_stencil_flag2 | newctx->_stencil_flag2;
2123         if (flag)
2124         {
2125                 if ((oldctx->gl_stencil_back_func[0] != newctx->gl_stencil_back_func[0]) ||
2126                     (oldctx->gl_stencil_back_ref[0]  != newctx->gl_stencil_back_ref[0])  ||
2127                     (oldctx->gl_stencil_back_value_mask[0] != newctx->gl_stencil_back_value_mask[0]))
2128                 {
2129                         CHECK_GL_ERROR(_orig_fastpath_glStencilFuncSeparate(GL_BACK,
2130                                        newctx->gl_stencil_back_func[0],
2131                                        newctx->gl_stencil_back_ref[0],
2132                                        newctx->gl_stencil_back_value_mask[0]))
2133                 }
2134                 if ((oldctx->gl_stencil_back_fail[0] != newctx->gl_stencil_back_fail[0]) ||
2135                     (oldctx->gl_stencil_back_pass_depth_fail[0] != newctx->gl_stencil_back_pass_depth_fail[0]) ||
2136                     (oldctx->gl_stencil_back_pass_depth_pass[0] != newctx->gl_stencil_back_pass_depth_pass[0]))
2137                 {
2138                         CHECK_GL_ERROR(_orig_fastpath_glStencilOpSeparate(GL_BACK,
2139                                        newctx->gl_stencil_back_fail[0],
2140                                        newctx->gl_stencil_back_pass_depth_fail[0],
2141                                        newctx->gl_stencil_back_pass_depth_pass[0]))
2142                 }
2143
2144                 STATE_COMPARE(gl_stencil_back_writemask[0])
2145                 {
2146                         CHECK_GL_ERROR(_orig_fastpath_glStencilMaskSeparate(GL_BACK, newctx->gl_stencil_back_writemask[0]))
2147                 }
2148                 STATE_COMPARE(gl_stencil_clear_value[0])
2149                 {
2150                         CHECK_GL_ERROR(_orig_fastpath_glClearStencil(newctx->gl_stencil_clear_value[0]))
2151                 }
2152         }
2153
2154         //------------------//
2155         // _pixel_flag1
2156         flag = oldctx->_pixel_flag1 | newctx->_pixel_flag1;
2157         if (flag)
2158         {
2159                 STATE_COMPARE(gl_pack_row_length[0])
2160                 {
2161                         CHECK_GL_ERROR(_orig_fastpath_glPixelStorei(GL_PACK_ROW_LENGTH, newctx->gl_pack_row_length[0]))
2162                 }
2163                 STATE_COMPARE(gl_pack_skip_rows[0])
2164                 {
2165                         CHECK_GL_ERROR(_orig_fastpath_glPixelStorei(GL_PACK_SKIP_ROWS, newctx->gl_pack_skip_rows[0]))
2166                 }
2167                 STATE_COMPARE(gl_pack_skip_pixels[0])
2168                 {
2169                         CHECK_GL_ERROR(_orig_fastpath_glPixelStorei(GL_PACK_SKIP_PIXELS, newctx->gl_pack_skip_pixels[0]))
2170                 }
2171                 STATE_COMPARE(gl_pack_alignment[0])
2172                 {
2173                         CHECK_GL_ERROR(_orig_fastpath_glPixelStorei(GL_PACK_ALIGNMENT, newctx->gl_pack_alignment[0]))
2174                 }
2175         }
2176
2177         // _pixel_flag2
2178         flag = oldctx->_pixel_flag2 | newctx->_pixel_flag2;
2179         if (flag)
2180         {
2181                 STATE_COMPARE(gl_unpack_row_length[0])
2182                 {
2183                         CHECK_GL_ERROR(_orig_fastpath_glPixelStorei(GL_UNPACK_ROW_LENGTH, newctx->gl_unpack_row_length[0]))
2184                 }
2185                 STATE_COMPARE(gl_unpack_skip_rows[0])
2186                 {
2187                         CHECK_GL_ERROR(_orig_fastpath_glPixelStorei(GL_UNPACK_SKIP_ROWS, newctx->gl_unpack_skip_rows[0]))
2188                 }
2189                 STATE_COMPARE(gl_unpack_skip_pixels[0])
2190                 {
2191                         CHECK_GL_ERROR(_orig_fastpath_glPixelStorei(GL_UNPACK_SKIP_PIXELS, newctx->gl_unpack_skip_pixels[0]))
2192                 }
2193                 STATE_COMPARE(gl_unpack_alignment[0])
2194                 {
2195                         CHECK_GL_ERROR(_orig_fastpath_glPixelStorei(GL_UNPACK_ALIGNMENT, newctx->gl_unpack_alignment[0]))
2196                 }
2197                 STATE_COMPARE(gl_unpack_image_height[0])
2198                 {
2199                         CHECK_GL_ERROR(_orig_fastpath_glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, newctx->gl_unpack_image_height[0]))
2200                 }
2201                 STATE_COMPARE(gl_unpack_skip_images[0])
2202                 {
2203                         CHECK_GL_ERROR(_orig_fastpath_glPixelStorei(GL_UNPACK_SKIP_IMAGES, newctx->gl_unpack_skip_images[0]))
2204                 }
2205         }
2206
2207         //------------------//
2208         // _misc_flag1
2209         flag = oldctx->_misc_flag1 | newctx->_misc_flag1;
2210         if (flag)
2211         {
2212                 STATE_COMPARE(gl_front_face[0])
2213                 {
2214                         CHECK_GL_ERROR(_orig_fastpath_glFrontFace(newctx->gl_front_face[0]))
2215                 }
2216                 STATE_COMPARE(gl_line_width[0])
2217                 {
2218                         CHECK_GL_ERROR(_orig_fastpath_glLineWidth(newctx->gl_line_width[0]))
2219                 }
2220                 if ((oldctx->gl_polygon_offset_factor[0] != newctx->gl_polygon_offset_factor[0]) ||
2221                     (oldctx->gl_polygon_offset_units[0]  != newctx->gl_polygon_offset_units[0]))
2222                 {
2223                         CHECK_GL_ERROR(_orig_fastpath_glPolygonOffset(newctx->gl_polygon_offset_factor[0],
2224                                        newctx->gl_polygon_offset_units[0]))
2225                 }
2226                 if ((oldctx->gl_sample_coverage_value[0]  != newctx->gl_sample_coverage_value[0]) ||
2227                     (oldctx->gl_sample_coverage_invert[0] != newctx->gl_sample_coverage_invert[0]))
2228                 {
2229                         CHECK_GL_ERROR(_orig_fastpath_glSampleCoverage(newctx->gl_sample_coverage_value[0],
2230                                        newctx->gl_sample_coverage_invert[0]))
2231                 }
2232                 STATE_COMPARE(gl_fragment_shader_derivative_hint[0])
2233                 {
2234                         CHECK_GL_ERROR(_orig_fastpath_glHint(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES, newctx->gl_fragment_shader_derivative_hint[0]))
2235                 }
2236         }
2237
2238         // _misc_flag2
2239         flag = oldctx->_misc_flag2 | newctx->_misc_flag2;
2240         if (flag)
2241         {
2242                 STATES_COMPARE(gl_scissor_box, 4 * sizeof(GLint))
2243                 {
2244                         CHECK_GL_ERROR(_orig_fastpath_glScissor(newctx->gl_scissor_box[0],
2245                                                                 newctx->gl_scissor_box[1],
2246                                                                 newctx->gl_scissor_box[2],
2247                                                                 newctx->gl_scissor_box[3]))
2248                 }
2249         }
2250
2251         // _misc_flag3
2252         flag = oldctx->_misc_flag3 | newctx->_misc_flag3;
2253         if (flag)
2254         {
2255                 STATE_COMPARE(gl_read_buffer[0])
2256                 {
2257                         CHECK_GL_ERROR(_orig_fastpath_glReadBuffer(newctx->gl_read_buffer[0]))
2258                 }
2259                 STATES_COMPARE(gl_draw_buffers, 16 * sizeof(GLenum))
2260                 {
2261                         int drawBuffSize = 16;
2262                         /* If the  context has only default framebuffer, then size of glDrawBuffers can only be 1 */
2263                         if(fastpath_ostate_has_object_type(&newctx->ostate, GL_OBJECT_TYPE_FRAMEBUFFER) == 0) {
2264                                 drawBuffSize = 1;
2265                         }
2266
2267                         CHECK_GL_ERROR(_orig_fastpath_glDrawBuffers(drawBuffSize, newctx->gl_draw_buffers))
2268                 }
2269
2270                 if (oldctx->gl_transform_feedback_active[0] == GL_TRUE && oldctx->gl_transform_feedback_paused[0] == GL_FALSE)
2271                 {
2272                         CHECK_GL_ERROR(_orig_fastpath_glPauseTransformFeedback())
2273                 }
2274                 STATE_COMPARE(gl_transform_feedback_binding[0])
2275                 {
2276                         CHECK_GL_ERROR(_orig_fastpath_glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, newctx->gl_transform_feedback_binding[0]))
2277                 }
2278                 if (newctx->gl_transform_feedback_active[0] == GL_TRUE && newctx->gl_transform_feedback_paused[0] == GL_FALSE)
2279                 {
2280                         CHECK_GL_ERROR(_orig_fastpath_glResumeTransformFeedback())
2281                 }
2282         }
2283
2284 #ifdef COREGL_USE_MODULE_TRACEPATH
2285         tracepath_api_trace_end("eglMakeCurrent(FP etc.)", trace_hint_etc, 0);
2286 #endif // COREGL_USE_MODULE_TRACEPATH
2287
2288         ret = 1;
2289         goto finish;
2290
2291 finish:
2292
2293 #ifdef COREGL_FASTPATH_TRACE_STATE_INFO
2294         if (unlikely(trace_state_flag == 1))
2295                 fastpath_dump_context_states(newctx, 0);
2296 #endif // COREGL_FASTPATH_TRACE_STATE_INFO
2297         return ret;
2298 #undef STATE_COMPARE
2299 #undef STATES_COMPARE
2300 }
2301