#include "coregl.h"
-#define COREGL_DEBUG
-
-# define ERR(...) \
- fprintf(stderr, __VA_ARGS__)
-# ifdef COREGL_DEBUG
-# define DBG(...) \
- fprintf(stderr, __VA_ARGS__)
-# else
-# define DBG(...)
-# endif
+#include "modules/coregl_module.h"
-# define LOG(...) \
- fprintf(stderr, __VA_ARGS__)
+#define unlikely(x) __builtin_expect(x, 0)
-#ifdef COREGL_DEBUG
-# define AST(expr) \
- if (!(expr)) { fprintf(stderr, "\E[0;31;1m%s(%d) error. '"#expr"'\E[0m\n", __func__, __LINE__); }
-#else
-# define AST(expr) \
- if (expr)
-#endif
-
-typedef GLvoid * GLvoidptr;
-typedef GLuint GLuintmask;
+// Symbol definition for real
+#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_TRACE_ALL
-#define COREGL_TRACE_CONTEXT_INFO
-#define COREGL_TRACE_STATE_INFO
-#define COREGL_TRACE_APICALL_INFO
+#define COREGL_DEBUG
-#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
+///////////////////////////////////////
+// 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_TRACE_OUTPUT_INTERVAL_SEC 5
-
-// Symbol definition for static
-#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST) extern RET_TYPE (*_sym_##FUNC_NAME) PARAM_LIST;
-# include "headers/sym.h"
-#undef _COREGL_SYMBOL
+# define COREGL_ERR(...) \
+ LOGE(" "__VA_ARGS__)
+# define COREGL_WRN(...) \
+ LOGW(" "__VA_ARGS__)
+# ifdef COREGL_DEBUG
+# define COREGL_DBG(...) \
+ LOGD(" "__VA_ARGS__)
+# else
+# define COREGL_DBG(...)
+# endif
-// Symbol definition for wrappath
-#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST) extern RET_TYPE (evgl_##FUNC_NAME) PARAM_LIST;
-# include "headers/sym.h"
-#undef _COREGL_SYMBOL
+# define COREGL_LOG(...) \
+ LOGD(" "__VA_ARGS__)
-// Symbol definition for fastpath
-#define _COREGL_SYMBOL(IS_EXTENSION, RET_TYPE, FUNC_NAME, PARAM_LIST) extern RET_TYPE (fpgl_##FUNC_NAME) PARAM_LIST;
-# include "headers/sym.h"
-#undef _COREGL_SYMBOL
-#define _COREGL_INT_INIT_VALUE -3
+# define TRACE(...) \
+ if (trace_fp != NULL) \
+ fprintf(trace_fp, __VA_ARGS__); \
+ else \
+ LOGD(" "__VA_ARGS__)
+# define TRACE_END() \
+ if (trace_fp != NULL) \
+ fflush(trace_fp)
+#define _COREGL_TRACE_OUTPUT_INTERVAL_SEC 5
-#ifdef COREGL_ERRORS
-# define GLERR(fn, fl, ln, op)
-#else
-# define GLERR(fn, fl, ln, op)
-#endif
-
+static inline GLint GET_INT_FROM_FLOAT(GLfloat value)
+{
+ return (GLint)value;
+}
+static inline GLuint GET_UINT_FROM_FLOAT(GLfloat value)
+{
+ return (GLuint)value;
+}
-typedef struct _Trace_Data Trace_Data;
-#ifdef COREGL_TRACE_APICALL_INFO
-# define _COREGL_TRACE_API_BEGIN(api) \
- trace_begin(api);
-# define _COREGL_TRACE_API_END(api) \
- trace_end(api);
-# define _COREGL_TRACE_API_OUTPUT(force_output) \
- trace_output(force_output);
+#ifdef COREGL_DEBUG
+# define AST(expr) \
+ if (!(expr)) { LOGE("\E[40;31;1m%s(%d) error. '"#expr"'\E[0m\n", __func__, __LINE__); }
#else
-# define _COREGL_TRACE_API_BEGIN(api)
-# define _COREGL_TRACE_API_END(api)
-# define _COREGL_TRACE_API_OUTPUT(force_output)
+# define AST(expr) \
+ if (expr)
#endif
+typedef GLvoid *GLvoidptr;
+typedef GLuint GLuintmask;
-#define _COREGL_FAST_FUNC_BEGIN()
-
-#define _COREGL_FAST_FUNC_END()
-
-#define _COREGL_WRAP_FUNC_BEGIN() \
- _COREGL_TRACE_API_BEGIN(__func__);
-
-#define _COREGL_WRAP_FUNC_END() \
- _COREGL_TRACE_API_END(__func__);
+#define COREGL_GLAPI_31 4
+#define COREGL_GLAPI_3 3
+#define COREGL_GLAPI_2 2
-typedef enum _CoreGL_Opt_Flag
-{
- COREGL_NORMAL_PATH,
- GL_WRAPPED_PATH,
- COREGL_FAST_PATH
-} CoreGL_Opt_Flag;
+#define _COREGL_INT_INIT_VALUE -3
+#define COREGL_OVERRIDE_API(mangle, func, prefix) \
+ mangle##func = prefix##func
-#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;
- 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 int trace_api_flag;
+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 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 const char *get_env_setting(const char *name);
// Main utility functions
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);
-extern void trace_end(const char *name);
-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