1 #include "coregl_fastpath.h"
10 #define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST) RET_TYPE (*_orig_fastpath_##FUNC_NAME) PARAM_LIST = NULL;
11 #include "../../headers/sym.h"
14 Fastpath_Opt_Flag fp_opt = FP_UNKNOWN_PATH;
17 FILE *trace_fp = NULL;
19 GLenum FPGL_Error = GL_NO_ERROR;
21 GLGlueContext_List *gctx_list = NULL;
23 Mutex init_context_mutex = MUTEX_INITIALIZER;
24 GLGlueContext *initial_ctx = NULL;
26 Mutex ctx_list_access_mutex = MUTEX_INITIALIZER;
28 GLContext_List *glctx_list = NULL;
31 _get_texture_states(GLenum pname, GLint *params)
33 GLuint cur_active_tex = 0;
35 AST(initial_ctx != NULL);
37 _orig_fastpath_glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint *)&cur_active_tex);
39 for (i = 0; i < initial_ctx->gl_num_tex_units[0]; i++)
41 _orig_fastpath_glActiveTexture(GL_TEXTURE0 + i);
42 _orig_fastpath_glGetIntegerv(pname, &(((GLint *)params)[i]));
44 _orig_fastpath_glActiveTexture(cur_active_tex);
48 _get_stencil_max_mask()
50 GLuint stencil_bit = 0;
52 _orig_fastpath_glGetIntegerv(GL_STENCIL_BITS, (GLint *)&stencil_bit);
53 return (1 << stencil_bit) - 1;
57 init_modules_fastpath()
60 int fastpath_force_off_opt = 0;
62 LOG("[CoreGL] <Fastpath> : ");
64 fastpath_opt = atoi(get_env_setting("COREGL_FASTPATH"));
65 fastpath_force_off_opt = atoi(get_env_setting("COREGL_FASTPATH_FORCE_OFF"));
67 if (fastpath_force_off_opt == 1)
69 LOG("\E[0;31;1m(DISABLED by force option)\E[0m ");
76 LOG("(%d) Fastpath enabled...\n", fastpath_opt);
77 fp_opt = FP_FAST_PATH;
80 LOG("(%d) Default API path enabled...\n", fastpath_opt);
81 fp_opt = FP_NORMAL_PATH;
85 debug_nofp = atoi(get_env_setting("COREGL_DEBUG_NOFP"));
90 deinit_modules_fastpath()
92 GLContext_List *current = NULL;
94 AST(mutex_lock(&ctx_list_access_mutex) == 1);
96 // Destroy remained context & Detect leaks
97 int retry_destroy = 0;
102 current = glctx_list;
105 if (current->cstate != NULL)
107 ERR("\E[0;31;1mWARNING : Context attached to [dpy=%p|rctx=%p] has not been completely destroyed.(leak)\E[0m\n", current->cstate->rdpy, current->cstate->rctx);
109 _orig_fastpath_eglMakeCurrent(current->cstate->rdpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
110 _orig_fastpath_eglDestroyContext(current->cstate->rdpy, current->cstate->rctx);
112 fastpath_remove_context_states_from_list(current->cstate, NULL);
117 glctx_list = current->next;
119 current = glctx_list;
121 if (retry_destroy == 0) break;
126 AST(mutex_unlock(&ctx_list_access_mutex) == 1);
130 init_modules_tstate_fastpath(GLThreadState *tstate)
132 MY_MODULE_TSTATE *tstate_mt = NULL;
134 tstate_mt = (MY_MODULE_TSTATE *)calloc(1, sizeof(MY_MODULE_TSTATE));
136 tstate_mt->binded_api = EGL_OPENGL_ES_API;
138 tstate->module_data[MY_MODULE_ID] = tstate_mt;
142 deinit_modules_tstate_fastpath(GLThreadState *tstate)
144 if (tstate->module_data[MY_MODULE_ID] != NULL)
146 free(tstate->module_data[MY_MODULE_ID]);
147 tstate->module_data[MY_MODULE_ID] = NULL;
152 fastpath_apply_overrides()
157 fastpath_apply_overrides_egl(1);
158 fastpath_apply_overrides_gl(1);
163 ERR("Invalide GL Override Option!!!\n");
170 fastpath_apply_overrides_egl(int enable)
172 #define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST) COREGL_INIT_ORIGINAL(_orig_fastpath_, FUNC_NAME);
173 # include "../../headers/sym_egl.h"
174 #undef _COREGL_SYMBOL
176 COREGL_OVERRIDE(fastpath_, eglGetProcAddress);
178 COREGL_OVERRIDE(fastpath_, eglBindAPI);
179 COREGL_OVERRIDE(fastpath_, eglQueryAPI);
181 COREGL_OVERRIDE(fastpath_, eglCreateContext);
182 COREGL_OVERRIDE(fastpath_, eglCreateImageKHR);
183 COREGL_OVERRIDE(fastpath_, eglMakeCurrent);
184 COREGL_OVERRIDE(fastpath_, eglDestroyContext);
185 COREGL_OVERRIDE(fastpath_, eglQueryContext);
186 COREGL_OVERRIDE(fastpath_, eglGetCurrentContext);
187 COREGL_OVERRIDE(fastpath_, eglReleaseThread);
188 COREGL_OVERRIDE(fastpath_, eglGetCurrentSurface);
189 COREGL_OVERRIDE(fastpath_, eglTerminate);
194 fastpath_apply_overrides_gl(int enable)
196 #define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST) COREGL_INIT_ORIGINAL(_orig_fastpath_, FUNC_NAME);
197 # include "../../headers/sym_gl.h"
198 #undef _COREGL_SYMBOL
202 COREGL_OVERRIDE(fastpath_, glGetError);
204 COREGL_OVERRIDE(fastpath_, glGetIntegerv);
205 COREGL_OVERRIDE(fastpath_, glGetFloatv);
206 COREGL_OVERRIDE(fastpath_, glGetBooleanv);
208 COREGL_OVERRIDE(fastpath_, glActiveTexture);
209 COREGL_OVERRIDE(fastpath_, glGenTextures);
210 COREGL_OVERRIDE(fastpath_, glBindTexture);
211 COREGL_OVERRIDE(fastpath_, glIsTexture);
212 COREGL_OVERRIDE(fastpath_, glDeleteTextures);
213 COREGL_OVERRIDE(fastpath_, glFramebufferTexture2D);
215 COREGL_OVERRIDE(fastpath_, glGenBuffers);
216 COREGL_OVERRIDE(fastpath_, glBindBuffer);
217 COREGL_OVERRIDE(fastpath_, glIsBuffer);
218 COREGL_OVERRIDE(fastpath_, glDeleteBuffers);
220 COREGL_OVERRIDE(fastpath_, glGenFramebuffers);
221 COREGL_OVERRIDE(fastpath_, glBindFramebuffer);
222 COREGL_OVERRIDE(fastpath_, glIsFramebuffer);
223 COREGL_OVERRIDE(fastpath_, glDeleteFramebuffers);
225 COREGL_OVERRIDE(fastpath_, glGenRenderbuffers);
226 COREGL_OVERRIDE(fastpath_, glBindRenderbuffer);
227 COREGL_OVERRIDE(fastpath_, glFramebufferRenderbuffer);
228 COREGL_OVERRIDE(fastpath_, glIsRenderbuffer);
229 COREGL_OVERRIDE(fastpath_, glDeleteRenderbuffers);
231 COREGL_OVERRIDE(fastpath_, glCreateShader);
232 COREGL_OVERRIDE(fastpath_, glCreateProgram);
233 COREGL_OVERRIDE(fastpath_, glAttachShader);
234 COREGL_OVERRIDE(fastpath_, glCompileShader);
235 COREGL_OVERRIDE(fastpath_, glShaderBinary);
236 COREGL_OVERRIDE(fastpath_, glDeleteShader);
237 COREGL_OVERRIDE(fastpath_, glDetachShader);
238 COREGL_OVERRIDE(fastpath_, glGetShaderiv);
239 COREGL_OVERRIDE(fastpath_, glGetShaderInfoLog);
240 COREGL_OVERRIDE(fastpath_, glGetShaderSource);
241 COREGL_OVERRIDE(fastpath_, glIsShader);
242 COREGL_OVERRIDE(fastpath_, glShaderSource);
243 COREGL_OVERRIDE(fastpath_, glBindAttribLocation);
244 COREGL_OVERRIDE(fastpath_, glDeleteProgram);
245 COREGL_OVERRIDE(fastpath_, glGetActiveAttrib);
246 COREGL_OVERRIDE(fastpath_, glGetActiveUniform);
247 COREGL_OVERRIDE(fastpath_, glGetAttachedShaders);
248 COREGL_OVERRIDE(fastpath_, glGetAttribLocation);
249 COREGL_OVERRIDE(fastpath_, glGetProgramiv);
250 COREGL_OVERRIDE(fastpath_, glGetProgramInfoLog);
251 COREGL_OVERRIDE(fastpath_, glGetUniformfv);
252 COREGL_OVERRIDE(fastpath_, glGetUniformiv);
253 COREGL_OVERRIDE(fastpath_, glGetUniformLocation);
254 COREGL_OVERRIDE(fastpath_, glIsProgram);
255 COREGL_OVERRIDE(fastpath_, glLinkProgram);
256 COREGL_OVERRIDE(fastpath_, glUseProgram);
257 COREGL_OVERRIDE(fastpath_, glValidateProgram);
259 COREGL_OVERRIDE(fastpath_, glBlendColor);
260 COREGL_OVERRIDE(fastpath_, glBlendEquation);
261 COREGL_OVERRIDE(fastpath_, glBlendEquationSeparate);
262 COREGL_OVERRIDE(fastpath_, glBlendFunc);
263 COREGL_OVERRIDE(fastpath_, glBlendFuncSeparate);
264 COREGL_OVERRIDE(fastpath_, glClearColor);
265 COREGL_OVERRIDE(fastpath_, glClearDepthf);
266 COREGL_OVERRIDE(fastpath_, glClearStencil);
267 COREGL_OVERRIDE(fastpath_, glColorMask);
268 COREGL_OVERRIDE(fastpath_, glCullFace);
269 COREGL_OVERRIDE(fastpath_, glDepthFunc);
270 COREGL_OVERRIDE(fastpath_, glDepthMask);
271 COREGL_OVERRIDE(fastpath_, glDepthRangef);
272 COREGL_OVERRIDE(fastpath_, glDisable);
273 COREGL_OVERRIDE(fastpath_, glDisableVertexAttribArray);
274 COREGL_OVERRIDE(fastpath_, glEnable);
275 COREGL_OVERRIDE(fastpath_, glEnableVertexAttribArray);
276 COREGL_OVERRIDE(fastpath_, glFrontFace);
277 COREGL_OVERRIDE(fastpath_, glHint);
278 COREGL_OVERRIDE(fastpath_, glLineWidth);
279 COREGL_OVERRIDE(fastpath_, glPixelStorei);
280 COREGL_OVERRIDE(fastpath_, glPolygonOffset);
281 COREGL_OVERRIDE(fastpath_, glSampleCoverage);
282 COREGL_OVERRIDE(fastpath_, glScissor);
283 COREGL_OVERRIDE(fastpath_, glStencilFunc);
284 COREGL_OVERRIDE(fastpath_, glStencilFuncSeparate);
285 COREGL_OVERRIDE(fastpath_, glStencilMask);
286 COREGL_OVERRIDE(fastpath_, glStencilMaskSeparate);
287 COREGL_OVERRIDE(fastpath_, glStencilOp);
288 COREGL_OVERRIDE(fastpath_, glStencilOpSeparate);
289 COREGL_OVERRIDE(fastpath_, glVertexAttrib1f);
290 COREGL_OVERRIDE(fastpath_, glVertexAttrib1fv);
291 COREGL_OVERRIDE(fastpath_, glVertexAttrib2f);
292 COREGL_OVERRIDE(fastpath_, glVertexAttrib2fv);
293 COREGL_OVERRIDE(fastpath_, glVertexAttrib3f);
294 COREGL_OVERRIDE(fastpath_, glVertexAttrib3fv);
295 COREGL_OVERRIDE(fastpath_, glVertexAttrib4f);
296 COREGL_OVERRIDE(fastpath_, glVertexAttrib4fv);
297 COREGL_OVERRIDE(fastpath_, glVertexAttribPointer);
298 COREGL_OVERRIDE(fastpath_, glViewport);
300 COREGL_OVERRIDE(fastpath_, glFramebufferTexture2DMultisampleEXT);
301 COREGL_OVERRIDE(fastpath_, glGetProgramBinaryOES);
302 COREGL_OVERRIDE(fastpath_, glProgramBinaryOES);
303 COREGL_OVERRIDE(fastpath_, glProgramParameteriEXT);
304 COREGL_OVERRIDE(fastpath_, glEGLImageTargetTexture2DOES);
309 LOG("\E[0;35;1m[CoreGL] SKIP GL FASTPATH...\E[0m\n");
315 static inline GL_Object_Hash_Base *
316 _get_shared_object_hash(GL_Shared_Object_State *sostate, GL_Object_Type type)
320 case GL_OBJECT_TYPE_TEXTURE:
321 return &sostate->texture;
322 case GL_OBJECT_TYPE_BUFFER:
323 return &sostate->buffer;
324 case GL_OBJECT_TYPE_FRAMEBUFFER:
325 return &sostate->framebuffer;
326 case GL_OBJECT_TYPE_RENDERBUFFER:
327 return &sostate->renderbuffer;
328 case GL_OBJECT_TYPE_PROGRAM:
329 return &sostate->program;
335 static inline GL_Object_Hash_Base *
336 _get_shared_object_hash_real(GL_Shared_Object_State *sostate, GL_Object_Type type)
340 case GL_OBJECT_TYPE_TEXTURE:
341 return &sostate->texture_real;
342 case GL_OBJECT_TYPE_BUFFER:
343 return &sostate->buffer_real;
344 case GL_OBJECT_TYPE_FRAMEBUFFER:
345 return &sostate->framebuffer_real;
346 case GL_OBJECT_TYPE_RENDERBUFFER:
347 return &sostate->renderbuffer_real;
348 case GL_OBJECT_TYPE_PROGRAM:
349 return &sostate->program_real;
356 fastpath_add_context_state_to_list(const void *option, const int option_len, GLContextState *cstate, Mutex *mtx)
360 GLContext_List *current = NULL;
361 GLContext_List *newitm = NULL;
363 if (mtx != NULL) AST(mutex_lock(mtx) == 1);
367 tid = get_current_thread();
369 current = glctx_list;
370 while (current != NULL)
372 if (current->option_len == option_len &&
373 memcmp(current->option, option, option_len) == 0 &&
374 current->thread_id == tid)
376 AST(current->cstate == cstate);
379 current = current->next;
382 newitm = (GLContext_List *)calloc(1, sizeof(GLContext_List));
385 ERR("Failed to create context list.\n");
389 newitm->cstate = cstate;
390 newitm->thread_id = tid;
391 newitm->option_len = option_len;
392 newitm->option = (void *)malloc(option_len);
393 memcpy(newitm->option, option, option_len);
395 if (glctx_list != NULL)
396 newitm->next = glctx_list;
417 if (mtx != NULL) AST(mutex_unlock(mtx) == 1);
423 fastpath_get_context_state_from_list(const void *option, const int option_len, Mutex *mtx)
425 GLContextState *ret = NULL;
426 GLContext_List *current = NULL;
429 if (mtx != NULL) AST(mutex_lock(mtx) == 1);
431 tid = get_current_thread();
433 current = glctx_list;
434 while (current != NULL)
436 if (current->option_len == option_len &&
437 memcmp(current->option, option, option_len) == 0 &&
438 current->thread_id == tid)
440 ret = current->cstate;
443 current = current->next;
448 if (mtx != NULL) AST(mutex_unlock(mtx) == 1);
453 fastpath_remove_context_states_from_list(GLContextState *cstate, Mutex *mtx)
457 GLContext_List *olditm = NULL;
458 GLContext_List *current = NULL;
460 if (mtx != NULL) AST(mutex_lock(mtx) == 1);
464 tid = get_current_thread();
465 current = glctx_list;
467 while (current != NULL)
469 if (current->cstate == cstate)
471 GLContext_List *nextitm = NULL;
474 olditm->next = current->next;
475 nextitm = olditm->next;
479 glctx_list = current->next;
480 nextitm = glctx_list;
488 current = current->next;
493 if (mtx != NULL) AST(mutex_unlock(mtx) == 1);
498 fastpath_sostate_init(GL_Shared_Object_State *sostate)
500 #define HASH_INIT(hash_base) \
501 hash_base.hash_field = (GL_Object_Hash **)calloc(1, sizeof(GL_Object_Hash *) * GL_OBJECT_HASH_BASE); \
502 hash_base.hash_size = GL_OBJECT_HASH_BASE;
504 HASH_INIT(sostate->texture);
505 HASH_INIT(sostate->buffer);
506 HASH_INIT(sostate->framebuffer);
507 HASH_INIT(sostate->renderbuffer);
508 HASH_INIT(sostate->program);
510 HASH_INIT(sostate->texture_real);
511 HASH_INIT(sostate->buffer_real);
512 HASH_INIT(sostate->framebuffer_real);
513 HASH_INIT(sostate->renderbuffer_real);
514 HASH_INIT(sostate->program_real);
520 _add_hash(GL_Object_Hash_Base *hash_base, GL_Object_Hash *data)
522 int array_idx = data->hash_key & (hash_base->hash_size - 1);
523 if (hash_base->hash_field[array_idx] == NULL)
525 hash_base->hash_field[array_idx] = data;
529 GL_Object_Hash *current = hash_base->hash_field[array_idx];
532 AST(current->hash_key != data->hash_key);
533 current = current->next;
535 current->next = data;
538 hash_base->item_size++;
542 _remove_hash(GL_Object_Hash_Base *hash_base, GLuint hash)
545 int array_idx = hash & (hash_base->hash_size - 1);
547 GL_Object_Hash *current = hash_base->hash_field[array_idx];
548 GL_Object_Hash *prev = NULL;
552 if (current->hash_key == hash)
555 prev->next = current->next;
557 hash_base->hash_field[array_idx] = current->next;
558 hash_base->item_size--;
563 current = current->next;
570 _free_hash_list(GL_Object_Hash_Base *hash_base, int free_data)
572 if (hash_base->item_size == 0) return;
574 for (int i = 0; i < hash_base->hash_size; i++)
576 if (hash_base->hash_field[i] != NULL)
578 GL_Object_Hash *current = hash_base->hash_field[i];
580 while (current != NULL)
582 GL_Object_Hash *current_next = current->next;
584 if (free_data == 1 && current->item != NULL)
590 hash_base->item_size--;
591 current = current_next;
598 fastpath_sostate_deinit(GL_Shared_Object_State *sostate)
600 #define HASH_DEINIT(hash_base, free_data) \
601 _free_hash_list(&hash_base, free_data); \
602 free(hash_base.hash_field); \
603 hash_base.hash_size = 0;
605 HASH_DEINIT(sostate->texture, 1);
606 HASH_DEINIT(sostate->buffer, 1);
607 HASH_DEINIT(sostate->framebuffer, 1);
608 HASH_DEINIT(sostate->renderbuffer, 1);
609 HASH_DEINIT(sostate->program, 1);
611 HASH_DEINIT(sostate->texture_real, 0);
612 HASH_DEINIT(sostate->buffer_real, 0);
613 HASH_DEINIT(sostate->framebuffer_real, 0);
614 HASH_DEINIT(sostate->renderbuffer_real, 0);
615 HASH_DEINIT(sostate->program_real, 0);
620 #define FIND_HASH(hash_base, key, ret) \
622 GL_Object_Hash *fh_current = hash_base->hash_field[(key) & (hash_base->hash_size - 1)]; \
625 if (fh_current->hash_key == (key)) \
630 fh_current = fh_current->next; \
635 _sostate_hash_check(GL_Object_Hash_Base *hash_base)
637 if (hash_base->item_size + 1 < hash_base->hash_size)
640 int oldsize = hash_base->hash_size;
641 GL_Object_Hash **oldfield = hash_base->hash_field;
643 hash_base->hash_size = oldsize << 1;
644 hash_base->hash_field = (GL_Object_Hash **)calloc(1, sizeof(GL_Object_Hash *) * hash_base->hash_size);
645 AST(hash_base->hash_field != NULL);
647 for (int i = 0; i < oldsize; i++)
649 if (oldfield[i] != NULL)
651 GL_Object_Hash *current = oldfield[i];
653 while (current != NULL)
655 GL_Object_Hash *current_next = current->next;
656 _add_hash(hash_base, current);
657 hash_base->item_size--;
658 current = current_next;
667 fastpath_sostate_create_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint real_name)
669 GLuint ret = _COREGL_INT_INIT_VALUE;
671 GL_Object_Hash_Base *hash_base = NULL;
672 GL_Object_Hash_Base *hash_base_real = NULL;
673 int newid = _COREGL_INT_INIT_VALUE;
675 hash_base = _get_shared_object_hash(sostate, type);
676 hash_base_real = _get_shared_object_hash_real(sostate, type);
678 newid = hash_base->last_id + 1;
679 if (newid >= hash_base->hash_size)
681 hash_base->is_looped = 1;
683 hash_base->last_id = 1;
686 if (hash_base->is_looped != 0)
689 int findingid = newid;
691 for (i = 0; i < hash_base->hash_size; i++)
693 GL_Object_Hash *exist_hash = NULL;
694 FIND_HASH(hash_base, findingid, exist_hash);
695 if (exist_hash == NULL)
701 if (findingid >= hash_base->hash_size) findingid = 1;
705 hash_base->last_id = newid;
708 GL_Object *newobj = (GL_Object *)calloc(1, sizeof(GL_Object));
710 newobj->id = (int)type + newid;
711 newobj->real_id = real_name;
712 newobj->ref_count = 1;
715 GL_Object_Hash *newobj_hash = (GL_Object_Hash *)calloc(1, sizeof(GL_Object_Hash));
716 AST(newobj_hash != NULL);
717 newobj_hash->item = newobj;
718 newobj_hash->hash_key = newid;
719 _add_hash(hash_base, newobj_hash);
721 GL_Object_Hash *newobj_hash_real = (GL_Object_Hash *)calloc(1, sizeof(GL_Object_Hash));
722 AST(newobj_hash_real != NULL);
723 newobj_hash_real->item = newobj;
724 newobj_hash_real->hash_key = real_name;
725 _add_hash(hash_base_real, newobj_hash_real);
728 _sostate_hash_check(hash_base);
729 _sostate_hash_check(hash_base_real);
737 #define FIND_OBJ_FROM_HASH_WITH_VERIFY(hash_base, hash, object) \
738 if ((hash) < 0) { ret = 0; goto finish; } \
740 GL_Object_Hash *object_hash = NULL; \
741 FIND_HASH((hash_base), (hash), object_hash); \
742 if (object_hash == NULL) { ret = 0; goto finish; } \
743 (object) = object_hash->item; \
744 if ((object) == NULL) { ret = 0; goto finish; } \
748 fastpath_sostate_remove_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint glue_name)
750 GLuint ret = _COREGL_INT_INIT_VALUE;
752 GL_Object_Hash_Base *hash_base = NULL;
753 GL_Object_Hash_Base *hash_base_real = NULL;
754 GL_Object *object = NULL;
756 hash_base = _get_shared_object_hash(sostate, type);
757 hash_base_real = _get_shared_object_hash_real(sostate, type);
759 FIND_OBJ_FROM_HASH_WITH_VERIFY(hash_base, glue_name - (int)type, object);
763 if (object->ref_count <= 0)
765 GL_Object_Hash *object_hash = NULL;
767 FIND_HASH(hash_base, object->id - (int)type, object_hash);
768 AST(object_hash != NULL);
769 _remove_hash(hash_base, object->id - (int)type);
773 FIND_HASH(hash_base_real, object->real_id, object_hash);
774 AST(object_hash != NULL);
775 _remove_hash(hash_base_real, object->real_id);
791 fastpath_sostate_get_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint glue_name)
793 GLuint ret = _COREGL_INT_INIT_VALUE;
795 GL_Object_Hash_Base *hash_base = NULL;
796 GL_Object *object = NULL;
798 hash_base = _get_shared_object_hash(sostate, type);
800 FIND_OBJ_FROM_HASH_WITH_VERIFY(hash_base, glue_name - (int)type, object);
802 ret = object->real_id;
810 fastpath_sostate_set_object_tag(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint glue_name, GLvoid *tag)
812 GLint ret = _COREGL_INT_INIT_VALUE;
814 GL_Object_Hash_Base *hash_base = NULL;
815 GL_Object *object = NULL;
816 int hash = _COREGL_INT_INIT_VALUE;
818 hash_base = _get_shared_object_hash(sostate, type);
820 hash = glue_name - (int)type;
822 FIND_OBJ_FROM_HASH_WITH_VERIFY(hash_base, hash, object);
833 fastpath_sostate_get_object_tag(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint glue_name)
837 GL_Object_Hash_Base *hash_base = NULL;
838 GL_Object *object = NULL;
840 hash_base = _get_shared_object_hash(sostate, type);
842 FIND_OBJ_FROM_HASH_WITH_VERIFY(hash_base, glue_name - (int)type, object);
852 fastpath_sostate_find_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint real_name)
854 GLuint ret = _COREGL_INT_INIT_VALUE;
856 GL_Object_Hash_Base *hash_base_real = NULL;
857 GL_Object *object = NULL;
859 hash_base_real = _get_shared_object_hash_real(sostate, type);
861 FIND_OBJ_FROM_HASH_WITH_VERIFY(hash_base_real, real_name, object);
871 fastpath_sostate_use_object(GL_Shared_Object_State *sostate, GL_Object_Type type, GLuint glue_name)
873 GLint ret = _COREGL_INT_INIT_VALUE;
875 GL_Object_Hash_Base *hash_base = NULL;
876 GL_Object *object = NULL;
878 hash_base = _get_shared_object_hash(sostate, type);
880 FIND_OBJ_FROM_HASH_WITH_VERIFY(hash_base, glue_name - (int)type, object);
891 fastpath_dump_context_states(GLGlueContext *ctx, int force_output)
893 static struct timeval tv_last = { 0, 0 };
895 if (unlikely(trace_state_flag != 1)) return;
899 struct timeval tv_now = { 0, 0 };
900 AST(gettimeofday(&tv_now, NULL) == 0);
901 if (tv_now.tv_sec - tv_last.tv_sec < _COREGL_TRACE_OUTPUT_INTERVAL_SEC)
909 TRACE("\E[0;40;34m========================================================================================================================\E[0m\n");
910 TRACE("\E[0;32;1m State info \E[1;37;1m: <PID = %d> GlueCTX = %p\E[0m\n", getpid(), ctx);
911 TRACE("\E[0;40;34m========================================================================================================================\E[0m\n");
913 #define PRINTF_CHAR_GLenum "%10d"
914 #define PRINTF_CHAR_GLboolean "%10d"
915 #define PRINTF_CHAR_GLint "%10d"
916 #define PRINTF_CHAR_GLsizei "%10u"
917 #define PRINTF_CHAR_GLuint "%10u"
918 #define PRINTF_CHAR_GLuintmask "0x%8X"
920 #define PRINTF_CHAR_GLclampf "%10.6f"
921 #define PRINTF_CHAR_GLfloat "%10.6f"
923 #define PRINTF_CHAR_GLvoidptr "%10p"
925 #define PRINTF_CHAR(type) PRINTF_CHAR_##type
927 #define INITIAL_CTX initial_ctx
928 #define GLUE_STATE(TYPE, NAME, SIZE, ARRAY_SIZE, DEFAULT_STMT, GET_STMT) \
930 TYPE valuedata[SIZE]; \
931 TYPE *value = NULL; \
932 value = valuedata; GET_STMT; value = valuedata; \
933 TRACE("\E[0;37;1m %-30.30s : (\E[0m ", #NAME); \
934 for (int i = 0; i < SIZE; i++) \
938 TRACE("\n %-30.30s ", "");\
942 TRACE(PRINTF_CHAR(TYPE), ctx->NAME[i]); \
943 TRACE("["PRINTF_CHAR(TYPE)"]", value[i]); \
945 TRACE(" \E[0;37;1m)\E[0m\n"); \
947 # include "coregl_fastpath_state.h"
951 TRACE("\E[0;40;34m========================================================================================================================\E[0m\n");
961 fastpath_init_context_states(GLGlueContext *ctx)
965 AST(mutex_lock(&init_context_mutex) == 1);
969 ERR("Context NULL\n");
974 AST(ctx->initialized == 0);
975 AST(ctx->sostate != NULL);
977 if (initial_ctx == NULL)
979 initial_ctx = (GLGlueContext *)calloc(1, sizeof(GLGlueContext));
980 AST(initial_ctx != NULL);
982 //#define FORCE_DEFAULT_VALUE
983 #ifdef FORCE_DEFAULT_VALUE
984 # define INITIAL_CTX initial_ctx
985 # define GLUE_STATE(TYPE, NAME, SIZE, ARRAY_SIZE, DEFAULT_STMT, GET_STMT) \
988 TYPE valuedata[SIZE]; \
989 TYPE *value = NULL; \
990 memset(valuedata, 0xcc, sizeof(TYPE) * SIZE); \
991 value = valuedata; DEFAULT_STMT; value = valuedata; \
992 for (i = 0; i < SIZE; i++) \
994 if (*((char *)(&value[i])) == 0xcc) \
996 memset(&value[i], 0xaa, sizeof(TYPE)); \
997 value = valuedata; DEFAULT_STMT; value = valuedata; \
998 if (*((char *)(&value[i])) == 0xaa) \
1000 ERR("\E[0;31;1mWARNING : GL-state '"#NAME"' cannot be retrieved\E[0m\n"); \
1004 initial_ctx->NAME[i] = value[i]; \
1007 # include "coregl_fastpath_state.h"
1011 # define INITIAL_CTX initial_ctx
1012 # define SET_GLUE_VALUE(DEFAULT_STMT, FALLBACK_STMT) \
1013 if (try_step == 1) \
1015 value = valuedata; DEFAULT_STMT; value = valuedata; \
1019 value = valuedata; FALLBACK_STMT; value = valuedata; \
1022 # define GLUE_STATE(TYPE, NAME, SIZE, ARRAY_SIZE, DEFAULT_STMT, GET_STMT) \
1026 TYPE valuedata[SIZE]; \
1027 TYPE *value = NULL; \
1028 memset(valuedata, 0xcc, sizeof(TYPE) * SIZE); \
1031 SET_GLUE_VALUE(GET_STMT, DEFAULT_STMT); \
1032 for (i = 0; i < SIZE; i++) \
1034 if (*((char *)(&value[i])) == 0xcc) \
1036 memset(&value[i], 0xaa, sizeof(TYPE)); \
1037 SET_GLUE_VALUE(GET_STMT, DEFAULT_STMT); \
1038 if (*((char *)(&value[i])) == 0xaa) \
1041 if (try_step == 2) \
1043 ERR("\E[0;31;1mWARNING : GL-state '"#NAME"' cannot be retrieved\E[0m\n"); \
1048 initial_ctx->NAME[i] = value[i]; \
1050 if (try_step != 2) \
1052 value = valuedata; DEFAULT_STMT; value = valuedata; \
1053 for (i = 0; i < SIZE; i++) \
1055 if (initial_ctx->NAME[i] != value[i]) \
1057 ERR("WARNING : GL-state '"#NAME"'[%d] value ["PRINTF_CHAR(TYPE)"] is different from SPEC-DEFAULT ["PRINTF_CHAR(TYPE)"]\n", i, ctx->NAME[i], value[i]); \
1062 while (try_step == 2); \
1064 # include "coregl_fastpath_state.h"
1065 # undef SET_GLUE_VALUE
1070 if (initial_ctx->gl_num_vertex_attribs[0] > MAX_VERTEX_ATTRIBS)
1072 ERR("\E[0;31;1mWARNING : Number of vertex attrib is too big! (%d-%d)\E[0m\n", MAX_VERTEX_ATTRIBS, initial_ctx->gl_num_vertex_attribs[0]);
1074 if (initial_ctx->gl_num_tex_units[0] > MAX_TEXTURE_UNITS)
1076 ERR("\E[0;31;1mWARNING : Number of texture unit is too big! (%d-%d)\E[0m\n", MAX_TEXTURE_UNITS, initial_ctx->gl_num_tex_units[0]);
1082 #define INITIAL_CTX initial_ctx
1083 #define GLUE_STATE(TYPE, NAME, SIZE, ARRAY_SIZE, DEFAULT_STMT, GET_STMT) \
1084 for (i = 0; i < SIZE; i++) \
1086 ctx->NAME[i] = initial_ctx->NAME[i]; \
1088 # include "coregl_fastpath_state.h"
1093 ctx->initialized = 1;
1098 AST(mutex_unlock(&init_context_mutex) == 1);
1103 #ifdef COREGL_USE_MODULE_TRACEPATH
1104 extern void *tracepath_api_trace_begin(const char *name, void *hint, int trace_total_time);
1105 extern void *tracepath_api_trace_end(const char *name, void *hint, int trace_total_time);
1108 #define CHECK_GL_ERROR(func) \
1111 int err = _orig_fastpath_glGetError(); \
1112 if (err != GL_NO_ERROR) \
1114 ERR("\E[0;31;1mERROR(GL %p) : %s returns GL error 0x%X\E[0m\n", oldctx->cstate, #func, err); \
1120 fastpath_make_context_current(GLGlueContext *oldctx, GLGlueContext *newctx)
1123 unsigned char flag = 0;
1126 if (debug_nofp == 1)
1132 // Return if they're the same
1133 if (oldctx == newctx)
1139 #define STATE_COMPARE(state) \
1140 if ((oldctx->state) != (newctx->state))
1142 #define STATES_COMPARE(state_ptr, bytes) \
1143 if ((memcmp((oldctx->state_ptr), (newctx->state_ptr), (bytes))) != 0)
1146 #ifdef COREGL_USE_MODULE_TRACEPATH
1147 static void *trace_hint_glfinish = NULL;
1148 trace_hint_glfinish = tracepath_api_trace_begin("eglMakeCurrent(FP glFinish)", trace_hint_glfinish, 0);
1149 #endif // COREGL_USE_MODULE_TRACEPATH
1152 int err = _orig_fastpath_glGetError();
1153 if (err != GL_NO_ERROR && oldctx->gl_error == GL_NO_ERROR)
1154 oldctx->gl_error = err;
1157 CHECK_GL_ERROR(_orig_fastpath_glFlush())
1159 #ifdef COREGL_USE_MODULE_TRACEPATH
1160 tracepath_api_trace_end("eglMakeCurrent(FP glFinish)", trace_hint_glfinish, 0);
1161 #endif // COREGL_USE_MODULE_TRACEPATH
1163 #ifdef COREGL_USE_MODULE_TRACEPATH
1164 static void *trace_hint_bindbuffers = NULL;
1165 trace_hint_bindbuffers = tracepath_api_trace_begin("eglMakeCurrent(FP bind buffers)", trace_hint_bindbuffers, 0);
1166 #endif // COREGL_USE_MODULE_TRACEPATH
1169 //------------------//
1171 flag = oldctx->_bind_flag | newctx->_bind_flag;
1174 STATE_COMPARE(gl_array_buffer_binding[0])
1176 CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ARRAY_BUFFER, newctx->gl_array_buffer_binding[0]))
1178 STATE_COMPARE(gl_element_array_buffer_binding[0])
1180 CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, newctx->gl_element_array_buffer_binding[0]))
1182 STATE_COMPARE(gl_framebuffer_binding[0])
1184 CHECK_GL_ERROR(_orig_fastpath_glBindFramebuffer(GL_FRAMEBUFFER, newctx->gl_framebuffer_binding[0]))
1186 STATE_COMPARE(gl_renderbuffer_binding[0])
1188 CHECK_GL_ERROR(_orig_fastpath_glBindRenderbuffer(GL_RENDERBUFFER, newctx->gl_renderbuffer_binding[0]))
1192 #ifdef COREGL_USE_MODULE_TRACEPATH
1193 tracepath_api_trace_end("eglMakeCurrent(FP bind buffers)", trace_hint_bindbuffers, 0);
1194 #endif // COREGL_USE_MODULE_TRACEPATH
1197 //------------------//
1200 #ifdef COREGL_USE_MODULE_TRACEPATH
1201 static void *trace_hint_enable_states = NULL;
1202 trace_hint_enable_states = tracepath_api_trace_begin("eglMakeCurrent(FP enable states)", trace_hint_enable_states, 0);
1203 #endif // COREGL_USE_MODULE_TRACEPATH
1205 flag = oldctx->_enable_flag1 | newctx->_enable_flag1;
1208 STATE_COMPARE(gl_blend[0])
1210 if (newctx->gl_blend[0])
1212 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_BLEND))
1215 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_BLEND))
1217 STATE_COMPARE(gl_cull_face[0])
1219 if (newctx->gl_cull_face[0])
1221 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_CULL_FACE))
1224 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_CULL_FACE))
1226 STATE_COMPARE(gl_depth_test[0])
1228 if (newctx->gl_depth_test[0])
1230 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_DEPTH_TEST))
1233 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_DEPTH_TEST))
1235 STATE_COMPARE(gl_dither[0])
1237 if (newctx->gl_dither[0])
1239 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_DITHER))
1242 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_DITHER))
1247 flag = oldctx->_enable_flag2 | newctx->_enable_flag2;
1250 STATE_COMPARE(gl_polygon_offset_fill[0])
1252 if (newctx->gl_polygon_offset_fill[0])
1254 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_POLYGON_OFFSET_FILL))
1257 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_POLYGON_OFFSET_FILL))
1259 STATE_COMPARE(gl_sample_alpha_to_coverage[0])
1261 if (newctx->gl_sample_alpha_to_coverage[0])
1263 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE))
1266 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE))
1268 STATE_COMPARE(gl_sample_coverage[0])
1270 if (newctx->gl_sample_coverage[0])
1272 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_SAMPLE_COVERAGE))
1275 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_SAMPLE_COVERAGE))
1277 STATE_COMPARE(gl_scissor_test[0])
1279 if (newctx->gl_scissor_test[0])
1281 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_SCISSOR_TEST))
1284 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_SCISSOR_TEST))
1286 STATE_COMPARE(gl_stencil_test[0])
1288 if (newctx->gl_stencil_test[0])
1290 CHECK_GL_ERROR(_orig_fastpath_glEnable(GL_STENCIL_TEST))
1293 CHECK_GL_ERROR(_orig_fastpath_glDisable(GL_STENCIL_TEST))
1297 #ifdef COREGL_USE_MODULE_TRACEPATH
1298 tracepath_api_trace_end("eglMakeCurrent(FP enable states)", trace_hint_enable_states, 0);
1299 #endif // COREGL_USE_MODULE_TRACEPATH
1301 //------------------//
1303 #ifdef COREGL_USE_MODULE_TRACEPATH
1304 static void *trace_hint_clear_viewport = NULL;
1305 trace_hint_clear_viewport = tracepath_api_trace_begin("eglMakeCurrent(FP clear/viewport)", trace_hint_clear_viewport, 0);
1306 #endif // COREGL_USE_MODULE_TRACEPATH
1308 flag = oldctx->_clear_flag1 | newctx->_clear_flag1;
1312 STATES_COMPARE(gl_viewport, 4 * sizeof(GLint))
1314 CHECK_GL_ERROR(_orig_fastpath_glViewport(newctx->gl_viewport[0],
1315 newctx->gl_viewport[1],
1316 newctx->gl_viewport[2],
1317 newctx->gl_viewport[3]))
1320 STATE_COMPARE(gl_current_program[0])
1322 CHECK_GL_ERROR(_orig_fastpath_glUseProgram(newctx->gl_current_program[0]))
1324 STATES_COMPARE(gl_color_clear_value, 4 * sizeof(GLclampf))
1326 CHECK_GL_ERROR(_orig_fastpath_glClearColor(newctx->gl_color_clear_value[0],
1327 newctx->gl_color_clear_value[1],
1328 newctx->gl_color_clear_value[2],
1329 newctx->gl_color_clear_value[3]))
1335 flag = oldctx->_clear_flag2 | newctx->_clear_flag2;
1338 STATES_COMPARE(gl_color_writemask, 4 * sizeof(GLboolean))
1340 CHECK_GL_ERROR(_orig_fastpath_glColorMask(newctx->gl_color_writemask[0],
1341 newctx->gl_color_writemask[1],
1342 newctx->gl_color_writemask[2],
1343 newctx->gl_color_writemask[3]))
1345 STATES_COMPARE(gl_depth_range, 2 * sizeof(GLclampf))
1347 CHECK_GL_ERROR(_orig_fastpath_glDepthRangef(newctx->gl_depth_range[0],
1348 newctx->gl_depth_range[1]))
1350 STATE_COMPARE(gl_depth_clear_value[0])
1352 CHECK_GL_ERROR(_orig_fastpath_glClearDepthf(newctx->gl_depth_clear_value[0]))
1354 STATE_COMPARE(gl_depth_func[0])
1356 CHECK_GL_ERROR(_orig_fastpath_glDepthFunc(newctx->gl_depth_func[0]))
1358 STATE_COMPARE(gl_depth_writemask[0])
1360 CHECK_GL_ERROR(_orig_fastpath_glDepthMask(newctx->gl_depth_writemask[0]))
1362 STATE_COMPARE(gl_cull_face_mode[0])
1364 CHECK_GL_ERROR(_orig_fastpath_glCullFace(newctx->gl_cull_face_mode[0]))
1369 #ifdef COREGL_USE_MODULE_TRACEPATH
1370 tracepath_api_trace_end("eglMakeCurrent(FP clear/viewport)", trace_hint_clear_viewport, 0);
1371 #endif // COREGL_USE_MODULE_TRACEPATH
1373 //------------------//
1375 #ifdef COREGL_USE_MODULE_TRACEPATH
1376 static void *trace_hint_bind_textures = NULL;
1377 trace_hint_bind_textures = tracepath_api_trace_begin("eglMakeCurrent(FP bind textures)", trace_hint_bind_textures, 0);
1378 #endif // COREGL_USE_MODULE_TRACEPATH
1380 flag = oldctx->_tex_flag1 | newctx->_tex_flag1;
1384 for (i = 0; i < oldctx->gl_num_tex_units[0]; i++)
1386 STATE_COMPARE(gl_tex_2d_state[i])
1388 CHECK_GL_ERROR(_orig_fastpath_glActiveTexture(GL_TEXTURE0 + i))
1389 CHECK_GL_ERROR(_orig_fastpath_glBindTexture(GL_TEXTURE_2D, newctx->gl_tex_2d_state[i]))
1392 STATE_COMPARE(gl_tex_cube_state[i])
1394 CHECK_GL_ERROR(_orig_fastpath_glActiveTexture(GL_TEXTURE0 + i))
1395 CHECK_GL_ERROR(_orig_fastpath_glBindTexture(GL_TEXTURE_CUBE_MAP, newctx->gl_tex_cube_state[i]))
1399 // Restore active texture
1400 CHECK_GL_ERROR(_orig_fastpath_glActiveTexture(newctx->gl_active_texture[0]))
1402 STATE_COMPARE(gl_generate_mipmap_hint[0])
1404 CHECK_GL_ERROR(_orig_fastpath_glHint(GL_GENERATE_MIPMAP_HINT, newctx->gl_generate_mipmap_hint[0]))
1407 #ifdef COREGL_USE_MODULE_TRACEPATH
1408 tracepath_api_trace_end("eglMakeCurrent(FP bind textures)", trace_hint_bind_textures, 0);
1409 #endif // COREGL_USE_MODULE_TRACEPATH
1411 //------------------//
1412 #ifdef COREGL_USE_MODULE_TRACEPATH
1413 static void *trace_hint_etc = NULL;
1414 trace_hint_etc = tracepath_api_trace_begin("eglMakeCurrent(FP etc.)", trace_hint_etc, 0);
1415 #endif // COREGL_USE_MODULE_TRACEPATH
1417 flag = oldctx->_blend_flag | newctx->_blend_flag;
1420 STATES_COMPARE(gl_blend_color, 4 * sizeof(GLclampf))
1422 CHECK_GL_ERROR(_orig_fastpath_glBlendColor(newctx->gl_blend_color[0],
1423 newctx->gl_blend_color[1],
1424 newctx->gl_blend_color[2],
1425 newctx->gl_blend_color[3]))
1427 if ((oldctx->gl_blend_src_rgb[0] != newctx->gl_blend_src_rgb[0]) ||
1428 (oldctx->gl_blend_dst_rgb[0] != newctx->gl_blend_dst_rgb[0]) ||
1429 (oldctx->gl_blend_src_alpha[0] != newctx->gl_blend_src_alpha[0]) ||
1430 (oldctx->gl_blend_dst_alpha[0] != newctx->gl_blend_dst_alpha[0]))
1432 CHECK_GL_ERROR(_orig_fastpath_glBlendFuncSeparate(newctx->gl_blend_src_rgb[0],
1433 newctx->gl_blend_dst_rgb[0],
1434 newctx->gl_blend_src_alpha[0],
1435 newctx->gl_blend_dst_alpha[0]))
1437 if ((oldctx->gl_blend_equation_rgb[0] != newctx->gl_blend_equation_rgb[0]) ||
1438 (oldctx->gl_blend_equation_alpha[0] != newctx->gl_blend_equation_alpha[0]))
1440 CHECK_GL_ERROR(_orig_fastpath_glBlendEquationSeparate(newctx->gl_blend_equation_rgb[0], newctx->gl_blend_equation_alpha[0]))
1445 //------------------//
1447 flag = oldctx->_stencil_flag1 | newctx->_stencil_flag1;
1450 if ((oldctx->gl_stencil_func[0] != newctx->gl_stencil_func[0]) ||
1451 (oldctx->gl_stencil_ref[0] != newctx->gl_stencil_ref[0]) ||
1452 (oldctx->gl_stencil_value_mask[0] != newctx->gl_stencil_value_mask[0]))
1454 CHECK_GL_ERROR(_orig_fastpath_glStencilFuncSeparate(GL_FRONT,
1455 newctx->gl_stencil_func[0],
1456 newctx->gl_stencil_ref[0],
1457 newctx->gl_stencil_value_mask[0]))
1459 if ((oldctx->gl_stencil_fail[0] != newctx->gl_stencil_fail[0]) ||
1460 (oldctx->gl_stencil_pass_depth_fail[0] != newctx->gl_stencil_pass_depth_fail[0]) ||
1461 (oldctx->gl_stencil_pass_depth_pass[0] != newctx->gl_stencil_pass_depth_pass[0]))
1463 CHECK_GL_ERROR(_orig_fastpath_glStencilOpSeparate(GL_FRONT,
1464 newctx->gl_stencil_fail[0],
1465 newctx->gl_stencil_pass_depth_fail[0],
1466 newctx->gl_stencil_pass_depth_pass[0]))
1469 STATE_COMPARE(gl_stencil_writemask[0])
1471 CHECK_GL_ERROR(_orig_fastpath_glStencilMaskSeparate(GL_FRONT, newctx->gl_stencil_writemask[0]))
1477 flag = oldctx->_stencil_flag2 | newctx->_stencil_flag2;
1480 if ((oldctx->gl_stencil_back_func[0] != newctx->gl_stencil_back_func[0]) ||
1481 (oldctx->gl_stencil_back_ref[0] != newctx->gl_stencil_back_ref[0]) ||
1482 (oldctx->gl_stencil_back_value_mask[0] != newctx->gl_stencil_back_value_mask[0]))
1484 CHECK_GL_ERROR(_orig_fastpath_glStencilFuncSeparate(GL_BACK,
1485 newctx->gl_stencil_back_func[0],
1486 newctx->gl_stencil_back_ref[0],
1487 newctx->gl_stencil_back_value_mask[0]))
1489 if ((oldctx->gl_stencil_back_fail[0] != newctx->gl_stencil_back_fail[0]) ||
1490 (oldctx->gl_stencil_back_pass_depth_fail[0] != newctx->gl_stencil_back_pass_depth_fail[0]) ||
1491 (oldctx->gl_stencil_back_pass_depth_pass[0] != newctx->gl_stencil_back_pass_depth_pass[0]))
1493 CHECK_GL_ERROR(_orig_fastpath_glStencilOpSeparate(GL_BACK,
1494 newctx->gl_stencil_back_fail[0],
1495 newctx->gl_stencil_back_pass_depth_fail[0],
1496 newctx->gl_stencil_back_pass_depth_pass[0]))
1499 STATE_COMPARE(gl_stencil_back_writemask[0])
1501 CHECK_GL_ERROR(_orig_fastpath_glStencilMaskSeparate(GL_BACK, newctx->gl_stencil_back_writemask[0]))
1503 STATE_COMPARE(gl_stencil_clear_value[0])
1505 CHECK_GL_ERROR(_orig_fastpath_glClearStencil(newctx->gl_stencil_clear_value[0]))
1509 //------------------//
1511 flag = oldctx->_misc_flag1 | newctx->_misc_flag1;
1514 STATE_COMPARE(gl_front_face[0])
1516 CHECK_GL_ERROR(_orig_fastpath_glFrontFace(newctx->gl_front_face[0]))
1518 STATE_COMPARE(gl_line_width[0])
1520 CHECK_GL_ERROR(_orig_fastpath_glLineWidth(newctx->gl_line_width[0]))
1522 if ((oldctx->gl_polygon_offset_factor[0] != newctx->gl_polygon_offset_factor[0]) ||
1523 (oldctx->gl_polygon_offset_units[0] != newctx->gl_polygon_offset_units[0]))
1525 CHECK_GL_ERROR(_orig_fastpath_glPolygonOffset(newctx->gl_polygon_offset_factor[0],
1526 newctx->gl_polygon_offset_units[0]))
1528 if ((oldctx->gl_sample_coverage_value[0] != newctx->gl_sample_coverage_value[0]) ||
1529 (oldctx->gl_sample_coverage_invert[0] != newctx->gl_sample_coverage_invert[0]))
1531 CHECK_GL_ERROR(_orig_fastpath_glSampleCoverage(newctx->gl_sample_coverage_value[0],
1532 newctx->gl_sample_coverage_invert[0]))
1534 STATE_COMPARE(gl_fragment_shader_derivative_hint[0])
1536 CHECK_GL_ERROR(_orig_fastpath_glHint(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES, newctx->gl_fragment_shader_derivative_hint[0]))
1541 flag = oldctx->_misc_flag2 | newctx->_misc_flag2;
1544 STATES_COMPARE(gl_scissor_box, 4 * sizeof(GLint))
1546 CHECK_GL_ERROR(_orig_fastpath_glScissor(newctx->gl_scissor_box[0],
1547 newctx->gl_scissor_box[1],
1548 newctx->gl_scissor_box[2],
1549 newctx->gl_scissor_box[3]))
1551 STATE_COMPARE(gl_pack_alignment[0])
1553 CHECK_GL_ERROR(_orig_fastpath_glPixelStorei(GL_PACK_ALIGNMENT, newctx->gl_pack_alignment[0]))
1555 STATE_COMPARE(gl_unpack_alignment[0])
1557 CHECK_GL_ERROR(_orig_fastpath_glPixelStorei(GL_UNPACK_ALIGNMENT, newctx->gl_unpack_alignment[0]))
1560 #ifdef COREGL_USE_MODULE_TRACEPATH
1561 tracepath_api_trace_end("eglMakeCurrent(FP etc.)", trace_hint_etc, 0);
1562 #endif // COREGL_USE_MODULE_TRACEPATH
1565 #ifdef COREGL_USE_MODULE_TRACEPATH
1566 static void *trace_hint_vertex_attrib = NULL;
1567 trace_hint_vertex_attrib = tracepath_api_trace_begin("eglMakeCurrent(FP vertex attrib)", trace_hint_vertex_attrib, 0);
1568 #endif // COREGL_USE_MODULE_TRACEPATH
1570 flag = oldctx->_vattrib_flag | newctx->_vattrib_flag;
1573 for (i = 0; i < oldctx->gl_num_vertex_attribs[0]; i++)
1575 if (newctx->gl_vertex_array_buf_id[i] != oldctx->gl_vertex_array_buf_id[i])
1577 CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ARRAY_BUFFER, newctx->gl_vertex_array_buf_id[i]))
1581 CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ARRAY_BUFFER, 0))
1584 CHECK_GL_ERROR(_orig_fastpath_glVertexAttribPointer(i,
1585 newctx->gl_vertex_array_size[i],
1586 newctx->gl_vertex_array_type[i],
1587 newctx->gl_vertex_array_normalized[i],
1588 newctx->gl_vertex_array_stride[i],
1589 newctx->gl_vertex_array_pointer[i]))
1591 STATES_COMPARE(gl_vertex_attrib_value + 4 * i, 4 * sizeof(GLfloat))
1593 CHECK_GL_ERROR(_orig_fastpath_glVertexAttrib4fv(i, &newctx->gl_vertex_attrib_value[4 * i]))
1596 if (newctx->gl_vertex_array_enabled[i] == GL_TRUE)
1598 CHECK_GL_ERROR(_orig_fastpath_glEnableVertexAttribArray(i))
1602 CHECK_GL_ERROR(_orig_fastpath_glDisableVertexAttribArray(i))
1606 STATE_COMPARE(gl_array_buffer_binding[0])
1608 CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ARRAY_BUFFER, newctx->gl_array_buffer_binding[0]))
1610 STATE_COMPARE(gl_element_array_buffer_binding[0])
1612 CHECK_GL_ERROR(_orig_fastpath_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, newctx->gl_element_array_buffer_binding[0]))
1617 #ifdef COREGL_USE_MODULE_TRACEPATH
1618 tracepath_api_trace_end("eglMakeCurrent(FP vertex attrib)", trace_hint_vertex_attrib, 0);
1619 #endif // COREGL_USE_MODULE_TRACEPATH
1626 #ifdef COREGL_FASTPATH_TRACE_STATE_INFO
1627 if (unlikely(trace_state_flag == 1))
1628 fastpath_dump_context_states(newctx, 0);
1629 #endif // COREGL_FASTPATH_TRACE_STATE_INFO
1631 #undef STATE_COMPARE
1632 #undef STATES_COMPARE