Add coding style guide.
[platform/core/uifw/coregl.git] / src / modules / fastpath / coregl_fastpath.h
1 #ifndef COREGL_FASTPATH_H
2 #define COREGL_FASTPATH_H
3
4 #include "../coregl_module.h"
5
6 #ifndef COREGL_USE_MODULE_FASTPATH
7 #error "COREGL_USE_MODULE_FASTPATH must defined!!!"
8 #endif
9
10 #define MY_MODULE_ID              COREGL_MODULE_FASTPATH
11 #define MY_MODULE_TSTATE         Fastpath_ThreadState
12
13 #include "../../coregl_internal.h"
14 #include "../../coregl_export.h"
15
16 #define _COREGL_SYMBOL(RET_TYPE, FUNC_NAME, PARAM_LIST)     extern RET_TYPE (*_orig_fastpath_##FUNC_NAME) PARAM_LIST;
17 # include "../../headers/sym.h"
18 #undef _COREGL_SYMBOL
19
20 // Symbol definition for fastpath
21 #define _COREGL_SYMBOL(RET_TYPE, FUNC_NAME, PARAM_LIST)     extern RET_TYPE (fastpath_##FUNC_NAME) PARAM_LIST;
22 # include "../../headers/sym.h"
23 #undef _COREGL_SYMBOL
24
25 #define COREGL_FASTPATH_TRACE_ALL
26
27 #ifdef COREGL_FASTPATH_TRACE_ALL
28 #define COREGL_FASTPATH_TRACE_CONTEXT_INFO   // Context state & thread state & Glue-context info
29 #define COREGL_FASTPATH_TRACE_STATE_INFO     // Glue-context state info
30 #endif
31
32
33 #define _COREGL_FASTPATH_FUNC_BEGIN()
34
35 #define _COREGL_FASTPATH_FUNC_END()
36
37
38 #define FLAG_BIT_0      0x01
39 #define FLAG_BIT_1      0x02
40 #define FLAG_BIT_2      0x04
41 #define FLAG_BIT_3      0x08
42 #define FLAG_BIT_4      0x10
43 #define FLAG_BIT_5      0x20
44 #define FLAG_BIT_6      0x40
45 #define FLAG_BIT_7      0x80
46
47 #define MAX_TEXTURE_UNITS 32
48 #define MAX_VERTEX_ATTRIBS 64
49 #define MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 64
50 #define MAX_UNIFORM_BUFFER_BINDINGS 64
51
52 typedef enum _Fastpath_Opt_Flag {
53         FP_UNKNOWN_PATH,
54         FP_NORMAL_PATH,
55         FP_FAST_PATH
56 } Fastpath_Opt_Flag;
57
58 extern Fastpath_Opt_Flag   fp_opt;
59 extern int                 debug_nofp;
60
61 typedef struct _GLContextState {
62         int                      ref_count;
63         GLContext               *rctx;
64         GLDisplay               *rdpy;
65         void                    *data;
66 } GLContextState;
67
68 typedef struct _Fastpath_ThreadState {
69         EGLenum                  binded_api;
70         GLContextState          *cstate;
71         GLSurface               *rsurf_draw;
72         GLSurface               *rsurf_read;
73 } Fastpath_ThreadState;
74
75 typedef struct _GLContext_List {
76         void                    *option;
77         int                      option_len;
78         int                      thread_id;
79         GLContextState          *cstate;
80         struct _GLContext_List *next;
81 } GLContext_List;
82
83 extern GLContext_List      *glctx_list;
84
85 extern Mutex                ctx_list_access_mutex;
86
87 typedef struct {
88         GLuint   tex_id;
89 } GL_Texture_State;
90
91 typedef struct {
92         GLboolean    modified;
93         GLboolean    enabled;
94         GLuint       buf_id;
95         GLint        size;
96         GLenum       type;
97         GLboolean    normalized;
98         GLsizei      stride;
99         const void  *pointer;
100 } GL_Vertex_Array_State;
101
102 typedef struct {
103         GLboolean   modified;
104         GLfloat     value[4];
105 } GL_Vertex_Attrib;
106
107
108 #define MAGIC_GLFAST                0x73777770
109 #define GL_OBJECT_HASH_BASE        (1 << 10)
110
111 #define GL_OBJECT_ID_LIMIT         0xFFFFFF
112
113 #define GL_Object_Type                     int
114 #define GL_OBJECT_TYPE_QUERY               0x0
115 #define GL_OBJECT_TYPE_TEXTURE             0x1000000
116 #define GL_OBJECT_TYPE_BUFFER              0x2000000
117 #define GL_OBJECT_TYPE_FRAMEBUFFER         0x3000000
118 #define GL_OBJECT_TYPE_RENDERBUFFER        0x4000000
119 #define GL_OBJECT_TYPE_PROGRAM             0x5000000
120 #define GL_OBJECT_TYPE_VERTEXARRAY         0x6000000
121 #define GL_OBJECT_TYPE_SAMPLER             0x7000000
122 #define GL_OBJECT_TYPE_TRANSFORMFEEDBACK   0x8000000
123 #define GL_OBJECT_TYPE_PROGRAMPIPELINE     0x9000000
124 #define GL_OBJECT_TYPE_UNKNOWN             0xFFFFFFF
125
126 typedef struct _GL_Object {
127         GLuint                            id;
128         GLuint                            real_id;
129         GLint                             ref_count;
130         GLvoid                            *tag;
131
132         struct _GL_Shared_Object_State  *parent;
133 } GL_Object;
134
135 typedef struct _GL_Object_Hash {
136         GLuint                           hash_key;
137         GL_Object                        *item;
138         struct _GL_Object_Hash          *next;
139 } GL_Object_Hash;
140
141 typedef struct _GL_Object_Hash_Base {
142         GLuint                            hash_size;
143         GLuint                            item_size;
144         GLuint                            last_id;
145         GLuint                            is_looped;
146         GL_Object_Hash                  **hash_field;
147 } GL_Object_Hash_Base;
148
149 typedef struct _GL_Shared_Object_State {
150         Mutex                    access_mutex;
151         Mutex                    real_access_mutex;
152         int                      ref_count;
153         General_Trace_List      *using_gctxs;
154
155         GL_Object_Hash_Base      texture;
156         GL_Object_Hash_Base      buffer;
157         GL_Object_Hash_Base      renderbuffer;
158         GL_Object_Hash_Base      program;
159         GL_Object_Hash_Base      sampler;
160         GL_Object_Hash_Base      programpipeline;
161
162         GL_Object_Hash_Base      texture_real;
163         GL_Object_Hash_Base      buffer_real;
164         GL_Object_Hash_Base      renderbuffer_real;
165         GL_Object_Hash_Base      program_real;
166         GL_Object_Hash_Base      sampler_real;
167
168         GL_Object_Hash_Base      programpipeline_real;
169 } GL_Shared_Object_State;
170
171 typedef struct _GL_Object_State {
172         GL_Shared_Object_State  *shared;
173
174         GL_Object_Hash_Base      query;
175         GL_Object_Hash_Base      framebuffer;
176         GL_Object_Hash_Base      vertexarray;
177         GL_Object_Hash_Base      transformfeedback;
178
179         GL_Object_Hash_Base      query_real;
180         GL_Object_Hash_Base      framebuffer_real;
181         GL_Object_Hash_Base      vertexarray_real;
182         GL_Object_Hash_Base      transformfeedback_real;
183 } GL_Object_State;
184
185 typedef struct _GLGlueContext {
186         int                     magic;
187         int                     initialized;
188         int                     surface_attached;
189
190         int                                                     ref_count;
191         int                                                     is_destroyed;
192
193         double                  glversion;
194
195         int                                                     used_count;
196
197         GLDisplay              *rdpy;
198         GLContextState         *cstate;
199         int                     thread_id;
200
201         void                   *real_ctx_option;
202         int                     real_ctx_option_len;
203
204         void                   *real_ctx_sharable_option;
205         int                     real_ctx_sharable_option_len;
206
207
208
209
210         unsigned char           _bind_flag1;
211 #define _BIND_FLAG1_BIT_gl_array_buffer_binding               FLAG_BIT_0
212 #define _BIND_FLAG1_BIT_gl_element_array_buffer_binding       FLAG_BIT_1
213 #define _BIND_FLAG1_BIT_gl_framebuffer_binding                FLAG_BIT_2
214 #define _BIND_FLAG1_BIT_gl_renderbuffer_binding               FLAG_BIT_3
215 #define _BIND_FLAG1_BIT_gl_framebuffer_binding_read           FLAG_BIT_4
216 #define _BIND_FLAG1_BIT_gl_framebuffer_binding_draw           FLAG_BIT_5
217
218         unsigned char           _bind_flag2;
219 #define _BIND_FLAG2_BIT_gl_copy_read_buffer_binding           FLAG_BIT_0
220 #define _BIND_FLAG2_BIT_gl_copy_write_buffer_binding          FLAG_BIT_1
221 #define _BIND_FLAG2_BIT_gl_pixel_pack_buffer_binding          FLAG_BIT_2
222 #define _BIND_FLAG2_BIT_gl_pixel_unpack_buffer_binding        FLAG_BIT_3
223 #define _BIND_FLAG2_BIT_gl_transform_feedback_buffer_binding  FLAG_BIT_4
224 #define _BIND_FLAG2_BIT_gl_uniform_buffer_binding             FLAG_BIT_5
225
226         unsigned char           _enable_flag1;
227 #define _ENABLE_FLAG1_BIT_gl_blend        FLAG_BIT_0
228 #define _ENABLE_FLAG1_BIT_gl_cull_face    FLAG_BIT_1
229 #define _ENABLE_FLAG1_BIT_gl_depth_test   FLAG_BIT_2
230 #define _ENABLE_FLAG1_BIT_gl_dither       FLAG_BIT_3
231
232         unsigned char           _enable_flag2;
233 #define _ENABLE_FLAG2_BIT_gl_polygon_offset_fill       FLAG_BIT_0
234 #define _ENABLE_FLAG2_BIT_gl_sample_alpha_to_coverage  FLAG_BIT_1
235 #define _ENABLE_FLAG2_BIT_gl_sample_coverage           FLAG_BIT_2
236 #define _ENABLE_FLAG2_BIT_gl_scissor_test              FLAG_BIT_3
237 #define _ENABLE_FLAG2_BIT_gl_stencil_test              FLAG_BIT_4
238
239         unsigned char           _enable_flag3;
240 #define _ENABLE_FLAG3_BIT_gl_primitive_restart_fixed_index  FLAG_BIT_0
241 #define _ENABLE_FLAG3_BIT_gl_rasterizer_discard             FLAG_BIT_1
242
243         unsigned char           _clear_flag1;
244 #define _CLEAR_FLAG1_BIT_gl_viewport            FLAG_BIT_0
245 #define _CLEAR_FLAG1_BIT_gl_current_program     FLAG_BIT_1
246 #define _CLEAR_FLAG1_BIT_gl_color_clear_value   FLAG_BIT_2
247
248         unsigned char           _clear_flag2;
249 #define _CLEAR_FLAG2_BIT_gl_color_writemask     FLAG_BIT_0
250 #define _CLEAR_FLAG2_BIT_gl_depth_range         FLAG_BIT_1
251 #define _CLEAR_FLAG2_BIT_gl_depth_clear_value   FLAG_BIT_2
252 #define _CLEAR_FLAG2_BIT_gl_depth_func          FLAG_BIT_3
253 #define _CLEAR_FLAG2_BIT_gl_depth_writemask     FLAG_BIT_4
254 #define _CLEAR_FLAG2_BIT_gl_cull_face_mode      FLAG_BIT_5
255
256         unsigned char           _tex_flag1;
257 #define _TEX_FLAG1_BIT_gl_active_texture         FLAG_BIT_0
258 #define _TEX_FLAG1_BIT_gl_generate_mipmap_hint   FLAG_BIT_1
259 #define _TEX_FLAG1_BIT_gl_tex_2d_state           FLAG_BIT_2
260 #define _TEX_FLAG1_BIT_gl_tex_3d_state           FLAG_BIT_3
261 #define _TEX_FLAG1_BIT_gl_tex_2d_array_state     FLAG_BIT_4
262 #define _TEX_FLAG1_BIT_gl_tex_cube_state         FLAG_BIT_5
263 #define _TEX_FLAG1_BIT_gl_tex_external_oes_state FLAG_BIT_6
264
265         unsigned char           _blend_flag;
266 #define _BLEND_FLAG_BIT_gl_blend_color           FLAG_BIT_0
267 #define _BLEND_FLAG_BIT_gl_blend_src_rgb         FLAG_BIT_1
268 #define _BLEND_FLAG_BIT_gl_blend_src_alpha       FLAG_BIT_2
269 #define _BLEND_FLAG_BIT_gl_blend_dst_rgb         FLAG_BIT_3
270 #define _BLEND_FLAG_BIT_gl_blend_dst_alpha       FLAG_BIT_4
271 #define _BLEND_FLAG_BIT_gl_blend_equation_rgb    FLAG_BIT_5
272 #define _BLEND_FLAG_BIT_gl_blend_equation_alpha  FLAG_BIT_6
273
274         unsigned char           _stencil_flag1;
275 #define _STENCIL_FLAG1_BIT_gl_stencil_func              FLAG_BIT_0
276 #define _STENCIL_FLAG1_BIT_gl_stencil_ref               FLAG_BIT_1
277 #define _STENCIL_FLAG1_BIT_gl_stencil_value_mask        FLAG_BIT_2
278 #define _STENCIL_FLAG1_BIT_gl_stencil_fail              FLAG_BIT_3
279 #define _STENCIL_FLAG1_BIT_gl_stencil_pass_depth_fail   FLAG_BIT_4
280 #define _STENCIL_FLAG1_BIT_gl_stencil_pass_depth_pass   FLAG_BIT_5
281 #define _STENCIL_FLAG1_BIT_gl_stencil_writemask         FLAG_BIT_6
282
283         unsigned char           _stencil_flag2;
284 #define _STENCIL_FLAG2_BIT_gl_stencil_back_func              FLAG_BIT_0
285 #define _STENCIL_FLAG2_BIT_gl_stencil_back_ref               FLAG_BIT_1
286 #define _STENCIL_FLAG2_BIT_gl_stencil_back_value_mask        FLAG_BIT_2
287 #define _STENCIL_FLAG2_BIT_gl_stencil_back_fail              FLAG_BIT_3
288 #define _STENCIL_FLAG2_BIT_gl_stencil_back_pass_depth_fail   FLAG_BIT_4
289 #define _STENCIL_FLAG2_BIT_gl_stencil_back_pass_depth_pass   FLAG_BIT_5
290 #define _STENCIL_FLAG2_BIT_gl_stencil_back_writemask         FLAG_BIT_6
291 #define _STENCIL_FLAG2_BIT_gl_stencil_clear_value            FLAG_BIT_7
292
293         unsigned char           _pixel_flag1;
294 #define _PIXEL_FLAG1_BIT_gl_pack_row_length      FLAG_BIT_0
295 #define _PIXEL_FLAG1_BIT_gl_pack_skip_rows       FLAG_BIT_1
296 #define _PIXEL_FLAG1_BIT_gl_pack_skip_pixels     FLAG_BIT_2
297 #define _PIXEL_FLAG1_BIT_gl_pack_alignment       FLAG_BIT_3
298
299         unsigned char           _pixel_flag2;
300 #define _PIXEL_FLAG2_BIT_gl_unpack_row_length      FLAG_BIT_0
301 #define _PIXEL_FLAG2_BIT_gl_unpack_skip_rows       FLAG_BIT_1
302 #define _PIXEL_FLAG2_BIT_gl_unpack_skip_pixels     FLAG_BIT_2
303 #define _PIXEL_FLAG2_BIT_gl_unpack_alignment       FLAG_BIT_3
304 #define _PIXEL_FLAG2_BIT_gl_unpack_image_height    FLAG_BIT_4
305 #define _PIXEL_FLAG2_BIT_gl_unpack_skip_images     FLAG_BIT_5
306
307         unsigned char           _misc_flag1;
308 #define _MISC_FLAG1_BIT_gl_front_face                        FLAG_BIT_0
309 #define _MISC_FLAG1_BIT_gl_line_width                        FLAG_BIT_1
310 #define _MISC_FLAG1_BIT_gl_polygon_offset_factor             FLAG_BIT_2
311 #define _MISC_FLAG1_BIT_gl_polygon_offset_units              FLAG_BIT_3
312 #define _MISC_FLAG1_BIT_gl_sample_coverage_value             FLAG_BIT_4
313 #define _MISC_FLAG1_BIT_gl_sample_coverage_invert            FLAG_BIT_5
314 #define _MISC_FLAG1_BIT_gl_fragment_shader_derivative_hint   FLAG_BIT_6
315
316         unsigned char           _misc_flag2;
317 #define _MISC_FLAG2_BIT_gl_scissor_box                       FLAG_BIT_0
318
319         unsigned char           _misc_flag3;
320 #define _MISC_FLAG3_BIT_gl_read_buffer                       FLAG_BIT_0
321 #define _MISC_FLAG3_BIT_gl_draw_buffers                      FLAG_BIT_1
322 #define _MISC_FLAG3_BIT_gl_vertex_array_binding              FLAG_BIT_2
323 #define _MISC_FLAG3_BIT_gl_transform_feedback_binding        FLAG_BIT_3
324 #define _MISC_FLAG3_BIT_gl_transform_feedback                FLAG_BIT_4
325 #define _MISC_FLAG3_BIT_gl_draw_range_elements               FLAG_BIT_5
326 #define _MISC_FLAG3_BIT_gl_program_pipeline_binding          FLAG_BIT_6
327
328         unsigned char           _vattrib_flag;
329 #define _VATTRIB_FLAG_BIT_gl_vertex_attrib_value             FLAG_BIT_0
330 #define _VATTRIB_FLAG_BIT_gl_vertex_array                    FLAG_BIT_1
331
332         GL_Object_State         ostate;
333
334         GLenum                  gl_error;
335
336         // General state
337 #define GLUE_STATE(TYPE, NAME, SIZE, ARRAY_SIZE, DEFAULT_STMT, GET_STMT)     TYPE NAME[ARRAY_SIZE];
338 # include "coregl_fastpath_state.h"
339 #undef GLUE_STATE
340 #define GLUE_STATE(TYPE, NAME, SIZE, ARRAY_SIZE, DEFAULT_STMT, GET_STMT)     unsigned char NAME##_used;
341 # include "coregl_fastpath_state.h"
342 #undef GLUE_STATE
343
344 } GLGlueContext;
345
346 typedef struct _GLGlueContext_List {
347         GLGlueContext              *gctx;
348         struct _GLGlueContext_List *prev;
349         struct _GLGlueContext_List *next;
350 } GLGlueContext_List;
351
352 extern GLGlueContext_List *gctx_list;
353
354 extern GLGlueContext *initial_ctx;
355
356 extern void                init_modules_fastpath();
357 extern void                deinit_modules_fastpath();
358 extern void                init_modules_tstate_fastpath(GLThreadState *tstate);
359 extern void                deinit_modules_tstate_fastpath(
360         GLThreadState *tstate);
361
362 extern void                fastpath_apply_overrides();
363 extern void                fastpath_apply_overrides_egl(int enable);
364 extern void                fastpath_apply_overrides_gl(int enable);
365
366 extern int                 fastpath_init_context_states(GLGlueContext *ctx);
367 extern int                 fastpath_make_context_current(GLGlueContext *oldctx,
368                 GLGlueContext *newctx);
369
370 #ifdef COREGL_FASTPATH_TRACE_STATE_INFO
371 extern void                fastpath_dump_context_states(GLGlueContext *ctx,
372                 int force_output);
373 #endif // COREGL_FASTPATH_TRACE_STATE_INFO
374
375 // Context state functions
376 extern int                 fastpath_add_context_state_to_list(const void *data,
377                 const int datalen, GLContextState *cstate, Mutex *mtx);
378 extern int                 fastpath_remove_context_states_from_list(
379         GLContextState *cstate, Mutex *mtx);
380 extern GLContextState     *fastpath_get_context_state_from_list(
381         const void *data, const int datalen, Mutex *mtx);
382
383 // Shared object state functions
384 extern void                fastpath_ostate_init(GL_Object_State *ostate);
385 extern void                fastpath_sostate_init(GL_Shared_Object_State
386                 *ostate);
387 extern void                fastpath_ostate_deinit(GL_Object_State *ostate);
388 extern void                fastpath_sostate_deinit(GL_Shared_Object_State
389                 *ostate);
390 extern GLuint              fastpath_ostate_create_object(
391         GL_Object_State *ostate, GL_Object_Type type, GLuint name);
392 extern GLuint              fastpath_ostate_remove_object(
393         GL_Object_State *ostate, GL_Object_Type type, GLuint glue_name);
394 extern GLuint              fastpath_ostate_get_object(GL_Object_State *ostate,
395                 GL_Object_Type type, GLuint name);
396 extern GLuint              fastpath_ostate_find_object(GL_Object_State *ostate,
397                 GL_Object_Type type, GLuint real_name);
398 extern GLint               fastpath_ostate_use_object(GL_Object_State *ostate,
399                 GL_Object_Type type, GLuint glue_name);
400 extern GLint               fastpath_ostate_set_object_tag(
401         GL_Object_State *ostate, GL_Object_Type type, GLuint glue_name, GLvoid *tag);
402 extern GLvoid             *fastpath_ostate_get_object_tag(
403         GL_Object_State *ostate, GL_Object_Type type, GLuint glue_name);
404
405 // GL context management functions
406 extern void                fastpath_release_gl_context(GLGlueContext *gctx);
407
408 // State query functions
409 extern void                fastpath_state_get_draw_buffers(GLenum *params);
410
411 #endif // COREGL_FASTPATH_H
412