Evas: Support cserve2 for xcb engine.

SVN revision: 73033
This commit is contained in:
Christopher Michael 2012-06-29 12:01:34 +00:00
parent 725a3ed4db
commit 0d1c4661ab
2 changed files with 139 additions and 25 deletions

View File

@ -35,6 +35,7 @@ AM_CPPFLAGS = \
-I. \ -I. \
-I$(top_srcdir)/src/lib \ -I$(top_srcdir)/src/lib \
-I$(top_srcdir)/src/lib/include \ -I$(top_srcdir)/src/lib/include \
-I$(top_srcdir)/src/lib/cserve2 \
-I$(top_srcdir)/src/modules/engines \ -I$(top_srcdir)/src/modules/engines \
@FREETYPE_CFLAGS@ \ @FREETYPE_CFLAGS@ \
@PIXMAN_CFLAGS@ \ @PIXMAN_CFLAGS@ \

View File

@ -1,9 +1,17 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <pixman.h>
#ifdef EVAS_CSERVE2
# include "evas_cs2_private.h"
#endif
#include "evas_common.h" #include "evas_common.h"
#include "evas_macros.h" #include "evas_macros.h"
#include "evas_xcb_outbuf.h" #include "evas_xcb_outbuf.h"
#include "evas_xcb_buffer.h" #include "evas_xcb_buffer.h"
#include "evas_xcb_color.h" #include "evas_xcb_color.h"
#include <pixman.h>
/* local structures */ /* local structures */
typedef struct _Outbuf_Region Outbuf_Region; typedef struct _Outbuf_Region Outbuf_Region;
@ -46,7 +54,13 @@ evas_software_xcb_outbuf_free(Outbuf *buf)
eina_list_remove_list(buf->priv.pending_writes, eina_list_remove_list(buf->priv.pending_writes,
buf->priv.pending_writes); buf->priv.pending_writes);
obr = im->extended_info; obr = im->extended_info;
evas_cache_image_drop(&im->cache_entry); #ifdef EVAS_CSERVE2
if (evas_cserve2_use_get())
evas_cache2_image_close(&im->cache_entry);
else
#endif
evas_cache_image_drop(&im->cache_entry);
if (obr->xcbob) _unfind_xcbob(obr->xcbob, EINA_FALSE); if (obr->xcbob) _unfind_xcbob(obr->xcbob, EINA_FALSE);
if (obr->mask) _unfind_xcbob(obr->mask, EINA_FALSE); if (obr->mask) _unfind_xcbob(obr->mask, EINA_FALSE);
free(obr); free(obr);
@ -281,11 +295,25 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
free(obr); free(obr);
return NULL; return NULL;
} }
im = #ifdef EVAS_CSERVE2
(RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), if (evas_cserve2_use_get())
buf->w, buf->h, {
(DATA32 *)evas_software_xcb_output_buffer_data(obr->xcbob, &bpl), im =
alpha, EVAS_COLORSPACE_ARGB8888); (RGBA_Image *)evas_cache2_image_data(evas_common_image_cache2_get(),
buf->w, buf->h,
(DATA32 *)evas_software_xcb_output_buffer_data(obr->xcbob, &bpl),
alpha, EVAS_COLORSPACE_ARGB8888);
}
else
#endif
{
im =
(RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(),
buf->w, buf->h,
(DATA32 *)evas_software_xcb_output_buffer_data(obr->xcbob, &bpl),
alpha, EVAS_COLORSPACE_ARGB8888);
}
if (!im) if (!im)
{ {
evas_software_xcb_output_buffer_free(obr->xcbob, EINA_FALSE); evas_software_xcb_output_buffer_free(obr->xcbob, EINA_FALSE);
@ -306,15 +334,32 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
{ {
int bw = 0, bh = 0; int bw = 0, bh = 0;
im = #ifdef EVAS_CSERVE2
(RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get()); if (evas_cserve2_use_get())
{
im =
(RGBA_Image *)evas_cache2_image_empty(evas_common_image_cache2_get());
}
else
#endif
{
im =
(RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
}
if (!im) if (!im)
{ {
free(obr); free(obr);
return NULL; return NULL;
} }
im->cache_entry.flags.alpha |= (alpha ? 1 : 0); im->cache_entry.flags.alpha |= (alpha ? 1 : 0);
evas_cache_image_surface_alloc(&im->cache_entry, buf->w, buf->h); #ifdef EVAS_CSERVE2
if (evas_cserve2_use_get())
evas_cache2_image_surface_alloc(&im->cache_entry, buf->w, buf->h);
else
#endif
evas_cache_image_surface_alloc(&im->cache_entry, buf->w, buf->h);
im->extended_info = obr; im->extended_info = obr;
if ((buf->rot == 0) || (buf->rot == 180)) if ((buf->rot == 0) || (buf->rot == 180))
{ {
@ -333,7 +378,13 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
bw, bh, use_shm, NULL); bw, bh, use_shm, NULL);
if (!obr->xcbob) if (!obr->xcbob)
{ {
evas_cache_image_drop(&im->cache_entry); #ifdef EVAS_CSERVE2
if (evas_cserve2_use_get())
evas_cache2_image_close(&im->cache_entry);
else
#endif
evas_cache_image_drop(&im->cache_entry);
free(obr); free(obr);
return NULL; return NULL;
} }
@ -381,11 +432,25 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
free(obr); free(obr);
return NULL; return NULL;
} }
im = #ifdef EVAS_CSERVE2
(RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), if (evas_cserve2_use_get())
w, h, {
(DATA32 *)evas_software_xcb_output_buffer_data(obr->xcbob, &bpl), im =
alpha, EVAS_COLORSPACE_ARGB8888); (RGBA_Image *)evas_cache2_image_data(evas_common_image_cache2_get(),
w, h,
(DATA32 *)evas_software_xcb_output_buffer_data(obr->xcbob, &bpl),
alpha, EVAS_COLORSPACE_ARGB8888);
}
else
#endif
{
im =
(RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(),
w, h,
(DATA32 *)evas_software_xcb_output_buffer_data(obr->xcbob, &bpl),
alpha, EVAS_COLORSPACE_ARGB8888);
}
if (!im) if (!im)
{ {
_unfind_xcbob(obr->xcbob, EINA_FALSE); _unfind_xcbob(obr->xcbob, EINA_FALSE);
@ -404,15 +469,32 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
{ {
int bw = 0, bh = 0; int bw = 0, bh = 0;
im = #ifdef EVAS_CSERVE2
(RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get()); if (evas_cserve2_use_get())
{
im =
(RGBA_Image *)evas_cache2_image_empty(evas_common_image_cache2_get());
}
else
#endif
{
im =
(RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
}
if (!im) if (!im)
{ {
free(obr); free(obr);
return NULL; return NULL;
} }
im->cache_entry.flags.alpha |= (alpha ? 1 : 0); im->cache_entry.flags.alpha |= (alpha ? 1 : 0);
evas_cache_image_surface_alloc(&im->cache_entry, w, h); #ifdef EVAS_CSERVE2
if (evas_cserve2_use_get())
evas_cache2_image_surface_alloc(&im->cache_entry, w, h);
else
#endif
evas_cache_image_surface_alloc(&im->cache_entry, w, h);
im->extended_info = obr; im->extended_info = obr;
if ((buf->rot == 0) || (buf->rot == 180)) if ((buf->rot == 0) || (buf->rot == 180))
{ {
@ -429,7 +511,12 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
buf->priv.x11.xcb.depth, bw, bh, use_shm, NULL); buf->priv.x11.xcb.depth, bw, bh, use_shm, NULL);
if (!obr->xcbob) if (!obr->xcbob)
{ {
evas_cache_image_drop(&im->cache_entry); #ifdef EVAS_CSERVE2
if (evas_cserve2_use_get())
evas_cache2_image_close(&im->cache_entry);
else
#endif
evas_cache_image_drop(&im->cache_entry);
free(obr); free(obr);
return NULL; return NULL;
} }
@ -567,7 +654,13 @@ evas_software_xcb_outbuf_flush(Outbuf *buf)
eina_list_remove_list(buf->priv.prev_pending_writes, eina_list_remove_list(buf->priv.prev_pending_writes,
buf->priv.prev_pending_writes); buf->priv.prev_pending_writes);
obr = im->extended_info; obr = im->extended_info;
evas_cache_image_drop(&im->cache_entry); # ifdef EVAS_CSERVE2
if (evas_cserve2_use_get())
evas_cache2_image_close(&im->cache_entry);
else
# endif
evas_cache_image_drop(&im->cache_entry);
if (obr->xcbob) _unfind_xcbob(obr->xcbob, EINA_FALSE); if (obr->xcbob) _unfind_xcbob(obr->xcbob, EINA_FALSE);
if (obr->mask) _unfind_xcbob(obr->mask, EINA_FALSE); if (obr->mask) _unfind_xcbob(obr->mask, EINA_FALSE);
free(obr); free(obr);
@ -586,11 +679,21 @@ evas_software_xcb_outbuf_flush(Outbuf *buf)
eina_list_remove_list(buf->priv.pending_writes, eina_list_remove_list(buf->priv.pending_writes,
buf->priv.pending_writes); buf->priv.pending_writes);
obr = im->extended_info; obr = im->extended_info;
evas_cache_image_drop(&im->cache_entry); # ifdef EVAS_CSERVE2
if (evas_cserve2_use_get())
evas_cache2_image_close(&im->cache_entry);
else
# endif
evas_cache_image_drop(&im->cache_entry);
if (obr->xcbob) _unfind_xcbob(obr->xcbob, EINA_FALSE); if (obr->xcbob) _unfind_xcbob(obr->xcbob, EINA_FALSE);
if (obr->mask) _unfind_xcbob(obr->mask, EINA_FALSE); if (obr->mask) _unfind_xcbob(obr->mask, EINA_FALSE);
free(obr); free(obr);
evas_cache_image_drop(&im->cache_entry); # ifdef EVAS_CSERVE2
if (evas_cserve2_use_get())
evas_cache2_image_close(&im->cache_entry);
else
# endif
evas_cache_image_drop(&im->cache_entry);
} }
#endif #endif
} }
@ -613,7 +716,12 @@ evas_software_xcb_outbuf_idle_flush(Outbuf *buf)
if (obr->mask) if (obr->mask)
evas_software_xcb_output_buffer_free(obr->mask, EINA_FALSE); evas_software_xcb_output_buffer_free(obr->mask, EINA_FALSE);
free(obr); free(obr);
evas_cache_image_drop(&im->cache_entry); # ifdef EVAS_CSERVE2
if (evas_cserve2_use_get())
evas_cache2_image_close(&im->cache_entry);
else
# endif
evas_cache_image_drop(&im->cache_entry);
} }
else else
{ {
@ -629,7 +737,12 @@ evas_software_xcb_outbuf_idle_flush(Outbuf *buf)
eina_list_remove_list(buf->priv.prev_pending_writes, eina_list_remove_list(buf->priv.prev_pending_writes,
buf->priv.prev_pending_writes); buf->priv.prev_pending_writes);
obr = im->extended_info; obr = im->extended_info;
evas_cache_image_drop(&im->cache_entry); # ifdef EVAS_CSERVE2
if (evas_cserve2_use_get())
evas_cache2_image_close(&im->cache_entry);
else
# endif
evas_cache_image_drop(&im->cache_entry);
if (obr->xcbob) _unfind_xcbob(obr->xcbob, EINA_FALSE); if (obr->xcbob) _unfind_xcbob(obr->xcbob, EINA_FALSE);
if (obr->mask) _unfind_xcbob(obr->mask, EINA_FALSE); if (obr->mask) _unfind_xcbob(obr->mask, EINA_FALSE);
free(obr); free(obr);