1 #include "evas_common.h"
2 #include "evas_private.h"
4 #include "Evas_Engine_Software_X11.h"
5 #include "evas_engine.h"
7 #ifdef BUILD_ENGINE_SOFTWARE_XLIB
8 # include "evas_xlib_outbuf.h"
9 # include "evas_xlib_color.h"
12 #ifdef BUILD_ENGINE_SOFTWARE_XCB
13 # include "evas_xcb_outbuf.h"
14 # include "evas_xcb_color.h"
17 int _evas_engine_soft_x11_log_dom = -1;
19 /* function tables - filled in later (func and parent func) */
20 static Evas_Func func, pfunc;
22 #ifdef BUILD_ENGINE_SOFTWARE_XLIB
29 static struct xrdb_user xrdb_user = {0, 0, NULL};
32 xrdb_user_query(const char *name, const char *cls, char **type, XrmValue *val)
36 last = xrdb_user.last_stat;
39 xrdb_user.last_stat = now;
40 if (last != now) /* don't stat() more than once every second */
46 if (!(home = getenv("HOME")))
49 snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home);
50 if (stat(tmp, &st) != 0) goto failed;
51 if (xrdb_user.last_mtime != st.st_mtime)
53 if (xrdb_user.db) XrmDestroyDatabase(xrdb_user.db);
54 xrdb_user.db = XrmGetFileDatabase(tmp);
55 if (!xrdb_user.db) goto failed;
56 xrdb_user.last_mtime = st.st_mtime;
60 if (!xrdb_user.db) return EINA_FALSE;
61 return XrmGetResource(xrdb_user.db, name, cls, type, val);
66 XrmDestroyDatabase(xrdb_user.db);
69 xrdb_user.last_mtime = 0;
74 /* engine struct data */
75 typedef struct _Render_Engine Render_Engine;
82 Eina_Inlist *cur_rect;
83 unsigned char end : 1;
85 #ifdef BUILD_ENGINE_SOFTWARE_XLIB
93 #ifdef EVAS_FRAME_QUEUING
94 Evas_Engine_Render_Mode render_mode;
97 void (*outbuf_free)(Outbuf *ob);
98 void (*outbuf_reconfigure)(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth);
99 int (*outbuf_get_rot)(Outbuf *ob);
100 RGBA_Image *(*outbuf_new_region_for_update)(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch);
101 void (*outbuf_push_updated_region)(Outbuf *ob, RGBA_Image *update, int x, int y, int w, int h);
102 void (*outbuf_free_region_for_update)(Outbuf *ob, RGBA_Image *update);
103 void (*outbuf_flush)(Outbuf *ob);
104 void (*outbuf_idle_flush)(Outbuf *ob);
105 Eina_Bool (*outbuf_alpha_get)(Outbuf *ob);
106 #ifdef EVAS_FRAME_QUEUING
107 void (*outbuf_set_priv)(Outbuf *ob, void *cur, void *prev);
111 /* prototypes we will use here */
112 static void *_best_visual_get(int backend, void *connection, int screen);
113 static unsigned int _best_colormap_get(int backend, void *connection, int screen);
114 static int _best_depth_get(int backend, void *connection, int screen);
116 static void *eng_info(Evas *e);
117 static void eng_info_free(Evas *e, void *info);
118 static int eng_setup(Evas *e, void *info);
119 static void eng_output_free(void *data);
120 static void eng_output_resize(void *data, int w, int h);
121 static void eng_output_tile_size_set(void *data, int w, int h);
122 static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h);
123 static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h);
124 static void eng_output_redraws_clear(void *data);
125 static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
126 static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
127 static void eng_output_flush(void *data);
128 static void eng_output_idle_flush(void *data);
130 /* internal engine routines */
132 #ifdef BUILD_ENGINE_SOFTWARE_XLIB
134 _output_xlib_setup(int w, int h, int rot, Display *disp, Drawable draw,
135 Visual *vis, Colormap cmap, int depth, int debug,
136 int grayscale, int max_colors, Pixmap mask,
137 int shape_dither, int destination_alpha)
144 if (!(re = calloc(1, sizeof(Render_Engine)))) return NULL;
146 evas_software_xlib_x_init();
147 evas_software_xlib_x_color_init();
148 evas_software_xlib_outbuf_init();
150 re->xr.dpi = 75000; // dpy * 1000
152 status = xrdb_user_query("Xft.dpi", "Xft.Dpi", &type, &val);
153 if ((!status) || (!type))
155 if (!re->xrdb) re->xrdb = XrmGetDatabase(disp);
157 status = XrmGetResource(re->xrdb,
158 "Xft.dpi", "Xft.Dpi", &type, &val);
161 if ((status) && (type))
163 if (!strcmp(type, "String"))
165 const char *str, *dp;
168 dp = strchr(str, '.');
169 if (!dp) dp = strchr(str, ',');
176 buf = alloca(dp - str + 1);
177 strncpy(buf, str, dp - str);
179 len = strlen(dp + 1);
180 subdpi = atoi(dp + 1);
184 for (i = len; i < 3; i++)
189 for (i = len; i > 3; i--)
192 re->xr.dpi = atoi(buf) * 1000;
195 re->xr.dpi = atoi(str) * 1000;
196 evas_common_font_dpi_set(re->xr.dpi / 1000);
201 evas_software_xlib_outbuf_setup_x(w, h, rot, OUTBUF_DEPTH_INHERIT, disp,
202 draw, vis, cmap, depth, grayscale,
203 max_colors, mask, shape_dither,
211 /* for updates return 1 big buffer, but only use portions of it, also cache
212 * it and keepit around until an idle_flush */
214 /* disable for now - i am hunting down why some expedite tests are slower,
215 * as well as shaped stuff is broken and probable non-32bpp is broken as
216 * convert funcs dont do the right thing
219 // re->ob->onebuf = 1;
221 evas_software_xlib_outbuf_debug_set(re->ob, debug);
222 re->tb = evas_common_tilebuf_new(w, h);
225 evas_software_xlib_outbuf_free(re->ob);
230 /* in preliminary tests 16x16 gave highest framerates */
231 evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
236 #ifdef BUILD_ENGINE_SOFTWARE_XCB
238 _output_xcb_setup(int w, int h, int rot, xcb_connection_t *conn,
239 xcb_screen_t *screen, xcb_drawable_t draw,
240 xcb_visualtype_t *vis, xcb_colormap_t cmap, int depth,
241 int debug, int grayscale, int max_colors, xcb_drawable_t mask,
242 int shape_dither, int destination_alpha)
246 if (!(re = calloc(1, sizeof(Render_Engine)))) return NULL;
248 evas_software_xcb_init();
249 evas_software_xcb_color_init();
250 evas_software_xcb_outbuf_init();
253 re->xr.dpi = 75000; // dpy * 1000
254 evas_common_font_dpi_set(re->xr.dpi / 1000);
257 evas_software_xcb_outbuf_setup(w, h, rot, OUTBUF_DEPTH_INHERIT, conn,
258 screen, draw, vis, cmap, depth,
259 grayscale, max_colors, mask,
260 shape_dither, destination_alpha);
267 /* for updates return 1 big buffer, but only use portions of it, also cache
268 * it and keepit around until an idle_flush */
270 /* disable for now - i am hunting down why some expedite tests are slower,
271 * as well as shaped stuff is broken and probable non-32bpp is broken as
272 * convert funcs dont do the right thing
275 // re->ob->onebuf = 1;
277 evas_software_xcb_outbuf_debug_set(re->ob, debug);
279 re->tb = evas_common_tilebuf_new(w, h);
282 evas_software_xcb_outbuf_free(re->ob);
287 /* in preliminary tests 16x16 gave highest framerates */
288 evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
294 _best_visual_get(int backend, void *connection, int screen)
296 if (!connection) return NULL;
298 #ifdef BUILD_ENGINE_SOFTWARE_XLIB
299 if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
300 return DefaultVisual((Display *)connection, screen);
303 #ifdef BUILD_ENGINE_SOFTWARE_XCB
304 if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB)
306 xcb_screen_iterator_t iter_screen;
307 xcb_depth_iterator_t iter_depth;
308 xcb_screen_t *s = NULL;
311 xcb_setup_roots_iterator(xcb_get_setup((xcb_connection_t *)connection));
312 for (; iter_screen.rem; --screen, xcb_screen_next(&iter_screen))
315 s = iter_screen.data;
319 iter_depth = xcb_screen_allowed_depths_iterator(s);
320 for (; iter_depth.rem; xcb_depth_next(&iter_depth))
322 xcb_visualtype_iterator_t iter_vis;
324 iter_vis = xcb_depth_visuals_iterator(iter_depth.data);
325 for (; iter_vis.rem; xcb_visualtype_next(&iter_vis))
327 if (s->root_visual == iter_vis.data->visual_id)
328 return iter_vis.data;
338 _best_colormap_get(int backend, void *connection, int screen)
340 if (!connection) return 0;
342 #ifdef BUILD_ENGINE_SOFTWARE_XLIB
343 if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
344 return DefaultColormap((Display *)connection, screen);
347 #ifdef BUILD_ENGINE_SOFTWARE_XCB
348 if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB)
350 xcb_screen_iterator_t iter_screen;
351 xcb_screen_t *s = NULL;
354 xcb_setup_roots_iterator(xcb_get_setup((xcb_connection_t *)connection));
355 for (; iter_screen.rem; --screen, xcb_screen_next(&iter_screen))
358 s = iter_screen.data;
362 return s->default_colormap;
370 _best_depth_get(int backend, void *connection, int screen)
372 if (!connection) return 0;
374 #ifdef BUILD_ENGINE_SOFTWARE_XLIB
375 if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
376 return DefaultDepth((Display *)connection, screen);
379 #ifdef BUILD_ENGINE_SOFTWARE_XCB
380 if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB)
382 xcb_screen_iterator_t iter_screen;
383 xcb_screen_t *s = NULL;
386 xcb_setup_roots_iterator(xcb_get_setup((xcb_connection_t *)connection));
387 for (; iter_screen.rem; --screen, xcb_screen_next(&iter_screen))
390 s = iter_screen.data;
394 return s->root_depth;
401 /* engine api this module provides */
403 eng_info(Evas *e __UNUSED__)
405 Evas_Engine_Info_Software_X11 *info;
407 if (!(info = calloc(1, sizeof(Evas_Engine_Info_Software_X11))))
410 info->magic.magic = rand();
411 info->info.debug = 0;
412 info->info.alloc_grayscale = 0;
413 info->info.alloc_colors_max = 216;
414 info->func.best_visual_get = _best_visual_get;
415 info->func.best_colormap_get = _best_colormap_get;
416 info->func.best_depth_get = _best_depth_get;
417 info->render_mode = EVAS_RENDER_MODE_BLOCKING;
422 eng_info_free(Evas *e __UNUSED__, void *info)
424 Evas_Engine_Info_Software_X11 *in;
426 in = (Evas_Engine_Info_Software_X11 *)info;
431 eng_setup(Evas *e, void *in)
433 Evas_Engine_Info_Software_X11 *info;
434 Render_Engine *re = NULL;
436 info = (Evas_Engine_Info_Software_X11 *)in;
437 if (!e->engine.data.output)
439 /* if we haven't initialized - init (automatic abort if already done) */
440 evas_common_cpu_init();
441 evas_common_blend_init();
442 evas_common_image_init();
443 evas_common_convert_init();
444 evas_common_scale_init();
445 evas_common_rectangle_init();
446 evas_common_polygon_init();
447 evas_common_line_init();
448 evas_common_font_init();
449 evas_common_draw_init();
450 evas_common_tilebuf_init();
452 #ifdef BUILD_ENGINE_SOFTWARE_XLIB
453 if (info->info.backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
455 re = _output_xlib_setup(e->output.w, e->output.h,
456 info->info.rotation, info->info.connection,
457 info->info.drawable, info->info.visual,
459 info->info.depth, info->info.debug,
460 info->info.alloc_grayscale,
461 info->info.alloc_colors_max,
462 info->info.mask, info->info.shape_dither,
463 info->info.destination_alpha);
465 re->outbuf_free = evas_software_xlib_outbuf_free;
466 re->outbuf_reconfigure = evas_software_xlib_outbuf_reconfigure;
467 re->outbuf_get_rot = evas_software_xlib_outbuf_get_rot;
468 re->outbuf_new_region_for_update =
469 evas_software_xlib_outbuf_new_region_for_update;
470 re->outbuf_push_updated_region =
471 evas_software_xlib_outbuf_push_updated_region;
472 re->outbuf_free_region_for_update =
473 evas_software_xlib_outbuf_free_region_for_update;
474 re->outbuf_flush = evas_software_xlib_outbuf_flush;
475 re->outbuf_idle_flush = evas_software_xlib_outbuf_idle_flush;
476 re->outbuf_alpha_get = evas_software_xlib_outbuf_alpha_get;
477 # ifdef EVAS_FRAME_QUEUING
478 re->outbuf_set_priv = evas_software_xlib_outbuf_set_priv;
479 re->render_mode = info->render_mode;
484 #ifdef BUILD_ENGINE_SOFTWARE_XCB
485 if (info->info.backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB)
487 re = _output_xcb_setup(e->output.w, e->output.h,
488 info->info.rotation, info->info.connection,
489 info->info.screen, info->info.drawable,
490 info->info.visual, info->info.colormap,
491 info->info.depth, info->info.debug,
492 info->info.alloc_grayscale,
493 info->info.alloc_colors_max,
494 info->info.mask, info->info.shape_dither,
495 info->info.destination_alpha);
497 re->outbuf_free = evas_software_xcb_outbuf_free;
498 re->outbuf_reconfigure = evas_software_xcb_outbuf_reconfigure;
499 re->outbuf_get_rot = evas_software_xcb_outbuf_rotation_get;
500 re->outbuf_new_region_for_update =
501 evas_software_xcb_outbuf_new_region_for_update;
502 re->outbuf_push_updated_region =
503 evas_software_xcb_outbuf_push_updated_region;
504 re->outbuf_free_region_for_update =
505 evas_software_xcb_outbuf_free_region_for_update;
506 re->outbuf_flush = evas_software_xcb_outbuf_flush;
507 re->outbuf_idle_flush = evas_software_xcb_outbuf_idle_flush;
508 re->outbuf_alpha_get = evas_software_xcb_outbuf_alpha_get;
509 # ifdef EVAS_FRAME_QUEUING
510 re->outbuf_set_priv = evas_software_xcb_outbuf_priv_set;
511 re->render_mode = info->render_mode;
516 e->engine.data.output = re;
522 #ifdef EVAS_FRAME_QUEUING
523 evas_common_frameq_flush();
525 re = e->engine.data.output;
526 ponebuf = re->ob->onebuf;
528 #ifdef BUILD_ENGINE_SOFTWARE_XLIB
529 if (info->info.backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
531 evas_software_xlib_outbuf_free(re->ob);
533 evas_software_xlib_outbuf_setup_x(e->output.w, e->output.h,
535 OUTBUF_DEPTH_INHERIT,
536 info->info.connection,
541 info->info.alloc_grayscale,
542 info->info.alloc_colors_max,
544 info->info.shape_dither,
545 info->info.destination_alpha);
547 evas_software_xlib_outbuf_debug_set(re->ob, info->info.debug);
548 # ifdef EVAS_FRAME_QUEUING
549 re->render_mode = info->render_mode;
554 #ifdef BUILD_ENGINE_SOFTWARE_XCB
555 if (info->info.backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB)
557 evas_software_xcb_outbuf_free(re->ob);
559 evas_software_xcb_outbuf_setup(e->output.w, e->output.h,
561 OUTBUF_DEPTH_INHERIT,
562 info->info.connection,
568 info->info.alloc_grayscale,
569 info->info.alloc_colors_max,
571 info->info.shape_dither,
572 info->info.destination_alpha);
574 evas_software_xcb_outbuf_debug_set(re->ob, info->info.debug);
575 #ifdef EVAS_FRAME_QUEUING
576 re->render_mode = info->render_mode;
580 re->ob->onebuf = ponebuf;
582 if (!e->engine.data.output) return 0;
583 if (!e->engine.data.context)
585 e->engine.data.context =
586 e->engine.func->context_new(e->engine.data.output);
589 re = e->engine.data.output;
595 eng_output_free(void *data)
599 #ifdef BUILD_ENGINE_SOFTWARE_XLIB
600 // NOTE: XrmGetDatabase() result is shared per connection, do not free it.
601 // if (re->xrdb) XrmDestroyDatabase(re->xrdb);
604 if ((re = (Render_Engine *)data))
606 re->outbuf_free(re->ob);
607 evas_common_tilebuf_free(re->tb);
608 if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
612 evas_common_font_shutdown();
613 evas_common_image_shutdown();
617 eng_output_resize(void *data, int w, int h)
621 re = (Render_Engine *)data;
622 re->outbuf_reconfigure(re->ob, w, h, re->outbuf_get_rot(re->ob),
623 OUTBUF_DEPTH_INHERIT);
624 evas_common_tilebuf_free(re->tb);
625 re->tb = evas_common_tilebuf_new(w, h);
627 evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
631 eng_output_tile_size_set(void *data, int w, int h)
635 re = (Render_Engine *)data;
636 evas_common_tilebuf_set_tile_size(re->tb, w, h);
640 eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
644 re = (Render_Engine *)data;
645 evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
649 eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
653 re = (Render_Engine *)data;
654 evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
658 eng_output_redraws_clear(void *data)
662 re = (Render_Engine *)data;
663 evas_common_tilebuf_clear(re->tb);
667 eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
674 re = (Render_Engine *)data;
682 re->rects = evas_common_tilebuf_get_render_rects(re->tb);
683 re->cur_rect = EINA_INLIST_GET(re->rects);
685 if (!re->cur_rect) return NULL;
686 rect = (Tilebuf_Rect *)re->cur_rect;
687 ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h;
688 re->cur_rect = re->cur_rect->next;
691 evas_common_tilebuf_free_render_rects(re->rects);
697 re->outbuf_new_region_for_update(re->ob, ux, uy, uw, uh, cx, cy, cw, ch);
699 *x = ux; *y = uy; *w = uw; *h = uh;
704 eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
707 #ifdef EVAS_FRAME_QUEUING
708 Evas_Surface *e_surface;
711 re = (Render_Engine *)data;
712 #if defined(BUILD_PIPE_RENDER) && !defined(EVAS_FRAME_QUEUING)
713 evas_common_pipe_map_begin(surface);
714 #endif /* BUILD_PIPE_RENDER && !EVAS_FRAME_QUEUING*/
716 #ifdef EVAS_FRAME_QUEUING
717 if (re->render_mode == EVAS_RENDER_MODE_NONBLOCKING)
719 /* create a new frame if this is the first surface of this frame */
720 evas_common_frameq_prepare_frame();
721 /* add surface into the frame */
722 e_surface = evas_common_frameq_new_surface(surface, x, y, w, h);
723 evas_common_frameq_add_surface(e_surface);
728 re->outbuf_push_updated_region(re->ob, surface, x, y, w, h);
729 re->outbuf_free_region_for_update(re->ob, surface);
730 evas_common_cpu_end_opt();
733 #ifdef EVAS_FRAME_QUEUING
735 eng_image_map_surface_new(void *data , int w, int h, int alpha)
740 Evas_Surface *e_surface;
742 re = (Render_Engine *)data;
745 evas_cache_image_copied_data(evas_common_image_cache_get(), w, h, NULL,
746 alpha, EVAS_COLORSPACE_ARGB8888);
747 pixels = evas_cache_image_pixels(surface);
749 if (re->render_mode == EVAS_RENDER_MODE_NONBLOCKING)
751 /* create a new frame if this is the first surface of this frame */
752 evas_common_frameq_prepare_frame();
754 /* add surface into the frame */
755 e_surface = evas_common_frameq_new_surface(surface, 0, 0, w, h);
757 /* this surface is not going to be pushed to screen */
758 e_surface->dontpush = 1;
759 evas_common_frameq_add_surface(e_surface);
765 eng_output_frameq_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
769 re = (Render_Engine *)data;
770 re->outbuf_push_updated_region(re->ob, surface, x, y, w, h);
771 re->outbuf_free_region_for_update(re->ob, surface);
772 evas_common_cpu_end_opt();
776 eng_output_frameq_flush(void *data)
780 re = (Render_Engine *)data;
781 re->outbuf_flush(re->ob);
785 eng_output_frameq_set_priv(void *data, void *cur, void *prev)
789 re = (Render_Engine *)data;
790 re->outbuf_set_priv(re->ob, cur, prev);
795 eng_output_flush(void *data)
799 re = (Render_Engine *)data;
800 #ifdef EVAS_FRAME_QUEUING
801 if (re->render_mode == EVAS_RENDER_MODE_NONBLOCKING)
803 evas_common_frameq_set_frame_data(data,
804 eng_output_frameq_redraws_next_update_push,
805 eng_output_frameq_flush,
806 eng_output_frameq_set_priv);
807 evas_common_frameq_ready_frame();
808 evas_common_frameq_begin();
812 re->outbuf_flush(re->ob);
816 eng_output_idle_flush(void *data)
820 re = (Render_Engine *)data;
821 re->outbuf_idle_flush(re->ob);
825 eng_canvas_alpha_get(void *data, void *context __UNUSED__)
829 re = (Render_Engine *)data;
830 return (re->ob->priv.destination_alpha) || (re->outbuf_alpha_get(re->ob));
834 /* module advertising code */
836 module_open(Evas_Module *em)
838 #ifdef BUILD_ENGINE_SOFTWARE_XLIB
839 static Eina_Bool xrm_inited = EINA_FALSE;
843 xrm_inited = EINA_TRUE;
850 /* get whatever engine module we inherit from */
851 if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
853 _evas_engine_soft_x11_log_dom =
854 eina_log_domain_register("evas-software_x11", EVAS_DEFAULT_LOG_COLOR);
856 if (_evas_engine_soft_x11_log_dom < 0)
858 EINA_LOG_ERR("Can not create a module log domain.");
862 /* store it for later use */
865 /* now to override methods */
866 #define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
870 ORD(canvas_alpha_get);
873 ORD(output_tile_size_set);
874 ORD(output_redraws_rect_add);
875 ORD(output_redraws_rect_del);
876 ORD(output_redraws_clear);
877 ORD(output_redraws_next_update_get);
878 ORD(output_redraws_next_update_push);
880 ORD(output_idle_flush);
881 #ifdef EVAS_FRAME_QUEUING
882 ORD(image_map_surface_new);
885 /* now advertise out own api */
886 em->functions = (void *)(&func);
891 module_close(Evas_Module *em __UNUSED__)
893 eina_log_domain_unregister(_evas_engine_soft_x11_log_dom);
894 #ifdef BUILD_ENGINE_SOFTWARE_XLIB
897 XrmDestroyDatabase(xrdb_user.db);
898 xrdb_user.last_stat = 0;
899 xrdb_user.last_mtime = 0;
905 static Evas_Module_Api evas_modapi =
907 EVAS_MODULE_API_VERSION, "software_x11", "none",
914 EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, software_x11);
916 #ifndef EVAS_STATIC_BUILD_SOFTWARE_X11
917 EVAS_EINA_MODULE_DEFINE(engine, software_x11);