2012-04-26 Cedric Bail
* Lock less font rendering.
- * Removing EVAS_SLI, METRIC_CACHE and WORD_CACHE.
+ * Removing EVAS_FRAME_QUEUING, EVAS_SLI, METRIC_CACHE and WORD_CACHE.
* Lock less font rendering.
Removal:
- * Remove EVAS_SLI, METRIC_CACHE and WORD_CACHE.
+ * Remove EVAS_FRAME_QUEUING, EVAS_SLI, METRIC_CACHE and WORD_CACHE.
Evas 1.2.0
int usage;
unsigned int limit;
int references;
-#ifdef EVAS_FRAME_QUEUING
- LK(lock);
-#endif
};
struct _Evas_Cache_Engine_Image_Func
_evas_cache_image_lru_nodata_del(im);
im->flags.dirty = 1;
im->flags.cached = 1;
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->cache->lock);
-#endif
im->cache->dirty = eina_inlist_prepend(im->cache->dirty, EINA_INLIST_GET(im));
-#ifdef EVAS_FRAME_QUEUING
- LKU(im->cache->lock);
-#endif
if (im->cache_key)
{
eina_stringshare_del(im->cache_key);
if (!im->flags.dirty) return;
im->flags.dirty = 0;
im->flags.cached = 0;
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->cache->lock);
-#endif
im->cache->dirty = eina_inlist_remove(im->cache->dirty, EINA_INLIST_GET(im));
-#ifdef EVAS_FRAME_QUEUING
- LKU(im->cache->lock);
-#endif
}
static void
if (!im->cache_key) return;
im->flags.activ = 1;
im->flags.cached = 1;
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->cache->lock);
-#endif
eina_hash_direct_add(im->cache->activ, im->cache_key, im);
-#ifdef EVAS_FRAME_QUEUING
- LKU(im->cache->lock);
-#endif
}
static void
if (!im->cache_key) return;
im->flags.activ = 0;
im->flags.cached = 0;
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->cache->lock);
-#endif
eina_hash_del(im->cache->activ, im->cache_key, im);
-#ifdef EVAS_FRAME_QUEUING
- LKU(im->cache->lock);
-#endif
}
static void
if (!im->cache_key) return;
im->flags.lru = 1;
im->flags.cached = 1;
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->cache->lock);
-#endif
eina_hash_direct_add(im->cache->inactiv, im->cache_key, im);
im->cache->lru = eina_inlist_prepend(im->cache->lru, EINA_INLIST_GET(im));
im->cache->usage += im->cache->func.mem_size_get(im);
-#ifdef EVAS_FRAME_QUEUING
- LKU(im->cache->lock);
-#endif
}
static void
if (!im->cache_key) return;
im->flags.lru = 0;
im->flags.cached = 0;
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->cache->lock);
-#endif
eina_hash_del(im->cache->inactiv, im->cache_key, im);
im->cache->lru = eina_inlist_remove(im->cache->lru, EINA_INLIST_GET(im));
im->cache->usage -= im->cache->func.mem_size_get(im);
-#ifdef EVAS_FRAME_QUEUING
- LKU(im->cache->lock);
-#endif
}
static void
_evas_cache_image_lru_del(im);
im->flags.lru = 1;
im->flags.cached = 1;
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->cache->lock);
-#endif
im->cache->lru_nodata = eina_inlist_prepend(im->cache->lru_nodata, EINA_INLIST_GET(im));
-#ifdef EVAS_FRAME_QUEUING
- LKU(im->cache->lock);
-#endif
}
static void
if (!im->flags.lru_nodata) return;
im->flags.lru = 0;
im->flags.cached = 0;
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->cache->lock);
-#endif
im->cache->lru_nodata = eina_inlist_remove(im->cache->lru_nodata, EINA_INLIST_GET(im));
-#ifdef EVAS_FRAME_QUEUING
- LKU(im->cache->lock);
-#endif
}
static void
LKD(ie->lock);
LKD(ie->lock_cancel);
#endif
-#ifdef EVAS_FRAME_QUEUING
- LKD(ie->lock_references);
-#endif
cache->func.dealloc(ie);
}
if (tstamp) ie->tstamp = *tstamp;
else memset(&ie->tstamp, 0, sizeof(Image_Timestamp));
-#ifdef EVAS_FRAME_QUEUING
- LKI(ie->lock_references);
-#endif
#ifdef BUILD_ASYNC_PRELOAD
LKI(ie->lock);
LKI(ie->lock_cancel);
return;
}
if (ie->flags.loaded) _evas_cache_image_async_end(ie);
-#ifdef EVAS_FRAME_QUEUING
- LKL(ie->lock_references);
-#endif
if (ie->references == 0)
{
_evas_cache_image_lru_add(ie);
cache = ie->cache;
}
-#ifdef EVAS_FRAME_QUEUING
- LKU(ie->lock_references);
-#endif
if (cache) evas_cache_image_flush(cache);
}
EAPI void
evas_cache_image_set(Evas_Cache_Image *cache, unsigned int limit)
{
-#ifdef EVAS_FRAME_QUEUING
- LKL(cache->lock);
-#endif
if (cache->limit == limit)
{
-#ifdef EVAS_FRAME_QUEUING
- LKU(cache->lock);
-#endif
return;
}
cache->limit = limit;
-#ifdef EVAS_FRAME_QUEUING
- LKU(cache->lock);
-#endif
evas_cache_image_flush(cache);
}
cache->inactiv = eina_hash_string_superfast_new(NULL);
cache->activ = eina_hash_string_superfast_new(NULL);
cache->references = 1;
-#ifdef EVAS_FRAME_QUEUING
- LKI(cache->lock);
-#endif
return cache;
}
Eina_List *delete_list;
Image_Entry *im;
-#ifdef EVAS_FRAME_QUEUING
- LKL(cache->lock);
-#endif
cache->references--;
if (cache->references != 0)
{
-#ifdef EVAS_FRAME_QUEUING
- LKU(cache->lock);
-#endif
return;
}
-#ifdef EVAS_FRAME_QUEUING
- /* Release and destroy lock early ! */
- LKU(cache->lock);
- LKD(cache->lock);
-#endif
#ifdef BUILD_ASYNC_PRELOAD
EINA_LIST_FREE(cache->preload, im)
hkey[size] = '\0';
/* find image by key in active hash */
-#ifdef EVAS_FRAME_QUEUING
- LKL(cache->lock);
-#endif
im = eina_hash_find(cache->activ, hkey);
-#ifdef EVAS_FRAME_QUEUING
- LKU(cache->lock);
-#endif
if (im)
{
int ok = 1;
}
/* find image by key in inactive/lru hash */
-#ifdef EVAS_FRAME_QUEUING
- LKL(cache->lock);
-#endif
im = eina_hash_find(cache->inactiv, hkey);
-#ifdef EVAS_FRAME_QUEUING
- LKU(cache->lock);
-#endif
if (im)
{
int ok = 1;
on_ok:
*error = EVAS_LOAD_ERROR_NONE;
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->lock_references);
-#endif
im->references++;
-#ifdef EVAS_FRAME_QUEUING
- LKU(im->lock_references);
-#endif
return im;
on_stat_error:
Evas_Cache_Image *cache;
int references;
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->lock_references);
-#endif
im->references--;
if (im->references < 0) im->references = 0;
references = im->references;
-#ifdef EVAS_FRAME_QUEUING
- LKU(im->lock_references);
-#endif
cache = im->cache;
if (references == 0)
{
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->ref_fq_add);
- LKL(im->ref_fq_del);
- if (im->ref_fq[0] != im->ref_fq[1])
- {
- LKU(im->ref_fq_add);
- LKU(im->ref_fq_del);
- return;
- }
- LKU(im->ref_fq_add);
- LKU(im->ref_fq_del);
-#endif
-
#ifdef BUILD_ASYNC_PRELOAD
if (im->preload)
{
{
int references;
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->lock_references);
-#endif
references = im->references;
-#ifdef EVAS_FRAME_QUEUING
- LKU(im->lock_references);
-#endif
if (references > 1) return;
if ((im->flags.dirty) || (!im->flags.need_data)) return;
_evas_cache_image_lru_nodata_add(im);
{
#ifndef EVAS_CSERVE
int references;
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->lock_references);
-#endif
references = im->references;
-#ifdef EVAS_FRAME_QUEUING
- LKU(im->lock_references);
-#endif
// if ref 1 also copy if using shared cache as its read-only
if (references == 1) im_dirty = im;
else
if (cache->func.debug) cache->func.debug("dirty-src", im);
cache->func.dirty(im_dirty, im);
if (cache->func.debug) cache->func.debug("dirty-out", im_dirty);
-#ifdef EVAS_FRAME_QUEUING
- LKL(im_dirty->lock_references);
-#endif
im_dirty->references = 1;
-#ifdef EVAS_FRAME_QUEUING
- LKU(im_dirty->lock_references);
-#endif
evas_cache_image_drop(im);
}
_evas_cache_image_dirty_add(im_dirty);
int references;
cache = im->cache;
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->lock_references);
-#endif
references = im->references;
-#ifdef EVAS_FRAME_QUEUING
- LKU(im->lock_references);
-#endif
if (references <= 1)
{
if (cache->func.debug) cache->func.debug("dirty-src", im);
cache->func.dirty(im_dirty, im);
if (cache->func.debug) cache->func.debug("dirty-out", im_dirty);
-#ifdef EVAS_FRAME_QUEUING
- LKL(im_dirty->lock_references);
-#endif
im_dirty->references = 1;
-#ifdef EVAS_FRAME_QUEUING
- LKU(im_dirty->lock_references);
-#endif
evas_cache_image_drop(im);
}
return im_dirty;
_evas_cache_image_entry_delete(cache, im);
return NULL;
}
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->lock_references);
-#endif
im->references = 1;
-#ifdef EVAS_FRAME_QUEUING
- LKU(im->lock_references);
-#endif
if (cache->func.debug) cache->func.debug("copied-data", im);
return im;
}
_evas_cache_image_entry_delete(cache, im);
return NULL;
}
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->lock_references);
-#endif
im->references = 1;
-#ifdef EVAS_FRAME_QUEUING
- LKU(im->lock_references);
-#endif
if (cache->func.debug) cache->func.debug("data", im);
return im;
}
_evas_cache_image_entry_surface_alloc(cache, im2, w, h);
error = cache->func.size_set(im2, im, w, h);
if (error != 0) goto on_error;
-#ifdef EVAS_FRAME_QUEUING
- LKL(im2->lock_references);
-#endif
im2->references = 1;
-#ifdef EVAS_FRAME_QUEUING
- LKU(im2->lock_references);
-#endif
evas_cache_image_drop(im);
if (cache->func.debug) cache->func.debug("size_set", im2);
return im2;
im = _evas_cache_image_entry_new(cache, NULL, NULL, NULL, NULL, NULL, NULL);
if (!im) return NULL;
-#ifdef EVAS_FRAME_QUEUING
- LKL(im->lock_references);
-#endif
im->references = 1;
-#ifdef EVAS_FRAME_QUEUING
- LKU(im->lock_references);
-#endif
return im;
}
#ifdef BUILD_ASYNC_PRELOAD
_evas_preload_thread_init();
#endif
-#ifdef EVAS_FRAME_QUEUING
- evas_common_frameq_init();
-#endif
return _evas_init_count;
if (--_evas_init_count != 0)
return _evas_init_count;
-#ifdef EVAS_FRAME_QUEUING
- if (evas_common_frameq_enabled())
- {
- evas_common_frameq_finish();
- evas_common_frameq_destroy();
- }
-#endif
#ifdef BUILD_ASYNC_EVENTS
_evas_preload_thread_shutdown();
#endif
return;
MAGIC_CHECK_END();
-#ifdef EVAS_FRAME_QUEUING
- evas_common_frameq_flush();
-#endif
-
if (e->walking_list == 0) evas_render_idle_flush(e);
if (e->walking_list > 0) return;
if (w < 1) w = 1;
if (h < 1) h = 1;
-#ifdef EVAS_FRAME_QUEUING
- evas_common_frameq_flush();
-#endif
-
e->output.w = w;
e->output.h = h;
e->output.changed = 1;
return;
MAGIC_CHECK_END();
_evas_object_image_cleanup(obj, o);
-#ifdef EVAS_FRAME_QUEUING
- if (o->engine_data)
- evas_common_pipe_op_image_flush(o->engine_data);
-#endif
p_data = o->engine_data;
if (data)
{
return NULL;
MAGIC_CHECK_END();
if (!o->engine_data) return NULL;
-#ifdef EVAS_FRAME_QUEUING
- evas_common_pipe_op_image_flush(o->engine_data);
-#endif
data = NULL;
if (obj->layer->evas->engine.func->image_scale_hint_set)
{
int stride = 0;
-#ifdef EVAS_FRAME_QUEUING
- evas_common_pipe_op_image_flush(o->engine_data);
-#endif
o->engine_data = obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output,
o->engine_data,
o->cur.has_alpha);
MAGIC_CHECK_END();
_evas_object_image_cleanup(obj, o);
-#ifdef EVAS_FRAME_QUEUING
- if ((Evas_Colorspace)o->cur.cspace != cspace)
- {
- if (o->engine_data)
- evas_common_pipe_op_image_flush(o->engine_data);
- }
-#endif
o->cur.cspace = cspace;
if (o->engine_data)
return;
MAGIC_CHECK_END();
if (o->scale_hint == hint) return;
-#ifdef EVAS_FRAME_QUEUING
- if (o->engine_data)
- evas_common_pipe_op_image_flush(o->engine_data);
-#endif
o->scale_hint = hint;
if (o->engine_data)
{
return;
MAGIC_CHECK_END();
if (o->content_hint == hint) return;
-#ifdef EVAS_FRAME_QUEUING
- if (o->engine_data)
- evas_common_pipe_op_image_flush(o->engine_data);
-#endif
o->content_hint = hint;
if (o->engine_data)
{
obj->del_ref = EINA_TRUE;
return;
}
-#ifdef EVAS_FRAME_QUEUING
- evas_common_frameq_flush();
-#endif
evas_object_hide(obj);
if (obj->focused)
obj->layer->evas->pointer.y, 1, 1);
}
-#ifdef EVAS_FRAME_QUEUING
- if (o->font)
- evas_common_pipe_op_text_flush((RGBA_Font *) o->font);
-#endif
-
/* DO IT */
if (o->font)
{
o = (Evas_Object_Text *)(obj->object_data);
if (!o->font) return;
-#ifdef EVAS_FRAME_QUEUING
- evas_common_pipe_op_text_flush((RGBA_Font *) o->font);
-#endif
evas_font_load_hinting_set(obj->layer->evas, o->font,
obj->layer->evas->hinting);
was = evas_object_is_in_output_rect(obj,
Evas_Object_Textblock_Text_Item *ti = _ITEM_TEXT(it);
if (ti->parent.format->font.font)
{
-#ifdef EVAS_FRAME_QUEUING
- evas_common_pipe_op_text_flush((RGBA_Font *) ti->parent.format->font.font);
-#endif
evas_font_load_hinting_set(obj->layer->evas,
ti->parent.format->font.font,
obj->layer->evas->hinting);
obj->rect_del = 0;
obj->render_pre = 0;
-#ifndef EVAS_FRAME_QUEUING
- /* because of clip objects - delete 2 cycles later */
if (obj->delete_me == 2)
-#else
- if (obj->delete_me == evas_common_frameq_get_frameq_sz() + 2)
-#endif
- eina_array_push(delete_objects, obj);
- else if (obj->delete_me != 0) obj->delete_me++;
+ eina_array_push(delete_objects, obj);
+ else if (obj->delete_me != 0) obj->delete_me++;
/* If the object will be removed, we should not cache anything during this run. */
if (obj->delete_me != 0) clean_them = EINA_TRUE;
return NULL;
MAGIC_CHECK_END();
-#ifdef EVAS_FRAME_QUEUING
- evas_common_frameq_flush_ready ();
-#endif
-
if (!e->changed) return NULL;
return evas_render_updates_internal(e, 1, 1);
}
return;
MAGIC_CHECK_END();
-#ifdef EVAS_FRAME_QUEUING
- evas_common_frameq_flush_ready ();
-#endif
-
if (!e->changed) return;
evas_render_updates_internal(e, 0, 1);
}
EAPI void
evas_sync(Evas *e)
{
-#ifdef EVAS_FRAME_QUEUING
- MAGIC_CHECK(e, Evas, MAGIC_EVAS);
- return;
- MAGIC_CHECK_END();
-
- evas_common_frameq_flush();
-#else
- (void) e;
-#endif
+ (void) e;
}
static void
return;
MAGIC_CHECK_END();
-#ifndef EVAS_FRAME_QUEUING
if ((!obj->changed) && (obj->delete_me < 2))
-#else
- if ((!obj->changed))
-#endif
- {
- Evas *e;
-
- e = obj->layer->evas;
- if ((!e) || (e->cleanup)) return;
-#ifdef EVAS_FRAME_QUEUING
- if (obj->delete_me >= evas_common_frameq_get_frameq_sz() + 2) return;
-#endif
- eina_array_push(&e->pending_objects, obj);
- obj->changed = 1;
- }
+ {
+ Evas *e;
+
+ e = obj->layer->evas;
+ if ((!e) || (e->cleanup)) return;
+ eina_array_push(&e->pending_objects, obj);
+ obj->changed = 1;
+ }
}
/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/
EAPI int evas_common_font_query_last_up_to_pos (RGBA_Font *fn, const Evas_Text_Props *intl_props, int x, int y);
EAPI int evas_common_font_query_run_font_end_get(RGBA_Font *fn, RGBA_Font_Int **script_fi, RGBA_Font_Int **cur_fi, Evas_Script_Type script, const Eina_Unicode *text, int run_len);
-#ifdef EVAS_FRAME_QUEUING
-EAPI void evas_common_font_draw_finish(void);
-#endif
-
void evas_common_font_load_init(void);
void evas_common_font_load_shutdown(void);
{
}
-#ifdef EVAS_FRAME_QUEUING
-EAPI void
-evas_common_font_draw_finish(void)
-{
-}
-#endif
-
/*
* BiDi handling: We receive the shaped string + other props from text_props,
* we need to reorder it so we'll have the visual string (the way we draw)
if (ext_w <= 0) return;
if (ext_h <= 0) return;
-#ifdef EVAS_FRAME_QUEUING
- LKL(fn->lock);
-#endif
// evas_common_font_size_use(fn);
func = evas_common_gfx_func_composite_mask_color_span_get(dc->col.col, dst, 1, dc->render_op);
}
dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch;
}
-#ifdef EVAS_FRAME_QUEUING
- LKU(fn->lock);
-#endif
}
fi->hinting = fn->hinting;
fn->references = 1;
LKI(fn->lock);
-#ifdef EVAS_FRAME_QUEUING
- LKI(fn->ref_fq_add);
- LKI(fn->ref_fq_del);
- eina_condition_new(&(fn->cond_fq_del), &(fn->ref_fq_del));
-#endif
if (fi->inuse) evas_common_font_int_promote(fi);
else
{
fi->hinting = fn->hinting;
fn->references = 1;
LKI(fn->lock);
-#ifdef EVAS_FRAME_QUEUING
- LKI(fn->ref_fq_add);
- LKI(fn->ref_fq_del);
- eina_condition_new(&(fn->cond_fq_del), &(fn->ref_fq_del));
-#endif
if (fi->inuse) evas_common_font_int_promote(fi);
else
{
if (!fn) return;
fn->references--;
if (fn->references > 0) return;
-#ifdef EVAS_FRAME_QUEUING
- LKL(fn->ref_fq_add);
- LKL(fn->ref_fq_del);
- if (fn->ref_fq[0] != fn->ref_fq[1])
- {
- LKU(fn->ref_fq_add);
- LKU(fn->ref_fq_del);
- return;
- }
- LKU(fn->ref_fq_add);
- LKU(fn->ref_fq_del);
-#endif
EINA_LIST_FOREACH(fn->fonts, l, fi)
{
fi->references--;
eina_list_free(fn->fonts);
if (fn->fash) fn->fash->freeme(fn->fash);
LKD(fn->lock);
-#ifdef EVAS_FRAME_QUEUING
- LKD(fn->ref_fq_add);
- LKD(fn->ref_fq_del);
- eina_condition_free(&(fn->cond_fq_del));
-#endif
free(fn);
}
evas_common_font_flush();
FT_Done_FreeType(evas_ft_lib);
-#ifdef EVAS_FRAME_QUEUING
- evas_common_font_draw_finish();
-#endif
evas_ft_lib = 0;
}
extern LK(lock_ot); // for harfbuzz calls
#endif
-# if defined(EVAS_FRAME_QUEUING) || defined(BUILD_PIPE_RENDER)
-# define FTLOCK() LKL(lock_font_draw)
-# define FTUNLOCK() LKU(lock_font_draw)
-
-# define BIDILOCK() LKL(lock_bidi)
-# define BIDIUNLOCK() LKU(lock_bidi)
-
-# define OTLOCK() LKL(lock_ot)
-# define OTUNLOCK() LKU(lock_ot)
-# else
# define FTLOCK(x)
# define FTUNLOCK(x)
/* Macros for text walking */
# define OTLOCK()
# define OTUNLOCK()
-# endif
void evas_common_font_source_unload(RGBA_Font_Source *fs);
void evas_common_font_source_reload(RGBA_Font_Source *fs);
if (!im) return NULL;
im->flags = RGBA_IMAGE_NOTHING;
im->ref = 1;
-#ifdef EVAS_FRAME_QUEUING
- LKI(im->cache_entry.ref_fq_add);
- LKI(im->cache_entry.ref_fq_del);
- eina_condition_new(&(im->cache_entry.cond_fq_del),
- &(im->cache_entry.ref_fq_del));
-#endif
evas_common_rgba_image_scalecache_init(&im->cache_entry);
#ifdef BUILD_PIPE_RENDER
evas_common_pipe_free(im);
-# ifdef EVAS_FRAME_QUEUING
- LKD(im->cache_entry.ref_fq_add);
- LKD(im->cache_entry.ref_fq_del);
- eina_condition_free(&(im->cache_entry.cond_fq_del));
-# endif
#endif
evas_common_rgba_image_scalecache_shutdown(&im->cache_entry);
if (ie->info.module) evas_module_unref((Evas_Module *)ie->info.module);
unsigned int dst_w, dst_h;
unsigned int flop;
unsigned int size_adjust;
-#ifdef EVAS_FRAME_QUEUING
- RWLK(lock);
-#endif
Eina_Bool forced_unload : 1;
Eina_Bool smooth : 1;
Eina_Bool populate_me : 1;
{
Scaleitem *sci;
sci = im->cache.list->data;
-#ifdef EVAS_FRAME_QUEUING
- WRLKL(sci->lock);
-#endif
im->cache.list = eina_list_remove(im->cache.list, sci);
if (sci->im)
{
cache_list = eina_inlist_remove(cache_list, (Eina_Inlist *)sci);
LKU(cache_lock);
}
-#ifdef EVAS_FRAME_QUEUING
- RWLKU(sci->lock);
- RWLKD(sci->lock);
-#endif
free(sci);
}
LKU(im->cache.lock);
{
l = eina_list_last(im->cache.list);
sci = l->data;
-#ifdef EVAS_FRAME_QUEUING
- WRLKL(sci->lock);
-#endif
im->cache.list = eina_list_remove_list(im->cache.list, l);
if ((sci->usage == im->cache.newest_usage) ||
(sci->usage_count == im->cache.newest_usage_count))
// INF(" 1- %i", sci->dst_w * sci->dst_h * 4);
cache_list = eina_inlist_remove(cache_list, (Eina_Inlist *)sci);
}
-#ifdef EVAS_FRAME_QUEUING
- RWLKU(sci->lock);
-#endif
if (max_scale_items < 1) return NULL;
}
else
return NULL;
sci = calloc(1, sizeof(Scaleitem));
sci->parent_im = im;
-#ifdef EVAS_FRAME_QUEUING
- RWLKI(sci->lock);
-#endif
}
sci->usage = 0;
sci->usage_count = 0;
if (!sci) return;
}
if (sci == notsci) return;
-#ifdef EVAS_FRAME_QUEUING
- WRLKL(sci->lock);
-#endif
if (sci->im)
{
evas_common_rgba_image_free(&sci->im->cache_entry);
cache_list = eina_inlist_remove(cache_list, (Eina_Inlist *)sci);
memset(sci, 0, sizeof(Eina_Inlist));
}
-#ifdef EVAS_FRAME_QUEUING
- RWLKU(sci->lock);
-#endif
-
// INF("FLUSH %i > %i", cache_size, max_cache_size);
}
}
LKL(im->cache.lock);
if ((src_region_w == dst_region_w) && (src_region_h == dst_region_h))
{
-#ifdef EVAS_FRAME_QUEUING
- if (!evas_common_frameq_enabled())
-#endif
- {
- if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
- evas_cache_image_load_data(&im->cache_entry);
- evas_common_image_colorspace_normalize(im);
- }
+ if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
+ evas_cache_image_load_data(&im->cache_entry);
+ evas_common_image_colorspace_normalize(im);
+
// noscales++;
LKU(im->cache.lock);
if (im->image.data)
LKU(cache_lock);
if (!sci)
{
-#ifdef EVAS_FRAME_QUEUING
- if (!evas_common_frameq_enabled())
-#endif
- {
- if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
- evas_cache_image_load_data(&im->cache_entry);
- evas_common_image_colorspace_normalize(im);
- }
+ if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
+ evas_cache_image_load_data(&im->cache_entry);
+ evas_common_image_colorspace_normalize(im);
+
// misses++;
LKU(im->cache.lock);
if (im->image.data)
if (sci->flop >= FLOP_DEL) sci->flop -= FLOP_DEL;
}
// INF("use cached!");
-#ifdef EVAS_FRAME_QUEUING
- RDLKL(sci->lock);
-#endif
LKU(im->cache.lock);
evas_common_scale_rgba_in_to_out_clip_sample
(sci->im, dst, dc,
dst_region_w, dst_region_h,
dst_region_x, dst_region_y,
dst_region_w, dst_region_h);
-#ifdef EVAS_FRAME_QUEUING
- RWLKU(sci->lock);
-#endif
// hits++;
// INF("check %p %i < %i",
// im,
// (int)im->cache.orig_usage,
// (int)im->cache.newest_usage);
-#ifndef EVAS_FRAME_QUEUING
/* while framequeuing is applied,
* original image data is loaded by the main thread
* just before enqueuing the rendering op into the pipe.
}
}
}
-#endif
}
else
{
-#ifdef EVAS_FRAME_QUEUING
- if (!evas_common_frameq_enabled())
-#endif
- {
- if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
- evas_cache_image_load_data(&im->cache_entry);
- evas_common_image_colorspace_normalize(im);
- }
+ if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
+ evas_cache_image_load_data(&im->cache_entry);
+ evas_common_image_colorspace_normalize(im);
// misses++;
LKU(im->cache.lock);
if (im->image.data)
}
#else
RGBA_Image *im = (RGBA_Image *)ie;
-#ifdef EVAS_FRAME_QUEUING
- if (!evas_common_frameq_enabled())
-#endif
- {
- if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
- evas_cache_image_load_data(&im->cache_entry);
- evas_common_image_colorspace_normalize(im);
- }
+ if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
+ evas_cache_image_load_data(&im->cache_entry);
+ evas_common_image_colorspace_normalize(im);
if (im->image.data)
{
if (smooth)
#include <unistd.h>
#ifdef BUILD_PIPE_RENDER
-
-#ifdef EVAS_FRAME_QUEUING
-#define SCALECACHE
-static Evas_FrameQ gframeq; // global frameQ
-
-static Evas_Surface *
-evas_common_surface_alloc(void *surface, int x, int y, int w, int h)
-{
- Evas_Surface *e_surface;
-
- e_surface = calloc(1, sizeof(Evas_Surface));
- e_surface->im = surface;
- LKL(e_surface->im->cache_entry.ref_fq_add);
- e_surface->im->cache_entry.ref_fq[0]++;
- LKU(e_surface->im->cache_entry.ref_fq_add);
- e_surface->x = x;
- e_surface->y = y;
- e_surface->w = w;
- e_surface->h = h;
-
- return e_surface;
-}
-
-static void
-evas_common_surface_dealloc(Evas_Surface *surface)
-{
- Evas_Surface *d_surface;
-
- while (surface)
- {
- d_surface = surface;
- surface = (Evas_Surface *)eina_inlist_remove(EINA_INLIST_GET(surface), EINA_INLIST_GET(d_surface));
- LKL(d_surface->im->cache_entry.ref_fq_del);
- d_surface->im->cache_entry.ref_fq[1]++;
- LKU(d_surface->im->cache_entry.ref_fq_del);
- free(d_surface);
- }
-}
-
-static void
-evas_common_surface_add(Evas_Frame *frame, Evas_Surface *surface)
-{
- frame->surfaces = (Evas_Surface *)eina_inlist_append(EINA_INLIST_GET(frame->surfaces), EINA_INLIST_GET(surface));
-}
-
-static Evas_Frame *
-evas_common_frame_alloc(void)
-{
- Evas_Frame *frame;
-
- frame = calloc(1, sizeof(Evas_Frame));
- frame->surfaces = NULL;
- return frame;
-}
-
-static void
-evas_common_frame_dealloc(Evas_Frame *frame)
-{
- evas_common_surface_dealloc(frame->surfaces);
- free(frame);
-}
-
-static void
-evas_common_frame_add(Evas_FrameQ *frameq, Evas_Frame *frame)
-{
- Evas_Frame *temp_frame;
-
- LKL(frameq->mutex);
- while ((int)eina_inlist_count(EINA_INLIST_GET(frameq->frames)) >= frameq->frameq_sz)
- {
- /* wait a worker thread finish previous frame */
- eina_condition_wait(&(frameq->cond_done));
- }
- frameq->frames = (Evas_Frame *) eina_inlist_append(EINA_INLIST_GET(frameq->frames), EINA_INLIST_GET(frame));
-
- // this frame need not to be scheduled for flushing time
- EINA_INLIST_FOREACH(EINA_INLIST_GET(frameq->frames), temp_frame)
- {
- if (!temp_frame->ready)
- {
- break;
- }
- }
- if (temp_frame && temp_frame == frame)
- frame->dont_schedule = 1;
-
- LKU(frameq->mutex);
-
- eina_condition_signal(&(frameq->cond_new));
-}
-
-EAPI Evas_Surface *
-evas_common_frameq_new_surface(void *surface, int x, int y, int w, int h)
-{
- return evas_common_surface_alloc(surface, x, y, w, h);
-}
-
-EAPI void
-evas_common_frameq_add_surface(Evas_Surface *surface)
-{
- evas_common_surface_add(gframeq.cur_frame, surface);
-}
-
-EAPI void
-evas_common_frameq_set_frame_data(void *data,
- void (*fn_output_redraws_next_update_push) (void *data, void *surface, int x, int y, int w, int h),
- void (*fn_output_flush) (void *data),
- void (*fn_output_set_priv)(void *data, void *cur, void *prev))
-{
- if (gframeq.cur_frame)
- {
- gframeq.cur_frame->data = data;
- gframeq.cur_frame->output_redraws_next_update_push = fn_output_redraws_next_update_push;
- gframeq.cur_frame->output_flush = fn_output_flush;
- gframeq.cur_frame->output_set_priv = fn_output_set_priv;
- }
-}
-
-EAPI void
-evas_common_frameq_prepare_frame(void)
-{
- if (!gframeq.cur_frame )
- {
- gframeq.cur_frame = evas_common_frame_alloc();
- }
-}
-
-EAPI void
-evas_common_frameq_ready_frame(void)
-{
- if (gframeq.cur_frame)
- {
- evas_common_frame_add(&gframeq, gframeq.cur_frame);
- gframeq.cur_frame = NULL; // create a new frame for the next frame later
- }
-}
-
-
-EAPI void
-evas_common_frameq_init(void)
-{
- gframeq.frames = NULL;
- LKI(gframeq.mutex);
- eina_condition_new(&(gframeq.cond_new), &(gframeq.mutex));
- eina_condition_new(&(gframeq.cond_ready), &(gframeq.mutex));
- eina_condition_new(&(gframeq.cond_done), &(gframeq.mutex));
- gframeq.initialised = 0; // worker thread are not created yet
- gframeq.frameq_sz = 1; // this value ensures the first frame can be enqueued.
-}
-
-EAPI void
-evas_common_frameq_destroy(void)
-{
-#if 0 // let them destroyed indirectly with program exit
- LKL(gframeq.mutex);
- eina_condition_free(&(gframeq.cond_new));
- eina_condition_free(&(gframeq.cond_ready));
- eina_condition_free(&(gframeq.cond_done));
- LKU(gframeq.mutex);
-#endif
- LKD(gframeq.mutex);
-
- gframeq.frames = NULL;
- gframeq.initialised = 0;
-}
-
-EAPI void
-evas_common_frameq_flush(void)
-{
- if (! evas_common_frameq_enabled())
- return;
-
- LKL(gframeq.mutex);
- while(eina_inlist_count(EINA_INLIST_GET(gframeq.frames)) > 0)
- {
- /* wait a worker thread finish previous frame */
- eina_condition_wait(&(gframeq.cond_done));
- }
- LKU(gframeq.mutex);
-}
-
-
-EAPI void
-evas_common_frameq_flush_ready(void)
-{
- return;
-}
-
-EAPI int
-evas_common_frameq_get_frameq_sz(void)
-{
- return gframeq.frameq_sz;
-}
-
-EAPI int
-evas_common_frameq_enabled(void)
-{
- return gframeq.initialised;
-}
-#endif
-
static RGBA_Pipe *evas_common_pipe_add(RGBA_Pipe *pipe, RGBA_Pipe_Op **op);
static void evas_common_pipe_draw_context_copy(RGBA_Draw_Context *dc, RGBA_Pipe_Op *op);
static void evas_common_pipe_op_free(RGBA_Pipe_Op *op);
}
return NULL;
}
-
-#ifdef EVAS_FRAME_QUEUING
-static void
-evas_common_frameq_release(void *data)
-{
- Evas_FrameQ *frameq;
- Evas_Frameq_Thread_Info *fq_info;
- Thinfo *thinfo;
-
- thinfo = data;
- fq_info = (Evas_Frameq_Thread_Info *)(thinfo->fq_info);
- frameq = fq_info->frameq;
-
- /* This thread may or may not own the mutex.
- * But there's no way to determine the ownership of the mutex, so release it anyway
- */
- LKU(frameq->mutex);
-}
-
-static void *
-evas_common_frameq_thread(void *data)
-{
- Evas_FrameQ *frameq;
- Evas_Frame *frame;
- Evas_Surface *surface;
- RGBA_Pipe *p;
- Thinfo *thinfo;
- Evas_Frameq_Thread_Info *fq_info;
- RGBA_Pipe_Thread_Info p_info;
-
- thinfo = data;
- fq_info = (Evas_Frameq_Thread_Info *)(thinfo->fq_info);
- frameq = fq_info->frameq;
-
- pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
- pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
- /* install thread cancelation cleanup handler */
- pthread_cleanup_push(evas_common_frameq_release, data);
-
- for (;;)
- {
- frame = NULL;
-
- /* 1. pick a frame to draw */
- LKL(frameq->mutex);
- while(!frame)
- {
- EINA_INLIST_FOREACH(EINA_INLIST_GET(frameq->frames), frame)
- {
- if (!frame->in_process)
- {
- frame->in_process = 1;
- break;
- }
- }
- if (frame)
- {
- break;
- }
- pthread_testcancel();
- eina_condition_wait(&(frameq->cond_new));
- }
- LKU(frameq->mutex);
-
- /* 2. draw selected frame */
- EINA_INLIST_FOREACH(EINA_INLIST_GET(frame->surfaces), surface)
- {
- p_info.im = surface->im;
- p_info.x = 0;
- p_info.y = 0;
- p_info.w = surface->im->cache_entry.w;
- p_info.h = surface->im->cache_entry.h;
-
- EINA_INLIST_FOREACH(EINA_INLIST_GET(p_info.im->cache_entry.pipe), p)
- {
- int i;
-
- for (i = 0; i < p->op_num; i++)
- {
- if (p->op[i].op_func)
- {
- p->op[i].op_func(p_info.im, &(p->op[i]), &p_info);
- }
- }
- }
-
- /* push surface out */
- if (! surface->dontpush)
- {
- frame->output_redraws_next_update_push(frame->data,
- surface->im, surface->x, surface->y, surface->w, surface->h);
- }
- }
-
- // record frame ready time, will be used in post worker thread, evas_common_frameq_thread_post()
- gettimeofday(&frame->ready_time, NULL);
-
- LKL(frameq->mutex);
- frame->ready = 1;
- eina_condition_signal(&(frameq->cond_ready));
- LKU(frameq->mutex);
- }
-
- // Remove cleanup handler
- pthread_cleanup_pop(0);
- return NULL;
-}
-
-
-#define INTERVAL_QSIZE 17 // Actual size is 'INTERVAL_QSIZE - 1' because of not using index
-#define SATISFACTION_THRESHOLD 4 // 4 ms --> 250 FPS
-#define RESET_RATIO 4 // RESET_RATIO * [Average Ready Gap | get_max_interval()] --> Reset Threshold
-#define DOUBLE_RESET_TIME_INTERVAL_THRESHOLD 16000 // make it double in case of less 16ms
-#define RESET_ABSOLUTE_INTERVAL 600000 // 600 msec
-
-struct iq_node
-{
- long long rt;
- long long ri;
-};
-
-static struct iq_node _IQ[INTERVAL_QSIZE];
-static int _IQ_head = 0, _IQ_tail = 0;
-static int _IQ_length = 0;
-static long long min_ready, max_ready;
-static long long average_interval;
-
-static int
-_IQ_next_index(int i)
-{
- return (i + 1) % INTERVAL_QSIZE;
-}
-
-static int
-_IQ_previous_index(int i)
-{
- if (--i < 0) i += INTERVAL_QSIZE;
- return i;
-}
-
-static void
-_IQ_init(void)
-{
- _IQ_length = _IQ_head = _IQ_tail = 0;
- min_ready = LLONG_MAX, max_ready = LLONG_MIN;
- average_interval = 0;
-}
-
-static int
-_IQ_empty(void)
-{
- return (_IQ_head == _IQ_tail) ? 1 : 0;
-}
-
-static int
-_IQ_full(void)
-{
- return (_IQ_head == ((_IQ_tail + 1) % INTERVAL_QSIZE)) ? 1 : 0;
-}
-
-static void
-_IQ_insert(long long ready_time, long long last_interval)
-{
- if (_IQ_full()) return;
-
- if (_IQ_empty())
- {
- if (last_interval < 0)
- {
- last_interval = -last_interval;
- }
- _IQ[_IQ_tail].rt = ready_time;
- _IQ[_IQ_tail].ri = last_interval;
- min_ready = ready_time - last_interval;
- max_ready = ready_time;
- _IQ_tail = _IQ_next_index(_IQ_tail);
- _IQ_length++;
- }
- else
- {
- if (max_ready < ready_time)
- {
- _IQ[_IQ_tail].rt = ready_time;
- _IQ[_IQ_tail].ri = ready_time - max_ready;
- _IQ_tail = _IQ_next_index(_IQ_tail);
- _IQ_length++;
- max_ready = ready_time;
- }
- else if (ready_time < min_ready)
- {
- last_interval = _IQ[_IQ_head].ri;
- _IQ[_IQ_head].ri = _IQ[_IQ_head].rt - ready_time;
- _IQ_head = _IQ_previous_index(_IQ_head);
- _IQ[_IQ_head].rt = ready_time;
- _IQ[_IQ_head].ri = last_interval;
- min_ready = ready_time;
- _IQ_length++;
- }
- else
- {
- int i, j, k, l = 0;
- for (i = _IQ_head; i != _IQ_tail; i = j)
- {
- j = _IQ_next_index(i);
- if (_IQ[j].rt < ready_time)
- {
- continue;
- }
- break;
- }
- for (k = _IQ_tail; k != j; k = l)
- {
- l = _IQ_previous_index(k);
- _IQ[k] = _IQ[l];
- }
- i = _IQ_next_index(j);
- _IQ[j].ri -= (_IQ[j].rt - ready_time);
- _IQ[j].rt = ready_time;
- _IQ[i].ri = _IQ[i].rt - ready_time;
- _IQ_tail = _IQ_next_index(_IQ_tail);
- _IQ_length++;
- }
- }
- average_interval = (max_ready - min_ready) / _IQ_length;
-}
-
-static long long
-_IQ_delete(void)
-{
- struct iq_node oldest;
-
- if (_IQ_empty()) return 0;
- oldest = _IQ[_IQ_head];
- _IQ_head = (_IQ_head + 1) % INTERVAL_QSIZE;
- if ((--_IQ_length) == 0)
- {
- _IQ_init();
- }
- else
- {
- min_ready = _IQ[_IQ_head].rt;
- average_interval = (max_ready - min_ready) / _IQ_length;
- }
-
- return oldest.ri;
-}
-
-static long long
-get_max_interval(void)
-{
- int i;
- long long max = LLONG_MIN;
-
- for ( i= _IQ_head ; i != _IQ_tail ; i = _IQ_next_index(i))
- {
- if (_IQ[i].ri > max)
- {
- max = _IQ[i].ri;
- }
- }
-
- return max;
-}
-
-static long long
-tv_to_long_long(struct timeval *tv)
-{
- if (!tv)
- {
- return 0;
- }
-
- return tv->tv_sec * 1000000LL + tv->tv_usec;
-}
-
-static long long
-evas_common_frameq_schedule_flush_time(int frameq_sz, int thread_no,
- long long last_ready_time, long long current_ready_time,
- long long last_flush_time, int ready_frames_num,
- int dont_schedule)
-{
- // to get each time and to do others
- long long current_time = 0LL;
- long long current_ready_interval = 0LL;
- long long theshold_time = SATISFACTION_THRESHOLD * 1000LL; // ms -> usec
- long long reset_time_interval = 0LL;
- long long sleep_time = 0LL;
- long long saved_ready_time, saved_ready_interval;
- long long time_slept = 0LL;
- static long long time_lag = 0;
- struct timeval now;
- int frameq_full_threshold =0;
- int need_reset = 0;
- int need_schedule = 0;
-
- frameq_full_threshold = frameq_sz -thread_no; // Qsize - threads#
-
- /* 1.5 defer flush time of current frame if need */
- // in case of the first time, just keep ready time only
- if (last_ready_time == 0LL)
- {
- last_ready_time = current_ready_time;
- }
- else
- {
- /* 1.5.1 get current ready time & interval */
- saved_ready_time = current_ready_time;
- saved_ready_interval = current_ready_interval = current_ready_time - last_ready_time;
- // compensate a case which current ready time is older than previous one,
- // doesn't work on the interval queue
- if (current_ready_interval < 0)
- {
- current_ready_time = last_ready_time;
- current_ready_interval = 0;
- }
-
- /* 1.5.2 get the reset time interval before keeping a new one */
- if (!_IQ_empty())
- {
- reset_time_interval = RESET_RATIO * average_interval;
- if (average_interval < DOUBLE_RESET_TIME_INTERVAL_THRESHOLD)
- {
- reset_time_interval *= 2;
- }
- }
-
- /* 1.5.3 reset - if too late, discard all saved interval and start from here */
- if (current_ready_interval > RESET_ABSOLUTE_INTERVAL)
- {
- need_reset = 1;
- }
- else if (_IQ_length >= thread_no * 2 && current_ready_interval > reset_time_interval)
- {
- need_reset = 1;
- }
- else if (_IQ_length >= thread_no && _IQ_length < thread_no * 2
- && current_ready_interval > get_max_interval() * RESET_RATIO)
- {
- need_reset = 1;
- }
-
- if (need_reset)
- {
- _IQ_init();
- }
- else
- {
- /* 1.5.4 enqueue - keep a new interval for next average interval */
- if (_IQ_full())
- {
- _IQ_delete();
- }
- _IQ_insert(saved_ready_time, saved_ready_interval);
-
- /* 1.5.5 schedule - if faster than average interval, figure out sleep time to meet it */
- if (!dont_schedule)
- {
- need_schedule = 0;
- sleep_time = 0;
- if (_IQ_length >= thread_no * 2 && average_interval > theshold_time)
- {
- need_schedule = 1;
- }
- // compensate the case that postworker blocks the workers from getting a new fresh frame
- // It's actually occurred when during the wait time of postworker, the frame queue is full
- // Consequently check the number of currently ready frames and apply some time drop to average time according to the number
- if (ready_frames_num >= frameq_full_threshold)
- {
- need_schedule = 0;
- }
- if (need_schedule)
- {
- gettimeofday(&now, NULL);
- current_time = tv_to_long_long(&now);
- time_lag += (current_time - last_flush_time);
- sleep_time = (average_interval < time_lag) ? 0 : (average_interval - time_lag);
- }
- }
-
- /* 1.5.6 sleep - actually sleep and get over-slept time (time_lag) for next frame */
- if (sleep_time > 0)
- {
- sleep_time = sleep_time * 9 / 10;
- usleep((unsigned int)sleep_time);
- gettimeofday(&now, NULL);
- time_slept = tv_to_long_long(&now) - current_time;
- time_lag = time_slept - sleep_time;
- }
- else
- {
- time_lag = 0;
- }
- }
- last_ready_time = current_ready_time;
- }
-
- return last_ready_time;
-}
-
-static void *
-evas_common_frameq_thread_post(void *data)
-{
- Evas_FrameQ *frameq;
- Evas_Frame *frame;
- Evas_Surface *surface;
- Thinfo *thinfo;
- Evas_Frameq_Thread_Info *fq_info;
- Eina_List *pending_writes = NULL;
- Eina_List *prev_pending_writes = NULL;
-
- long long last_ready_time = 0LL;
- long long current_ready_time;
- Evas_Frame *temp_frame = NULL;
- int ready_frames_num;
- long long last_flush_time = 0LL;
- struct timeval now;
- int dont_schedule = 0;
-
- thinfo = data;
- fq_info = (Evas_Frameq_Thread_Info *)(thinfo->fq_info);
- frameq = fq_info->frameq;
-
- pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
- pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
- /* install thread cancelation cleanup handler */
- pthread_cleanup_push(evas_common_frameq_release, data);
-
- _IQ_init();
-
- for (;;)
- {
- /* 1. wait the first frame being done */
- LKL(frameq->mutex);
- while(!frameq->frames || !frameq->frames->ready)
- {
- eina_condition_wait(&(frameq->cond_ready));
- }
- frame = frameq->frames;
-
- /* 1.5. prepare to schedule flush time */
- current_ready_time = tv_to_long_long(&frame->ready_time);
- ready_frames_num = 0;
- EINA_INLIST_FOREACH(EINA_INLIST_GET(frameq->frames), temp_frame)
- {
- if (temp_frame->ready == 1)
- {
- ready_frames_num++;
- }
- }
- dont_schedule = (frame->dont_schedule)?1:0;
- LKU(frameq->mutex);
-
- /* 2. generate pending_writes */
- EINA_INLIST_FOREACH(EINA_INLIST_GET(frame->surfaces), surface)
- {
- evas_common_pipe_flush(surface->im);
- if (! surface->dontpush)
- {
- pending_writes = eina_list_append(pending_writes, surface->im);
- }
- }
-
- /* 2.5. schedule flush time */
- last_ready_time = evas_common_frameq_schedule_flush_time(
- frameq->frameq_sz, frameq->thread_num,
- last_ready_time, current_ready_time,
- last_flush_time, ready_frames_num, dont_schedule);
-
- /* 3. flush redraws */
- frame->output_set_priv(frame->data, pending_writes, prev_pending_writes);
- frame->output_flush(frame->data);
- gettimeofday(&now, NULL);
- // keep as the last flush time
- last_flush_time = now.tv_sec * 1000000LL + now.tv_usec;
-
- prev_pending_writes = pending_writes;
- pending_writes = NULL;
-
- /* 4. remove this frame from the frame queue */
- LKL(frameq->mutex);
- frameq->frames =
- (Evas_Frame *)eina_inlist_remove(EINA_INLIST_GET(frameq->frames),
- EINA_INLIST_GET(frame));
-
- LKU(frameq->mutex);
- eina_condition_broadcast(&frameq->cond_done);
- evas_common_frame_dealloc(frame);
- }
-
- // Remove cleanup handler
- pthread_cleanup_pop(0);
- return NULL;
-}
-
-#endif /* EVAS_FRAME_QUEUING */
#endif
#ifdef BUILD_PTHREAD
#ifdef BUILD_PTHREAD
int i, y, h;
-#ifdef EVAS_FRAME_QUEUING
- return;
-#endif
-
if (!im->cache_entry.pipe) return;
if (thread_num == 1) return;
y = 0;
#endif
}
-#ifdef EVAS_FRAME_QUEUING
-EAPI void
-evas_common_frameq_begin(void)
-{
-#ifdef BUILD_PTHREAD
- int i;
- Evas_Frameq_Thread_Info *fp_info;
- pthread_attr_t attr;
- cpu_set_t cpu;
-
- if (!gframeq.initialised)
- {
- int cpunum, set_cpu_affinity = 0;
-
- cpunum = eina_cpu_count();
- gframeq.thread_num = cpunum;
- gframeq.frameq_sz = cpunum * FRAMEQ_SZ_PER_THREAD;
-
- eina_threads_init();
-
- for (i = 0; i < gframeq.thread_num; i++)
- {
-
- fp_info = calloc(1, sizeof(Evas_Frameq_Thread_Info));
- fp_info->frameq = &gframeq;
-
- gframeq.thinfo[i].thread_num = i;
- gframeq.thinfo[i].fq_info = fp_info;
-
- pthread_attr_init(&attr);
- if (set_cpu_affinity)
- {
- CPU_ZERO(&cpu);
- CPU_SET((i+1) % cpunum, &cpu);
- pthread_attr_setaffinity_np(&attr, sizeof(cpu), &cpu);
- }
-
- pthread_create(&(gframeq.thinfo[i].thread_id), &attr,
- evas_common_frameq_thread, &(gframeq.thinfo[i]));
-
- pthread_attr_destroy(&attr);
- pthread_detach(gframeq.thinfo[i].thread_id);
- }
-
- {
- fp_info = calloc(1, sizeof(Evas_Frameq_Thread_Info));
- fp_info->frameq = &gframeq;
-
- gframeq.thinfo[i].thread_num = i;
- gframeq.thinfo[i].fq_info = fp_info;
-
- pthread_attr_init(&attr);
- if (set_cpu_affinity)
- {
- CPU_ZERO(&cpu);
- CPU_SET((i+1) % cpunum, &cpu);
- pthread_attr_setaffinity_np(&attr, sizeof(cpu), &cpu);
- }
-
- pthread_create(&(gframeq.thinfo[i].thread_id), &attr,
- evas_common_frameq_thread_post, &(gframeq.thinfo[i]));
- pthread_attr_destroy(&attr);
- pthread_detach(gframeq.thinfo[i].thread_id);
- }
- gframeq.initialised = 1; // now worker threads are created.
-
- INF("initialised");
- DBG("%d cpus, set_cpu_affinity=%d, frameq_sz=%d",
- cpunum, set_cpu_affinity, gframeq.frameq_sz);
- }
-#endif /* BUILD_PTHREAD */
-}
-
-EAPI void
-evas_common_frameq_finish(void)
-{
- int i;
-
- /* 1. cancel all worker threads */
- for (i = 0; i < gframeq.thread_num; i++)
- {
- pthread_cancel(gframeq.thinfo[i].thread_id);
- }
- // cancel post-worker thread
- pthread_cancel(gframeq.thinfo[i].thread_id);
-
- /* 2. send signal to worker threads so that they enter to the thread cancelation cleanup handler */
- for (i = 0; i < gframeq.thread_num; i++)
- {
- eina_condition_signal(&(gframeq.cond_new));
- }
- // send signal to post-worker thread
- eina_condition_signal(&(gframeq.cond_ready));
-
- /* all the workers were created and detached before
- * so don't need to join them here.
- */
-
-}
-
-#endif /* EVAS_FRAME_QUEUING */
-
EAPI void
evas_common_pipe_flush(RGBA_Image *im)
{
if (!im->cache_entry.pipe) return;
-#ifndef EVAS_FRAME_QUEUING
#ifdef BUILD_PTHREAD
if (thread_num > 1)
{
- /* sync worker threads */
- pthread_barrier_wait(&(thbarrier[1]));
+ /* sync worker threads */
+ pthread_barrier_wait(&(thbarrier[1]));
}
else
#endif
{
RGBA_Pipe *p;
int i;
-
- /* process pipe - 1 thead */
- for (p = im->cache_entry.pipe; p; p = (RGBA_Pipe *)(EINA_INLIST_GET(p))->next)
- {
- for (i = 0; i < p->op_num; i++)
- {
- if (p->op[i].op_func)
- {
- p->op[i].op_func(im, &(p->op[i]), NULL);
- }
- }
- }
+
+ /* process pipe - 1 thead */
+ for (p = im->cache_entry.pipe; p; p = (RGBA_Pipe *)(EINA_INLIST_GET(p))->next)
+ {
+ for (i = 0; i < p->op_num; i++)
+ {
+ if (p->op[i].op_func)
+ {
+ p->op[i].op_func(im, &(p->op[i]), NULL);
+ }
+ }
+ }
}
-#endif /* !EVAS_FRAME_QUEUING */
+
evas_common_cpu_end_opt();
evas_common_pipe_free(im);
}
static void
evas_common_pipe_op_text_free(RGBA_Pipe_Op *op)
{
-#ifdef EVAS_FRAME_QUEUING
- LKL(op->op.text.font->ref_fq_del);
- op->op.text.font->ref_fq[1]++;
- LKU(op->op.text.font->ref_fq_del);
- eina_condition_signal(&(op->op.text.font->cond_fq_del));
-#else
evas_common_font_free(op->op.text.font);
-#endif
evas_common_text_props_content_unref(&(op->op.text.intl_props));
evas_common_pipe_op_free(op);
}
-#ifdef EVAS_FRAME_QUEUING
-/* flush all op using @fn */
-EAPI void
-evas_common_pipe_op_text_flush(RGBA_Font *fn)
-{
- if (! evas_common_frameq_enabled())
- return;
-
- LKL(fn->ref_fq_add);
- LKL(fn->ref_fq_del);
-
- while (fn->ref_fq[0] != fn->ref_fq[1])
- eina_condition_wait(&(fn->cond_fq_del));
-
- LKU(fn->ref_fq_del);
- LKU(fn->ref_fq_add);
-}
-#endif
-
static void
evas_common_pipe_text_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info)
{
op->op.text.y = y;
evas_common_text_props_content_copy_and_ref(&(op->op.text.intl_props),
intl_props);
-#ifdef EVAS_FRAME_QUEUING
- LKL(fn->ref_fq_add);
- fn->ref_fq[0]++;
- LKU(fn->ref_fq_add);
-#else
fn->references++;
-#endif
op->op.text.font = fn;
op->op_func = evas_common_pipe_text_draw_do;
op->free_func = evas_common_pipe_op_text_free;
static void
evas_common_pipe_op_image_free(RGBA_Pipe_Op *op)
{
-#ifdef EVAS_FRAME_QUEUING
- LKL(op->op.image.src->cache_entry.ref_fq_del);
- op->op.image.src->cache_entry.ref_fq[1]++;
- LKU(op->op.image.src->cache_entry.ref_fq_del);
- eina_condition_signal(&(op->op.image.src->cache_entry.cond_fq_del));
-#else
op->op.image.src->ref--;
if (op->op.image.src->ref == 0)
{
evas_cache_image_drop(&op->op.image.src->cache_entry);
}
-#endif
evas_common_pipe_op_free(op);
}
-#ifdef EVAS_FRAME_QUEUING
-EAPI void
-evas_common_pipe_op_image_flush(RGBA_Image *im)
-{
- if (! evas_common_frameq_enabled())
- return;
-
- LKL(im->cache_entry.ref_fq_add);
- LKL(im->cache_entry.ref_fq_del);
-
- while (im->cache_entry.ref_fq[0] != im->cache_entry.ref_fq[1])
- eina_condition_wait(&(im->cache_entry.cond_fq_del));
-
- LKU(im->cache_entry.ref_fq_del);
- LKU(im->cache_entry.ref_fq_add);
-}
-#endif
-
static void
evas_common_pipe_image_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info)
{
op->op.image.dy = dst_region_y;
op->op.image.dw = dst_region_w;
op->op.image.dh = dst_region_h;
-#ifdef EVAS_FRAME_QUEUING
- LKL(src->cache_entry.ref_fq_add);
- src->cache_entry.ref_fq[0]++;
- LKU(src->cache_entry.ref_fq_add);
-#else
src->ref++;
-#endif
op->op.image.src = src;
op->op_func = evas_common_pipe_image_draw_do;
op->free_func = evas_common_pipe_op_image_free;
evas_common_pipe_draw_context_copy(dc, op);
-#ifdef EVAS_FRAME_QUEUING
- /* laod every src image here.
- * frameq utilize all cpu cores already by worker threads
- * so another threads and barrier waiting can't be of any benefit.
- * therefore, not instantiate loader threads.
- */
- if (src->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
- evas_cache_image_load_data(&src->cache_entry);
- evas_common_image_colorspace_normalize(src);
-#else
evas_common_pipe_image_load(src);
-#endif
}
static void
evas_common_pipe_op_map_free(RGBA_Pipe_Op *op)
{
-#ifdef EVAS_FRAME_QUEUING
- LKL(op->op.image.src->cache_entry.ref_fq_del);
- op->op.image.src->cache_entry.ref_fq[1]++;
- LKU(op->op.image.src->cache_entry.ref_fq_del);
-#else
op->op.map.src->ref--;
if (op->op.map.src->ref == 0)
evas_cache_image_drop(&op->op.map.src->cache_entry);
-#endif
free(op->op.map.p);
evas_common_pipe_op_free(op);
}
op->op.map.npoints = npoints;
op->op.map.smooth = smooth;
op->op.map.level = level;
-#ifdef EVAS_FRAME_QUEUING
- LKL(src->cache_entry.ref_fq_add);
- src->cache_entry.ref_fq[0]++;
- LKU(src->cache_entry.ref_fq_add);
-#else
src->ref++;
-#endif
op->op.map.src = src;
op->op.map.p = pts_copy;
op->op_func = evas_common_pipe_map_draw_do;
op->free_func = evas_common_pipe_op_map_free;
evas_common_pipe_draw_context_copy(dc, op);
-#ifdef EVAS_FRAME_QUEUING
- /* laod every src image here.
- * frameq utilize all cpu cores already by worker threads
- * so another threads and barrier waiting can't be of any benefit.
- * therefore, not instantiate loader threads.
- */
- if (src->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
- evas_cache_image_load_data(&src->cache_entry);
- evas_common_image_colorspace_normalize(src);
-#else
evas_common_pipe_image_load(src);
-#endif
}
static void
pthread_t thread_id;
pthread_barrier_t *barrier;
RGBA_Pipe_Thread_Info *info;
-# ifdef EVAS_FRAME_QUEUING
- void *fq_info;
-#endif
} Thinfo;
#endif
-#ifdef EVAS_FRAME_QUEUING
-struct _Evas_Surface
-{
- EINA_INLIST;
- RGBA_Image *im;
- int x, y, w, h;
- int dontpush; // dont push the surface out after drawing done
-};
-typedef struct _Evas_Surface Evas_Surface;
-
-struct _Evas_Frame
-{
- EINA_INLIST;
- Evas_Surface *surfaces;
- void *data;
- int in_process;
- int ready;
- int dont_schedule;
- struct timeval ready_time;
-
- void (*output_redraws_next_update_push) (void *data, void *surface, int x, int y, int w, int h);
- void (*output_flush) (void *data);
- void (*output_set_priv)(void *data, void *cur, void *prev);
-};
-typedef struct _Evas_Frame Evas_Frame;
-
-
-struct _Evas_FrameQ
-{
- int initialised;
- Evas_Frame *frames;
- Eina_Condition cond_new;
- Eina_Condition cond_ready;
- Eina_Condition cond_done;
- LK(mutex);
-
- int thread_num;
- Thinfo thinfo[TH_MAX];
- int frameq_sz;
-
- Evas_Frame *cur_frame;
-};
-typedef struct _Evas_FrameQ Evas_FrameQ;
-#define FRAMEQ_SZ_PER_THREAD 2
-
-struct _Evas_Frameq_Thread_Info
-{
- Evas_FrameQ *frameq;
-};
-typedef struct _Evas_Frameq_Thread_Info Evas_Frameq_Thread_Info;
-
-EAPI Evas_Surface *evas_common_frameq_new_surface(void *surface, int x, int y, int w, int h);
-EAPI void evas_common_frameq_add_surface(Evas_Surface *surface);
-EAPI void evas_common_frameq_set_frame_data(void *data,
- void (*fn_output_redraws_next_update_push) (void *data, void *surface, int x, int y, int w, int h),
- void (*fn_output_flush) (void *data),
- void (*fn_output_set_priv)(void *data, void *cur, void *prev));
-EAPI void evas_common_frameq_prepare_frame(void);
-EAPI void evas_common_frameq_ready_frame(void);
-EAPI void evas_common_frameq_init(void);
-EAPI void evas_common_frameq_destroy(void);
-EAPI void evas_common_frameq_flush(void);
-EAPI void evas_common_frameq_flush_ready(void);
-EAPI int evas_common_frameq_get_frameq_sz(void);
-EAPI int evas_common_frameq_enabled(void);
-EAPI void evas_common_frameq_begin(void);
-EAPI void evas_common_frameq_finish(void);
-#endif
-
/* image rendering pipelines... new optional system - non-immediate and
* threadable
*/
int smooth, int level);
EAPI void evas_common_pipe_flush(RGBA_Image *im);
-#ifdef EVAS_FRAME_QUEUING
-EAPI void evas_common_pipe_op_text_flush(RGBA_Font *fn);
-EAPI void evas_common_pipe_op_image_flush(RGBA_Image *im);
-#endif
-
#endif /* _EVAS_PIPE_H */
Image_Timestamp tstamp;
int references;
-#ifdef EVAS_FRAME_QUEUING
- LK(lock_references); // needed for accessing references
-#endif
#ifdef BUILD_PIPE_RENDER
RGBA_Pipe *pipe;
-#ifdef EVAS_FRAME_QUEUING
- LK(ref_fq_add);
- LK(ref_fq_del);
- Eina_Condition cond_fq_del;
- int ref_fq[2]; // ref_fq[0] is for addition, ref_fq[1] is for deletion
-#endif
#endif
unsigned char scale;
Fash_Int *fash;
Font_Hint_Flags hinting;
int references;
-#ifdef EVAS_FRAME_QUEUING
- int ref_fq[2]; //ref_fq[0] is for addition, ref_fq[1] is for deletion
- Eina_Condition cond_fq_del;
- LK(ref_fq_add);
- LK(ref_fq_del);
-#endif
LK(lock);
unsigned char sizeok : 1;
};
eng_rectangle_draw(void *data __UNUSED__, void *context, void *surface, int x, int y, int w, int h)
{
#ifdef BUILD_PIPE_RENDER
- if ((cpunum > 1)
-#ifdef EVAS_FRAME_QUEUING
- && evas_common_frameq_enabled()
-#endif
- )
+ if ((cpunum > 1))
evas_common_pipe_rectangle_draw(surface, context, x, y, w, h);
else
#endif
eng_line_draw(void *data __UNUSED__, void *context, void *surface, int x1, int y1, int x2, int y2)
{
#ifdef BUILD_PIPE_RENDER
- if ((cpunum > 1)
- #ifdef EVAS_FRAME_QUEUING
- && evas_common_frameq_enabled()
-#endif
- )
+ if ((cpunum > 1))
evas_common_pipe_line_draw(surface, context, x1, y1, x2, y2);
else
#endif
eng_polygon_draw(void *data __UNUSED__, void *context, void *surface, void *polygon, int x, int y)
{
#ifdef BUILD_PIPE_RENDER
- if ((cpunum > 1)
-#ifdef EVAS_FRAME_QUEUING
- && evas_common_frameq_enabled()
-#endif
- )
+ if ((cpunum > 1))
evas_common_pipe_poly_draw(surface, context, polygon, x, y);
else
#endif
if (!image) return;
im = image;
#ifdef BUILD_PIPE_RENDER
- if ((cpunum > 1)
-#ifdef EVAS_FRAME_QUEUING
- && evas_common_frameq_enabled()
-#endif
- )
+ if ((cpunum > 1))
{
evas_common_rgba_image_scalecache_prepare((Image_Entry *)(im),
surface, context, smooth,
else
{
#ifdef BUILD_PIPE_RENDER
- if ((cpunum > 1)
-# ifdef EVAS_FRAME_QUEUING
- && evas_common_frameq_enabled()
-# endif
- )
+ if ((cpunum > 1))
evas_common_pipe_map_draw(im, surface, context, npoints, p, smooth, level);
else
#endif
eng_font_draw(void *data __UNUSED__, void *context, void *surface, Evas_Font_Set *font, int x, int y, int w __UNUSED__, int h __UNUSED__, int ow __UNUSED__, int oh __UNUSED__, const Evas_Text_Props *text_props)
{
#ifdef BUILD_PIPE_RENDER
- if ((cpunum > 1)
-#ifdef EVAS_FRAME_QUEUING
- && evas_common_frameq_enabled()
-#endif
- )
+ if ((cpunum > 1))
evas_common_pipe_text_draw(surface, context, (RGBA_Font *) font, x, y,
text_props);
else
int dpi;
} xr;
*/
-#ifdef EVAS_FRAME_QUEUING
- Evas_Engine_Render_Mode render_mode;
-#endif
-
void (*outbuf_free)(Outbuf *ob);
void (*outbuf_reconfigure)(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth);
int (*outbuf_get_rot)(Outbuf *ob);
void (*outbuf_flush)(Outbuf *ob);
void (*outbuf_idle_flush)(Outbuf *ob);
Eina_Bool (*outbuf_alpha_get)(Outbuf *ob);
-#ifdef EVAS_FRAME_QUEUING
- void (*outbuf_set_priv)(Outbuf *ob, void *cur, void *prev);
-#endif
};
/* prototypes we will use here */
re->outbuf_flush = evas_software_xlib_outbuf_flush;
re->outbuf_idle_flush = evas_software_xlib_outbuf_idle_flush;
re->outbuf_alpha_get = evas_software_xlib_outbuf_alpha_get;
-# ifdef EVAS_FRAME_QUEUING
- re->outbuf_set_priv = evas_software_xlib_outbuf_set_priv;
- re->render_mode = info->render_mode;
-# endif
}
#endif
re->outbuf_flush = evas_software_xcb_outbuf_flush;
re->outbuf_idle_flush = evas_software_xcb_outbuf_idle_flush;
re->outbuf_alpha_get = evas_software_xcb_outbuf_alpha_get;
-# ifdef EVAS_FRAME_QUEUING
- re->outbuf_set_priv = evas_software_xcb_outbuf_priv_set;
- re->render_mode = info->render_mode;
-# endif
}
#endif
{
int ponebuf = 0;
-#ifdef EVAS_FRAME_QUEUING
- evas_common_frameq_flush();
-#endif
re = e->engine.data.output;
ponebuf = re->ob->onebuf;
info->info.destination_alpha);
evas_software_xlib_outbuf_debug_set(re->ob, info->info.debug);
-# ifdef EVAS_FRAME_QUEUING
- re->render_mode = info->render_mode;
-# endif
}
#endif
info->info.destination_alpha);
evas_software_xcb_outbuf_debug_set(re->ob, info->info.debug);
-#ifdef EVAS_FRAME_QUEUING
- re->render_mode = info->render_mode;
-#endif
}
#endif
re->ob->onebuf = ponebuf;
eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
{
Render_Engine *re;
-#ifdef EVAS_FRAME_QUEUING
- Evas_Surface *e_surface;
-#endif
re = (Render_Engine *)data;
-#if defined(BUILD_PIPE_RENDER) && !defined(EVAS_FRAME_QUEUING)
+#if defined(BUILD_PIPE_RENDER)
evas_common_pipe_map_begin(surface);
-#endif /* BUILD_PIPE_RENDER && !EVAS_FRAME_QUEUING*/
-
-#ifdef EVAS_FRAME_QUEUING
- if (re->render_mode == EVAS_RENDER_MODE_NONBLOCKING)
- {
- /* create a new frame if this is the first surface of this frame */
- evas_common_frameq_prepare_frame();
- /* add surface into the frame */
- e_surface = evas_common_frameq_new_surface(surface, x, y, w, h);
- evas_common_frameq_add_surface(e_surface);
- return;
- }
-#endif
-
- re->outbuf_push_updated_region(re->ob, surface, x, y, w, h);
- re->outbuf_free_region_for_update(re->ob, surface);
- evas_common_cpu_end_opt();
-}
-
-#ifdef EVAS_FRAME_QUEUING
-static void *
-eng_image_map_surface_new(void *data , int w, int h, int alpha)
-{
- void *surface;
- DATA32 *pixels;
- Render_Engine *re;
- Evas_Surface *e_surface;
-
- re = (Render_Engine *)data;
-
- surface =
- evas_cache_image_copied_data(evas_common_image_cache_get(), w, h, NULL,
- alpha, EVAS_COLORSPACE_ARGB8888);
- pixels = evas_cache_image_pixels(surface);
-
- if (re->render_mode == EVAS_RENDER_MODE_NONBLOCKING)
- {
- /* create a new frame if this is the first surface of this frame */
- evas_common_frameq_prepare_frame();
-
- /* add surface into the frame */
- e_surface = evas_common_frameq_new_surface(surface, 0, 0, w, h);
-
- /* this surface is not going to be pushed to screen */
- e_surface->dontpush = 1;
- evas_common_frameq_add_surface(e_surface);
- }
- return surface;
-}
+#endif /* BUILD_PIPE_RENDER */
-static void
-eng_output_frameq_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
-{
- Render_Engine *re;
-
- re = (Render_Engine *)data;
re->outbuf_push_updated_region(re->ob, surface, x, y, w, h);
re->outbuf_free_region_for_update(re->ob, surface);
evas_common_cpu_end_opt();
}
static void
-eng_output_frameq_flush(void *data)
-{
- Render_Engine *re;
-
- re = (Render_Engine *)data;
- re->outbuf_flush(re->ob);
-}
-
-static void
-eng_output_frameq_set_priv(void *data, void *cur, void *prev)
-{
- Render_Engine *re;
-
- re = (Render_Engine *)data;
- re->outbuf_set_priv(re->ob, cur, prev);
-}
-#endif
-
-static void
eng_output_flush(void *data)
{
Render_Engine *re;
re = (Render_Engine *)data;
-#ifdef EVAS_FRAME_QUEUING
- if (re->render_mode == EVAS_RENDER_MODE_NONBLOCKING)
- {
- evas_common_frameq_set_frame_data(data,
- eng_output_frameq_redraws_next_update_push,
- eng_output_frameq_flush,
- eng_output_frameq_set_priv);
- evas_common_frameq_ready_frame();
- evas_common_frameq_begin();
- }
- else
-#endif
- re->outbuf_flush(re->ob);
+ re->outbuf_flush(re->ob);
}
static void
ORD(output_redraws_next_update_push);
ORD(output_flush);
ORD(output_idle_flush);
-#ifdef EVAS_FRAME_QUEUING
- ORD(image_map_surface_new);
-#endif
/* now advertise out own api */
em->functions = (void *)(&func);
/* a list of previous frame pending regions to write to the target */
Eina_List *prev_pending_writes;
-# ifdef EVAS_FRAME_QUEUING
- /* protecting prev_pending_writes */
- LK(lock);
-# endif
-
unsigned char mask_dither : 1;
unsigned char destination_alpha : 1;
unsigned char debug : 1;
/* Sync only needed for testing */
if (try_shm == 2) _xcbob_sync(conn);
-#if defined(EVAS_FRAME_QUEUING) && defined(LIBXEXT_VERSION_LOW)
+#if defined(LIBXEXT_VERSION_LOW)
if (evas_common_frameq_enabled())
xcb_grab_server(conn);
#endif
xcb_shm_attach(conn, xcbob->shm_info->shmseg,
xcbob->shm_info->shmid, 0);
-#if defined(EVAS_FRAME_QUEUING) && defined(LIBXEXT_VERSION_LOW)
+#if defined(LIBXEXT_VERSION_LOW)
if (evas_common_frameq_enabled())
xcb_ungrab_server(conn);
#endif
static int _shmlimit = (10 * 1024 * 1024);
static const unsigned int _shmcountlimit = 32;
-#ifdef EVAS_FRAME_QUEUING
-static LK(lock_shmpool);
-# define SHMPOOL_LOCK() LKL(lock_shmpool);
-# define SHMPOOL_UNLOCK() LKU(lock_shmpool);
-#else
-# define SHMPOOL_LOCK()
-# define SHMPOOL_UNLOCK()
-#endif
+#define SHMPOOL_LOCK()
+#define SHMPOOL_UNLOCK()
void
evas_software_xcb_outbuf_init(void)
{
-#ifdef EVAS_FRAME_QUEUING
- LKI(lock_shmpool);
-#endif
}
void
evas_software_xcb_outbuf_free(Outbuf *buf)
{
-#ifdef EVAS_FRAME_QUEUING
- LKL(buf->priv.lock);
-#endif
while (buf->priv.pending_writes)
{
RGBA_Image *im = NULL;
if (obr->mask) _unfind_xcbob(obr->mask, EINA_FALSE);
free(obr);
}
-#ifdef EVAS_FRAME_QUEUING
- LKU(buf->priv.lock);
-#endif
evas_software_xcb_outbuf_idle_flush(buf);
evas_software_xcb_outbuf_flush(buf);
if (buf->priv.x11.xcb.gc)
buf->priv.x11.xcb.cmap,
buf->priv.x11.xcb.visual,
buf->priv.pal);
-#ifdef EVAS_FRAME_QUEUING
- LKD(buf->priv.lock);
-#endif
free(buf);
_clear_xcbob(EINA_FALSE);
}
evas_software_xcb_outbuf_drawable_set(buf, draw);
evas_software_xcb_outbuf_mask_set(buf, mask);
-#ifdef EVAS_FRAME_QUEUING
- LKI(buf->priv.lock);
-#endif
-
return buf;
}
// memset(im->image.data, 0, (w * h * sizeof(DATA32)));
}
-#ifdef EVAS_FRAME_QUEUING
- if (!evas_common_frameq_enabled())
-#endif
- buf->priv.pending_writes = eina_list_append(buf->priv.pending_writes, im);
+ buf->priv.pending_writes = eina_list_append(buf->priv.pending_writes, im);
return im;
}
buf->priv.x11.xcb.gcm,
obr->x, obr->y, 0);
}
-# ifdef EVAS_FRAME_QUEUING
- LKL(buf->priv.lock);
-# endif
while (buf->priv.prev_pending_writes)
{
im = buf->priv.prev_pending_writes->data;
free(obr);
}
buf->priv.prev_pending_writes = buf->priv.pending_writes;
-# ifdef EVAS_FRAME_QUEUING
- LKU(buf->priv.lock);
-# endif
buf->priv.pending_writes = NULL;
xcb_flush(buf->priv.x11.xcb.conn);
#else
}
else
{
-#ifdef EVAS_FRAME_QUEUING
- LKL(buf->priv.lock);
-#endif
if (buf->priv.prev_pending_writes)
_xcbob_sync(buf->priv.x11.xcb.conn);
while (buf->priv.prev_pending_writes)
if (obr->mask) _unfind_xcbob(obr->mask, EINA_FALSE);
free(obr);
}
-#ifdef EVAS_FRAME_QUEUING
- LKU(buf->priv.lock);
-#endif
_clear_xcbob(EINA_FALSE);
}
}
}
}
-#ifdef EVAS_FRAME_QUEUING
-void
-evas_software_xcb_outbuf_priv_set(Outbuf *buf, void *cur, void *prev __UNUSED__)
-{
- buf->priv.pending_writes = (Eina_List *)cur;
-}
-#endif
/* local functions */
static Xcb_Output_Buffer *
void evas_software_xcb_outbuf_debug_set(Outbuf *buf, Eina_Bool debug);
void evas_software_xcb_outbuf_debug_show(Outbuf *buf, xcb_drawable_t drawable, int x, int y, int w, int h);
-# ifdef EVAS_FRAME_QUEUING
-void evas_software_xcb_outbuf_priv_set(Outbuf *buf, void *cur, void *prev);
-# endif
-
#endif
ph = XSetErrorHandler((XErrorHandler)
x_output_tmp_x_err);
}
-#if defined(EVAS_FRAME_QUEUING) && defined(LIBXEXT_VERSION_LOW)
+#if defined(LIBXEXT_VERSION_LOW)
/* workaround for libXext of lower then 1.1.1 */
if (evas_common_frameq_enabled())
XLockDisplay(d);
#endif
XShmAttach(d, xob->shm_info);
-#if defined(EVAS_FRAME_QUEUING) && defined(LIBXEXT_VERSION_LOW)
+#if defined(LIBXEXT_VERSION_LOW)
/* workaround for libXext of lower then 1.1.1 */
if (evas_common_frameq_enabled())
XUnlockDisplay(d);
static int shmmemlimit = 10 * 1024 * 1024;
static const unsigned int shmcountlimit = 32;
-#ifdef EVAS_FRAME_QUEUING
-static LK(lock_shmpool);
-#define SHMPOOL_LOCK() LKL(lock_shmpool)
-#define SHMPOOL_UNLOCK() LKU(lock_shmpool)
-#else
#define SHMPOOL_LOCK()
#define SHMPOOL_UNLOCK()
-#endif
static X_Output_Buffer *
_find_xob(Display *d, Visual *v, int depth, int w, int h, int shm, void *data)
void
evas_software_xlib_outbuf_init(void)
{
-#ifdef EVAS_FRAME_QUEUING
- LKI(lock_shmpool);
-#endif
}
void
evas_software_xlib_outbuf_free(Outbuf *buf)
{
-#ifdef EVAS_FRAME_QUEUING
- LKL(buf->priv.lock);
-#endif
while (buf->priv.pending_writes)
{
RGBA_Image *im;
if (obr->mxob) _unfind_xob(obr->mxob, 0);
free(obr);
}
-#ifdef EVAS_FRAME_QUEUING
- LKU(buf->priv.lock);
-#endif
evas_software_xlib_outbuf_idle_flush(buf);
evas_software_xlib_outbuf_flush(buf);
if (buf->priv.x11.xlib.gc)
if (buf->priv.pal)
evas_software_xlib_x_color_deallocate(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.cmap,
buf->priv.x11.xlib.vis, buf->priv.pal);
-#ifdef EVAS_FRAME_QUEUING
- LKD(buf->priv.lock);
-#endif
free(buf);
_clear_xob(0);
}
evas_software_xlib_outbuf_drawable_set(buf, draw);
evas_software_xlib_outbuf_mask_set(buf, mask);
}
-#ifdef EVAS_FRAME_QUEUING
- LKI(buf->priv.lock);
-#endif
return buf;
}
// memset(im->image.data, 0, w * h * sizeof(DATA32));
}
-#ifdef EVAS_FRAME_QUEUING
- if (!evas_common_frameq_enabled())
-#endif
- buf->priv.pending_writes = eina_list_append(buf->priv.pending_writes, im);
+ buf->priv.pending_writes = eina_list_append(buf->priv.pending_writes, im);
return im;
}
buf->priv.x11.xlib.gcm,
obr->x, obr->y, 0);
}
-#ifdef EVAS_FRAME_QUEUING
- LKL(buf->priv.lock);
-#endif
while (buf->priv.prev_pending_writes)
{
im = buf->priv.prev_pending_writes->data;
free(obr);
}
buf->priv.prev_pending_writes = buf->priv.pending_writes;
-#ifdef EVAS_FRAME_QUEUING
- LKU(buf->priv.lock);
-#endif
buf->priv.pending_writes = NULL;
XFlush(buf->priv.x11.xlib.disp);
#else
}
else
{
-#ifdef EVAS_FRAME_QUEUING
- LKL(buf->priv.lock);
-#endif
if (buf->priv.prev_pending_writes) XSync(buf->priv.x11.xlib.disp, False);
while (buf->priv.prev_pending_writes)
{
if (obr->mxob) _unfind_xob(obr->mxob, 0);
free(obr);
}
-#ifdef EVAS_FRAME_QUEUING
- LKU(buf->priv.lock);
-#endif
_clear_xob(0);
}
}
return buf->priv.x11.xlib.mask;
}
-#ifdef EVAS_FRAME_QUEUING
-void
-evas_software_xlib_outbuf_set_priv(Outbuf *buf, void *cur, void *prev __UNUSED__)
-{
- buf->priv.pending_writes = (Eina_List *)cur;
-}
-#endif
int h);
Eina_Bool evas_software_xlib_outbuf_alpha_get (Outbuf *buf);
-#ifdef EVAS_FRAME_QUEUING
-void evas_software_xlib_outbuf_set_priv (Outbuf *buf,
- void *cur,
- void *prev);
-#endif
#endif