#include "coregl.h"
+#include "modules/coregl_module.h"
+
+#define unlikely(x) __builtin_expect(x, 0)
+
// Symbol definition for real
-#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST) extern RET_TYPE (*_sym_##FUNC_NAME) PARAM_LIST;
+#define _COREGL_SYMBOL(RET_TYPE, FUNC_NAME, PARAM_LIST) extern RET_TYPE (*_sym_##FUNC_NAME) PARAM_LIST;
# include "headers/sym.h"
#undef _COREGL_SYMBOL
#define COREGL_DEBUG
-# define ERR(...) \
- fprintf(stderr, __VA_ARGS__)
+///////////////////////////////////////
+// Disable dlog for debugging urgent issues //
+#ifdef COREGL_DEBUG
+//# define LOG_TAG "CoreGL"
+//# include <dlog.h>
+# define LOGE(...) fprintf(stderr, __VA_ARGS__)
+# define LOGW(...) fprintf(stderr, __VA_ARGS__)
+# define LOGD(...) fprintf(stderr, __VA_ARGS__)
+#endif
+///////////////////////////////////////
+
+# define COREGL_ERR(...) \
+ LOGE(" "__VA_ARGS__)
+# define COREGL_WRN(...) \
+ LOGW(" "__VA_ARGS__)
# ifdef COREGL_DEBUG
-# define DBG(...) \
- fprintf(stderr, __VA_ARGS__)
+# define COREGL_DBG(...) \
+ LOGD(" "__VA_ARGS__)
# else
-# define DBG(...)
+# define COREGL_DBG(...)
# endif
-# define LOG(...) \
- fprintf(stderr, __VA_ARGS__)
+# define COREGL_LOG(...) \
+ LOGD(" "__VA_ARGS__)
+
# define TRACE(...) \
- fprintf(trace_fp, __VA_ARGS__)
+ if (trace_fp != NULL) \
+ fprintf(trace_fp, __VA_ARGS__); \
+ else \
+ LOGD(" "__VA_ARGS__)
# define TRACE_END() \
- fflush(trace_fp)
+ if (trace_fp != NULL) \
+ fflush(trace_fp)
+#define _COREGL_TRACE_OUTPUT_INTERVAL_SEC 5
+
+static inline GLint GET_INT_FROM_FLOAT(GLfloat value)
+{
+ return (GLint)value;
+}
+static inline GLuint GET_UINT_FROM_FLOAT(GLfloat value)
+{
+ return (GLuint)value;
+}
+
#ifdef COREGL_DEBUG
# define AST(expr) \
- if (!(expr)) { fprintf(stderr, "\E[0;31;1m%s(%d) error. '"#expr"'\E[0m\n", __func__, __LINE__); }
+ if (!(expr)) { LOGE("\E[40;31;1m%s(%d) error. '"#expr"'\E[0m\n", __func__, __LINE__); }
#else
# define AST(expr) \
if (expr)
#endif
-typedef GLvoid * GLvoidptr;
+typedef GLvoid *GLvoidptr;
typedef GLuint GLuintmask;
-//#define COREGL_TRACE_ALL
-#define COREGL_TRACE_CONTEXT_INFO
-#define COREGL_TRACE_STATE_INFO
-#define COREGL_TRACE_APICALL_INFO
-
-#ifdef COREGL_TRACE_ALL
-#define COREGL_TRACE_CONTEXT_INFO // Context state & thread state & Glue-context info
-#define COREGL_TRACE_STATE_INFO // Glue-context state info
-#define COREGL_TRACE_APICALL_INFO // API call frequency info
-#endif
-
-#define _COREGL_TRACE_OUTPUT_INTERVAL_SEC 5
+#define COREGL_GLAPI_31 4
+#define COREGL_GLAPI_3 3
+#define COREGL_GLAPI_2 2
#define _COREGL_INT_INIT_VALUE -3
-#ifdef COREGL_ERRORS
-# define GLERR(fn, fl, ln, op)
-#else
-# define GLERR(fn, fl, ln, op)
-#endif
-
-#define _COREGL_NAME_MANGLE(name) ovr_##name
-
-typedef struct _Trace_Data Trace_Data;
-
-#ifdef COREGL_TRACE_APICALL_INFO
-# define _COREGL_TRACE_API_BEGIN(api, hint, trace_total_time) \
- trace_begin(api, hint, trace_total_time);
-# define _COREGL_TRACE_API_END(api, hint, trace_total_time) \
- trace_end(api, hint, trace_total_time);
-# define _COREGL_TRACE_API_OUTPUT(force_output) \
- trace_output(force_output);
-#else
-# define _COREGL_TRACE_API_BEGIN(api, hint, trace_total_time) NULL;
-# define _COREGL_TRACE_API_END(api, hint, trace_total_time)
-# define _COREGL_TRACE_API_OUTPUT(force_output)
-#endif
-
-
-#define _COREGL_FAST_FUNC_BEGIN()
+#define COREGL_OVERRIDE_API(mangle, func, prefix) \
+ mangle##func = prefix##func
-#define _COREGL_FAST_FUNC_END()
-
-#define _COREGL_FAST_FUNC_SYMCALL_BEGIN()
-
-#define _COREGL_FAST_FUNC_SYMCALL_END()
-
-#define _COREGL_WRAP_FUNC_BEGIN() \
- static void *trace_hint = NULL; \
- if (trace_api_flag == 1) \
- trace_hint = _COREGL_TRACE_API_BEGIN(__func__, trace_hint, 1);
-
-#define _COREGL_WRAP_FUNC_END() \
- if (trace_api_flag == 1) \
- _COREGL_TRACE_API_END(__func__, trace_hint, 1);
-
-typedef enum _CoreGL_Opt_Flag
-{
- COREGL_UNKNOWN_PATH,
- COREGL_NORMAL_PATH,
- COREGL_FAST_PATH
-} CoreGL_Opt_Flag;
-
-extern CoreGL_Opt_Flag api_opt;
-
-#ifndef _COREGL_DESKTOP_GL
typedef EGLSurface GLSurface;
typedef EGLDisplay GLDisplay;
typedef EGLContext GLContext;
-#else
-typedef GLXDrawable GLSurface;
-typedef Display GLDisplay;
-typedef GLXContext GLContext;
-#endif
-typedef struct _GLContextState
-{
- int ref_count;
- GLContext *rctx;
- GLDisplay *rdpy;
- void *data;
-} GLContextState;
+#define COREGL_GL_NO_CONTEXT EGL_NO_CONTEXT
-typedef struct _GLThreadState
-{
+typedef struct _GLThreadState {
int thread_id;
- EGLenum binded_api;
- GLContextState *cstate;
- GLSurface *rsurf_draw;
- GLSurface *rsurf_read;
- Trace_Data **ftd_table;
+ void *module_data[COREGL_MAX_MODULES];
} GLThreadState;
-typedef struct _GLContext_List
-{
- void *option;
- int option_len;
- int thread_id;
- GLContextState *cstate;
- struct _GLContext_List *next;
-} GLContext_List;
-
extern void *glue_lib_handle;
extern void *egl_lib_handle;
-extern GLContext_List *glctx_list;
-
#include "coregl_thread_pthread.h"
-extern Mutex ctx_list_access_mutex;
-typedef struct _General_Trace_List
-{
+typedef struct _General_Trace_List {
void *value;
struct _General_Trace_List *next;
} General_Trace_List;
extern General_Trace_List *thread_trace_list;
extern Mutex general_trace_lists_access_mutex;
+extern FILE *trace_fp;
+
extern int trace_api_flag;
+extern int trace_api_all_flag;
+extern int trace_api_frame_flag;
+extern int trace_mem_flag;
+extern int trace_mem_all_flag;
extern int trace_ctx_flag;
extern int trace_ctx_force_flag;
extern int trace_state_flag;
-extern int debug_nofp;
-extern FILE *trace_fp;
+extern int trace_surface_flag;
+extern int trace_surface_sequence_sort_flag;
+extern int trace_surface_filter_period_begin;
+extern int trace_surface_filter_period_end;
+extern int trace_surface_filter_type;
+extern int trace_surface_filter_handle;
+extern int trace_surface_filter_size_w;
+extern int trace_surface_filter_size_h;
+extern int trace_surface_print_only_flag;
+
+#define USE_TRACEPATH (trace_api_flag == 1 || trace_ctx_flag == 1 || trace_state_flag == 1 || trace_mem_flag == 1 || trace_surface_flag == 1)
// Environment functions
extern const char *get_env_setting(const char *name);
extern int init_new_thread_state();
// Thread functions
+extern int mutex_init(Mutex *mt);
extern int mutex_lock(Mutex *mt);
extern int mutex_unlock(Mutex *mt);
extern int get_current_thread();
-extern int set_current_thread_state(Mutex *mt, GLThreadState *tstate);
+extern int set_current_thread_state(GLThreadState *tstate);
extern GLThreadState *get_current_thread_state();
-// Context state functions
-extern int add_context_state_to_list(const void *data, const int datalen, GLContextState *cstate, Mutex *mtx);
-extern int remove_context_states_from_list(GLContextState *cstate, Mutex *mtx);
-extern GLContextState *get_context_state_from_list(const void *data, const int datalen, Mutex *mtx);
-
-
// Override functions
-extern void override_glue_normal_path();
-extern void override_glue_fast_path();
-extern void override_gl_normal_path();
-extern void override_gl_fast_path();
-extern void override_glue_apis(CoreGL_Opt_Flag opt);
-extern void override_gl_apis(CoreGL_Opt_Flag opt);
+extern void init_export();
+extern void deinit_export();
+
+// Module interfaces
+extern void init_modules();
+extern void deinit_modules();
+extern void reset_modules_override();
+extern void init_modules_tstate(GLThreadState *tstate);
+extern void deinit_modules_tstate(GLThreadState *tstate);
// Debug & Trace functions
-extern int add_to_general_trace_list(General_Trace_List **gtl, void *value);
-extern int remove_from_general_trace_list(General_Trace_List **gtl, void *value);
-extern void *trace_begin(const char *name, void *hint, int trace_total_time);
-extern void *trace_end(const char *name, void *hint, int trace_total_time);
-extern void trace_output(int force_output);
+extern int add_to_general_trace_list(General_Trace_List **gtl,
+ void *value);
+extern int remove_from_general_trace_list(
+ General_Trace_List **gtl, void *value);
#endif // COREGL_INTERNAL_H