void evas_buffer_outbuf_buf_update_fb(Outbuf *buf, int w, int h, Outbuf_Depth depth, void *dest, int dest_row_bytes, int use_color_key, DATA32 color_key, int alpha_level, void * (*new_update_region) (int x, int y, int w, int h, int *row_bytes), void (*free_update_region) (int x, int y, int w, int h, void *data), void * (*switch_buffer) (void *data, void *dest_buffer), void *switch_data) { buf->w = w; buf->h = h; buf->depth = depth; buf->dest = dest; buf->dest_row_bytes = dest_row_bytes; buf->alpha_level = alpha_level; buf->color_key = color_key; buf->use_color_key = use_color_key; buf->first_frame = 1; buf->func.new_update_region = new_update_region; buf->func.free_update_region = free_update_region; buf->func.switch_buffer = switch_buffer; buf->switch_data = switch_data; if ((buf->depth == OUTBUF_DEPTH_ARGB_32BPP_8888_8888) && (buf->dest) && (buf->dest_row_bytes == (buf->w * sizeof(DATA32)))) { memset(buf->dest, 0, h * buf->dest_row_bytes); #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) buf->priv.back_buf = (RGBA_Image *) evas_cache2_image_data(evas_common_image_cache2_get(), w, h, buf->dest, 1, EVAS_COLORSPACE_ARGB8888); else #endif buf->priv.back_buf = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), w, h, buf->dest, 1, EVAS_COLORSPACE_ARGB8888); } else if ((buf->depth == OUTBUF_DEPTH_RGB_32BPP_888_8888) && (buf->dest) && (buf->dest_row_bytes == (buf->w * sizeof(DATA32)))) { #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) buf->priv.back_buf = (RGBA_Image *) evas_cache2_image_data(evas_common_image_cache2_get(), w, h, buf->dest, 0, EVAS_COLORSPACE_ARGB8888); else #endif buf->priv.back_buf = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), w, h, buf->dest, 0, EVAS_COLORSPACE_ARGB8888); } }
RGBA_Image * evas_outbuf_new_region_for_update(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) { if (ob->priv.buffer) { *cx = x; *cy = y; *cw = w; *ch = h; return ob->priv.buffer; } else { RGBA_Image *im; *cx = 0; *cy = 0; *cw = w; *ch = h; im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get()); if (im) { im->cache_entry.flags.alpha = ob->priv.destination_alpha; im = (RGBA_Image *)evas_cache_image_size_set(&im->cache_entry, w, h); } return im; } return NULL; }
void evas_buffer_outbuf_buf_switch_buffer(Outbuf *buf) { if (buf->func.switch_buffer) { buf->dest = buf->func.switch_buffer(buf->switch_data, buf->dest); if (buf->priv.back_buf) { #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) { evas_cache2_image_close(&buf->priv.back_buf->cache_entry); buf->priv.back_buf = (RGBA_Image *) evas_cache2_image_data(evas_common_image_cache2_get(), buf->w, buf->h, buf->dest, buf->depth == OUTBUF_DEPTH_ARGB_32BPP_8888_8888 ? 1 : 0, EVAS_COLORSPACE_ARGB8888); } else #endif { evas_cache_image_drop(&buf->priv.back_buf->cache_entry); buf->priv.back_buf = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), buf->w, buf->h, buf->dest, buf->depth == OUTBUF_DEPTH_ARGB_32BPP_8888_8888 ? 1 : 0, EVAS_COLORSPACE_ARGB8888); } } } }
/* internal engine routines */ static void * _output_setup(int w, int h) { Render_Engine *re; int i; u16 width, height; DATA32 *image_data = NULL; int image_size; printf ("_output_setup called : %dx%d\n", w, h); re = calloc(1, sizeof(Render_Engine)); if (!re) return NULL; /* Allocate a 1Mb buffer, alligned to a 1Mb boundary * to be our shared IO memory with the RSX. */ re->host_addr = memalign (1024 * 1024, HOST_SIZE); if (re->host_addr == NULL) { free (re); return NULL; } re->context = initScreen (re->host_addr, HOST_SIZE); if (re->context == NULL) { free (re->host_addr); free (re); return NULL; } width = w; height = h; setResolution (re->context, &width, &height); re->currentBuffer = 0; re->width = width; re->height = height; for (i = 0; i < MAX_BUFFERS; i++) makeBuffer (&re->buffers[i], width, height, i); flipBuffer(re->context, MAX_BUFFERS - 1); re->tb = evas_common_tilebuf_new(w, h); /* in preliminary tests 16x16 gave highest framerates */ evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); /* Allocate our memaligned backbuffer */ image_size = ((w * h * sizeof(u32)) + 0xfffff) & - 0x100000; image_data = memalign (1024 * 1024, image_size); re->rgba_image = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), w, h, image_data, 1, EVAS_COLORSPACE_ARGB8888); gcmMapMainMemory(image_data, image_size, &re->rgba_image_offset); return re; }
RGBA_Image * evas_outbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) { RGBA_Image *img = NULL; if ((w <= 0) || (h <= 0)) return NULL; /* DBG("Outbuf Region New: %d %d %d %d", x, y, w, h); */ RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, ob->w, ob->h); if ((ob->rotation == 0) && (ob->depth == 32)) { Eina_Rectangle *rect; if (!(rect = eina_rectangle_new(x, y, w, h))) return NULL; #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) img = (RGBA_Image *)evas_cache2_image_empty(evas_common_image_cache2_get()); else #endif img = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get()); if (!img) { eina_rectangle_free(rect); return NULL; } img->cache_entry.flags.alpha = ob->destination_alpha; #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) evas_cache2_image_surface_alloc(&img->cache_entry, w, h); else #endif evas_cache_image_surface_alloc(&img->cache_entry, w, h); img->extended_info = rect; if (cx) *cx = 0; if (cy) *cy = 0; if (cw) *cw = w; if (ch) *ch = h; /* add this cached image data to pending writes */ ob->priv.pending_writes = eina_list_append(ob->priv.pending_writes, img); } return img; }
Outbuf * evas_outbuf_setup(int w, int h, int rot, Eina_Bool alpha, void *dest) { Outbuf *ob = NULL; if (!(ob = calloc(1, sizeof(Outbuf)))) return NULL; ob->w = w; ob->h = h; ob->rotation = rot; ob->priv.dest = dest; ob->priv.destination_alpha = alpha; ob->priv.buffer = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), w, h, ob->priv.dest, 1, EVAS_COLORSPACE_ARGB8888); return ob; }
RGBA_Image * evas_fb_outbuf_fb_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) { if (buf->priv.back_buf) { *cx = x; *cy = y; *cw = w; *ch = h; return buf->priv.back_buf; } else { RGBA_Image *im; *cx = 0; *cy = 0; *cw = w; *ch = h; im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); im->cache_entry.flags.alpha = 1; im = (RGBA_Image *) evas_cache_image_size_set(&im->cache_entry, w, h); return im; } return NULL; }
void evas_fb_outbuf_fb_set_have_backbuf(Outbuf *buf, int have_backbuf) { if (buf->priv.back_buf) { if (have_backbuf) return; evas_cache_image_drop(&buf->priv.back_buf->cache_entry); buf->priv.back_buf = NULL; } else { if (!have_backbuf) return; if (buf->priv.fb.fb) { if (buf->priv.fb.fb->fb_var.bits_per_pixel < 24) { buf->priv.back_buf = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); buf->priv.back_buf = (RGBA_Image *) evas_cache_image_size_set(&buf->priv.back_buf->cache_entry, buf->w, buf->h); } } } }
void * evas_buffer_outbuf_buf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) { RGBA_Image *im; if (buf->priv.back_buf) { *cx = x; *cy = y; *cw = w; *ch = h; return buf->priv.back_buf; } else { *cx = 0; *cy = 0; *cw = w; *ch = h; #ifdef EVAS_CSERVE2 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 (((buf->depth == OUTBUF_DEPTH_ARGB_32BPP_8888_8888)) || ((buf->depth == OUTBUF_DEPTH_BGRA_32BPP_8888_8888))) { im->cache_entry.flags.alpha = 1; } #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) evas_cache2_image_size_set(&im->cache_entry, w, h); else #endif im = (RGBA_Image *) evas_cache_image_size_set(&im->cache_entry, w, h); } } return im; }
void * evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) { RGBA_Image *im = NULL; Outbuf_Region *obr = NULL; Eina_Bool use_shm = EINA_TRUE; Eina_Bool alpha = EINA_FALSE; int bpl = 0; if ((buf->onebuf) && (buf->priv.x11.xcb.shm)) { Eina_Rectangle *rect; RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, buf->w, buf->h); if (!(obr = calloc(1, sizeof(Outbuf_Region)))) return NULL; if (!(rect = eina_rectangle_new(x, y, w, h))) { free(obr); return NULL; } if ((eina_array_push(&buf->priv.onebuf_regions, rect)) && (buf->priv.onebuf)) { if (cx) *cx = x; if (cy) *cy = y; if (cw) *cw = w; if (ch) *ch = h; if (!buf->priv.synced) { _xcbob_sync(buf->priv.x11.xcb.conn); buf->priv.synced = EINA_TRUE; } free(obr); return buf->priv.onebuf; } obr->x = 0; obr->y = 0; obr->w = buf->w; obr->h = buf->h; if (cx) *cx = x; if (cy) *cy = y; if (cw) *cw = w; if (ch) *ch = h; alpha = ((buf->priv.x11.xcb.mask) || (buf->priv.destination_alpha)); use_shm = buf->priv.x11.xcb.shm; if ((buf->rot == 0) && (buf->priv.x11.xcb.imdepth == 32) && (buf->priv.mask.r == 0xff0000) && (buf->priv.mask.g == 0x00ff00) && (buf->priv.mask.b == 0x0000ff)) { obr->xcbob = evas_software_xcb_output_buffer_new(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, buf->priv.x11.xcb.depth, buf->w, buf->h, use_shm, NULL); if (!obr->xcbob) { free(obr); return NULL; } #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) { im = (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) { evas_software_xcb_output_buffer_free(obr->xcbob, EINA_FALSE); free(obr); return NULL; } im->extended_info = obr; if (buf->priv.x11.xcb.mask) { obr->mask = evas_software_xcb_output_buffer_new(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, 1, buf->w, buf->h, use_shm, NULL); } } else { int bw = 0, bh = 0; #ifdef EVAS_CSERVE2 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) { free(obr); return NULL; } im->cache_entry.flags.alpha |= (alpha ? 1 : 0); #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; if ((buf->rot == 0) || (buf->rot == 180)) { bw = buf->w; bh = buf->h; } else if ((buf->rot == 90) || (buf->rot == 270)) { bw = buf->h; bh = buf->w; } obr->xcbob = evas_software_xcb_output_buffer_new(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, buf->priv.x11.xcb.depth, bw, bh, use_shm, NULL); if (!obr->xcbob) { #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); return NULL; } if (buf->priv.x11.xcb.mask) { obr->mask = evas_software_xcb_output_buffer_new(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, 1, bw, bh, use_shm, NULL); } } /* FIXME: We should be able to remove this memset. */ if ((alpha) && (im->image.data)) { /* FIXME: Faster memset */ // memset(im->image.data, 0, (w * h * sizeof(DATA32))); } buf->priv.onebuf = im; return im; } if (!(obr = calloc(1, sizeof(Outbuf_Region)))) return NULL; obr->x = x; obr->y = y; obr->w = w; obr->h = h; if (cx) *cx = 0; if (cy) *cy = 0; if (cw) *cw = w; if (ch) *ch = h; use_shm = buf->priv.x11.xcb.shm; alpha = ((buf->priv.x11.xcb.mask) || (buf->priv.destination_alpha)); if ((buf->rot == 0) && (buf->priv.x11.xcb.imdepth == 32) && (buf->priv.mask.r == 0xff0000) && (buf->priv.mask.g == 0x00ff00) && (buf->priv.mask.b == 0x0000ff)) { obr->xcbob = _find_xcbob(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, buf->priv.x11.xcb.depth, w, h, use_shm, NULL); if (!obr->xcbob) { free(obr); return NULL; } #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) { im = (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) { _unfind_xcbob(obr->xcbob, EINA_FALSE); free(obr); return NULL; } im->extended_info = obr; if (buf->priv.x11.xcb.mask) { obr->mask = _find_xcbob(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, 1, w, h, use_shm, NULL); } } else { int bw = 0, bh = 0; #ifdef EVAS_CSERVE2 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) { free(obr); return NULL; } im->cache_entry.flags.alpha |= (alpha ? 1 : 0); #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; if ((buf->rot == 0) || (buf->rot == 180)) { bw = w; bh = h; } else if ((buf->rot == 90) || (buf->rot == 270)) { bw = h; bh = w; } obr->xcbob = _find_xcbob(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, buf->priv.x11.xcb.depth, bw, bh, use_shm, NULL); if (!obr->xcbob) { #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); return NULL; } if (buf->priv.x11.xcb.mask) { obr->mask = _find_xcbob(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, 1, bw, bh, use_shm, NULL); } } /* FIXME: We should be able to remove this memset. */ if (((buf->priv.x11.xcb.mask) || (buf->priv.destination_alpha)) && (im->image.data)) { /* FIXME: Faster memset */ // memset(im->image.data, 0, (w * h * sizeof(DATA32))); } buf->priv.pending_writes = eina_list_append(buf->priv.pending_writes, im); return im; }