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