1 #ifndef EVAS_ENGINE_GL_GENERIC_H__
2 # define EVAS_ENGINE_GL_GENERIC_H__
3
4 #include "../software_generic/Evas_Engine_Software_Generic.h"
5 #include "Evas_Engine_GL_Shared.h"
6
7 #include "../gl_common/evas_gl_common.h"
8 #include "../gl_common/evas_gl_core.h"
9 #include "../gl_common/evas_gl_core_private.h"
10
11 typedef struct _Render_Engine_GL_Generic Render_Engine_GL_Generic;
12 typedef struct _Render_Output_GL_Generic Render_Output_GL_Generic;
13 typedef struct _Context_3D Context_3D;
14
15 typedef void (*Window_Use)(Outbuf *ob);
16 typedef Evas_Engine_GL_Context *(*Window_GL_Context_Get)(Outbuf *ob);
17 typedef void *(*Window_EGL_Display_Get)(Outbuf *ob);
18 typedef Context_3D *(*Window_GL_Context_New)(Outbuf *ob);
19 typedef void (*Window_GL_Context_Use)(Context_3D *ctx);
20
21 struct _Render_Engine_GL_Generic
22 {
23 Render_Engine_Software_Generic software;
24
25 Render_Output_GL_Generic *current;
26
27 struct {
28 Evas_Object_Image_Pixels_Get_Cb get_pixels;
29 void *get_pixels_data;
30 Evas_Object *obj;
31 } func;
32
33 Eina_Bool evgl_initted : 1;
34 };
35
36 struct _Render_Output_GL_Generic
37 {
38 Render_Output_Software_Generic software;
39
40 Window_Use window_use;
41 Window_GL_Context_Get window_gl_context_get;
42 Window_EGL_Display_Get window_egl_display_get;
43 Window_GL_Context_New window_gl_context_new;
44 Window_GL_Context_Use window_gl_context_use;
45
46 Context_3D *context_3d;
47 const EVGL_Interface *evgl_funcs;
48 };
49
50 static inline Eina_Bool
evas_render_engine_gl_generic_init(Render_Engine_Software_Generic * engine,Render_Output_GL_Generic * re,Outbuf * ob,Outbuf_Swap_Mode_Get outbuf_swap_mode_get,Outbuf_Get_Rot outbuf_get_rot,Outbuf_Reconfigure outbuf_reconfigure,Outbuf_Region_First_Rect outbuf_region_first_rect,Outbuf_Damage_Region_Set outbuf_damage_region_set,Outbuf_New_Region_For_Update outbuf_new_region_for_update,Outbuf_Push_Updated_Region outbuf_push_updated_region,Outbuf_Free_Region_For_Update outbuf_free_region_for_update,Outbuf_Idle_Flush outbuf_idle_flush,Outbuf_Flush outbuf_flush,Outbuf_Redraws_Clear outbuf_redraws_clear,Outbuf_Free outbuf_free,Window_Use window_use,Window_GL_Context_Get window_gl_context_get,Window_EGL_Display_Get window_egl_display_get,Window_GL_Context_New window_gl_context_new,Window_GL_Context_Use window_gl_context_use,const EVGL_Interface * evgl_funcs,int w,int h)51 evas_render_engine_gl_generic_init(Render_Engine_Software_Generic *engine,
52 Render_Output_GL_Generic *re,
53 Outbuf *ob,
54 Outbuf_Swap_Mode_Get outbuf_swap_mode_get,
55 Outbuf_Get_Rot outbuf_get_rot,
56 Outbuf_Reconfigure outbuf_reconfigure,
57 Outbuf_Region_First_Rect outbuf_region_first_rect,
58 Outbuf_Damage_Region_Set outbuf_damage_region_set,
59 Outbuf_New_Region_For_Update outbuf_new_region_for_update,
60 Outbuf_Push_Updated_Region outbuf_push_updated_region,
61 Outbuf_Free_Region_For_Update outbuf_free_region_for_update,
62 Outbuf_Idle_Flush outbuf_idle_flush,
63 Outbuf_Flush outbuf_flush,
64 Outbuf_Redraws_Clear outbuf_redraws_clear,
65 Outbuf_Free outbuf_free,
66 Window_Use window_use,
67 Window_GL_Context_Get window_gl_context_get,
68 Window_EGL_Display_Get window_egl_display_get,
69 Window_GL_Context_New window_gl_context_new,
70 Window_GL_Context_Use window_gl_context_use,
71 const EVGL_Interface *evgl_funcs,
72 int w, int h)
73 {
74 if (!evas_render_engine_software_generic_init(engine, &re->software, ob,
75 outbuf_swap_mode_get,
76 outbuf_get_rot,
77 outbuf_reconfigure,
78 outbuf_region_first_rect,
79 outbuf_damage_region_set,
80 outbuf_new_region_for_update,
81 outbuf_push_updated_region,
82 outbuf_free_region_for_update,
83 outbuf_idle_flush,
84 outbuf_flush,
85 outbuf_redraws_clear,
86 outbuf_free,
87 w, h))
88 return EINA_FALSE;
89
90 re->window_use = window_use;
91 re->window_gl_context_get = window_gl_context_get;
92 re->window_egl_display_get = window_egl_display_get;
93 re->window_gl_context_new = window_gl_context_new;
94 re->window_gl_context_use = window_gl_context_use;
95
96 re->context_3d = NULL;
97 re->evgl_funcs = evgl_funcs;
98
99 evas_render_engine_software_generic_tile_strict_set(&re->software, EINA_TRUE);
100
101 return EINA_TRUE;
102 }
103
104 static inline Evas_Engine_GL_Context *
gl_generic_context_get(Render_Output_GL_Generic * output,Eina_Bool use)105 gl_generic_context_get(Render_Output_GL_Generic *output, Eina_Bool use)
106 {
107 if (!output->software.ob) return NULL;
108 if (use) output->window_use(output->software.ob);
109 return output->window_gl_context_get(output->software.ob);
110
111 }
112
113 static inline void
gl_generic_window_use(void * engine)114 gl_generic_window_use(void *engine)
115 {
116 Render_Output_GL_Generic *re = engine;
117
118 re->window_use(re->software.ob);
119 }
120
121 static inline Evas_Engine_GL_Context *
gl_generic_context_find(Render_Engine_GL_Generic * engine,Eina_Bool use)122 gl_generic_context_find(Render_Engine_GL_Generic *engine, Eina_Bool use)
123 {
124 Render_Output_GL_Generic *output;
125 Evas_Engine_GL_Context *r = NULL;
126 Eina_List *l;
127
128 EINA_LIST_FOREACH(engine->software.outputs, l, output)
129 {
130 r = gl_generic_context_get(output, use);
131 if (r) return r;
132 }
133
134 return r;
135 }
136
137 static inline void
gl_generic_window_find(Render_Engine_GL_Generic * engine)138 gl_generic_window_find(Render_Engine_GL_Generic *engine)
139 {
140 Render_Output_GL_Generic *output;
141 Eina_List *l;
142
143 EINA_LIST_FOREACH(engine->software.outputs, l, output)
144 {
145 if (!output->software.ob) continue;
146 gl_generic_window_use(output);
147 break;
148 }
149 }
150
151 static inline void *
gl_generic_any_output_get(Render_Engine_GL_Generic * engine)152 gl_generic_any_output_get(Render_Engine_GL_Generic *engine)
153 {
154 Render_Output_GL_Generic *output;
155 Eina_List *l;
156
157 EINA_LIST_FOREACH(engine->software.outputs, l, output)
158 {
159 if (!output->software.ob) continue;
160 return output->software.ob;
161 }
162
163 return NULL;
164 }
165
166 static inline Render_Output_GL_Generic *
gl_generic_output_find(Render_Engine_GL_Generic * engine)167 gl_generic_output_find(Render_Engine_GL_Generic *engine)
168 {
169 Render_Output_GL_Generic *output;
170 Eina_List *l;
171
172 EINA_LIST_FOREACH(engine->software.outputs, l, output)
173 {
174 if (!output->software.ob) continue;
175 return output;
176 }
177
178 return NULL;
179 }
180
181
182 #endif
183