swapper infra work - handle if buffer sizes dont match... :)

SVN revision: 83764
This commit is contained in:
Carsten Haitzler 2013-02-08 07:23:31 +00:00
parent afd8a714f4
commit 5a80685803
3 changed files with 15 additions and 7 deletions

View File

@ -226,7 +226,8 @@ evas_software_xlib_swapbuf_new_region_for_update(Outbuf *buf, int x, int y, int
im = buf->priv.onebuf;
if (!im)
{
data = evas_xlib_swapper_buffer_map(buf->priv.swapper, &bpl);
data = evas_xlib_swapper_buffer_map(buf->priv.swapper, &bpl,
&(buf->w), &(buf->h));
#ifdef EVAS_CSERVE2
if (evas_cserve2_use_get())
im = (RGBA_Image *)evas_cache2_image_data(evas_common_image_cache2_get(),
@ -482,8 +483,11 @@ evas_software_xlib_swapbuf_push_updated_region(Outbuf *buf, RGBA_Image *update,
}
src_data = update->image.data;
if (!src_data) return;
dst_data = evas_xlib_swapper_buffer_map(buf->priv.swapper, &bpl);
dst_data = evas_xlib_swapper_buffer_map(buf->priv.swapper, &bpl,
&(buf->w), &(buf->h));
if (!dst_data) return;
RECTS_CLIP_TO_RECT(r.x, r.y, r.w, r.h, 0, 0, buf->w, buf->h);
if ((r.w <= 0) || (r.h <= 0)) return;
bpp = d / 8;
if (bpp <= 0) return;
wid = bpl / bpp;

View File

@ -227,10 +227,12 @@ evas_xlib_swapper_free(X_Swapper *swp)
}
void *
evas_xlib_swapper_buffer_map(X_Swapper *swp, int *bpl)
evas_xlib_swapper_buffer_map(X_Swapper *swp, int *bpl, int *w, int *h)
{
swp->mapped = EINA_TRUE;
if (bpl) *bpl = swp->buf[swp->buf_cur].bpl;
if (w) *w = swp->w;
if (h) *h = swp->h;
return swp->buf[swp->buf_cur].data;
}
@ -676,7 +678,7 @@ evas_xlib_swapper_free(X_Swapper *swp)
}
void *
evas_xlib_swapper_buffer_map(X_Swapper *swp, int *bpl)
evas_xlib_swapper_buffer_map(X_Swapper *swp, int *bpl, int *w, int *h)
{
unsigned int attach = DRI2BufferBackLeft;
int num;
@ -766,6 +768,8 @@ evas_xlib_swapper_buffer_map(X_Swapper *swp, int *bpl)
}
swp->w = swp->buf_w;
swp->h = swp->buf_h;
if (w) *w = swp->w;
if (h) *h = swp->h;
return swp->buf_data;
}
@ -806,7 +810,7 @@ evas_xlib_swapper_buffer_state_get(X_Swapper *swp)
{
DRI2BufferFlags *flags;
if (!swp->mapped) evas_xlib_swapper_buffer_map(swp, NULL);
if (!swp->mapped) evas_xlib_swapper_buffer_map(swp, NULL, NULL, NULL);
if (!swp->mapped) return MODE_FULL;
flags = (DRI2BufferFlags *)(&(swp->buf->flags));
if (flags->data.idx_reuse != swp->last_count)
@ -906,7 +910,7 @@ evas_xlib_swapper_free(X_Swapper *swp EINA_UNUSED)
}
void *
evas_xlib_swapper_buffer_map(X_Swapper *swp EINA_UNUSED, int *bpl EINA_UNUSED)
evas_xlib_swapper_buffer_map(X_Swapper *swp EINA_UNUSED, int *bpl EINA_UNUSED, int *w EINA_UNUSED, int *h EINA_UNUSED)
{
return NULL;
}

View File

@ -5,7 +5,7 @@ typedef struct _X_Swapper X_Swapper;
X_Swapper *evas_xlib_swapper_new(Display *disp, Drawable draw, Visual *vis,
int depth, int w, int h);
void evas_xlib_swapper_free(X_Swapper *swp);
void *evas_xlib_swapper_buffer_map(X_Swapper *swp, int *bpl);
void *evas_xlib_swapper_buffer_map(X_Swapper *swp, int *bpl, int *w, int *h);
void evas_xlib_swapper_buffer_unmap(X_Swapper *swp);
void evas_xlib_swapper_swap(X_Swapper *swp, Eina_Rectangle *rects, int nrects);
int evas_xlib_swapper_buffer_state_get(X_Swapper *swp);