forked from enlightenment/efl
evas render2 work - no new feature - paralell bit of code
*this does not affect any "stable" code paths - it's render2 and some added region code that i MAY have to use to fix some bugs/issues as i am noticing tilebuf being pretty silly and just doing bounding boxes. region code lifted from xserver (mit-x11 license thus compatible with evas bsd) and it's been stripped down and cleaned up with some tilebuf optimizations like remembering the last rect add/del to avoid work when repetedly adding/delling the same rects (very common).
This commit is contained in:
parent
e0c81ed35f
commit
65ebf496fd
|
@ -1,6 +1,8 @@
|
|||
#include "evas_common_private.h"
|
||||
#include "evas_private.h"
|
||||
|
||||
#include "evas_render2.h"
|
||||
|
||||
#define MY_CLASS EVAS_RECTANGLE_CLASS
|
||||
|
||||
/* private magic number for rectangle objects */
|
||||
|
@ -140,7 +142,7 @@ evas_object_rectangle_render2_walk(Evas_Object *eo_obj,
|
|||
printf(" UP1 %p - %4i %4i %4ix%4i\n", eo_obj,
|
||||
obj->cur->cache.clip.x, obj->cur->cache.clip.y,
|
||||
obj->cur->cache.clip.w, obj->cur->cache.clip.h);
|
||||
evas_common_tilebuf_add_redraw
|
||||
region_rect_add
|
||||
(updates,
|
||||
obj->cur->cache.clip.x - offx, obj->cur->cache.clip.y - offy,
|
||||
obj->cur->cache.clip.w, obj->cur->cache.clip.h);
|
||||
|
@ -163,11 +165,11 @@ evas_object_rectangle_render2_walk(Evas_Object *eo_obj,
|
|||
printf(" UP2 %p - %4i %4i %4ix%4i\n", eo_obj,
|
||||
obj->prev->cache.clip.x, obj->prev->cache.clip.y,
|
||||
obj->prev->cache.clip.w, obj->prev->cache.clip.h);
|
||||
evas_common_tilebuf_add_redraw
|
||||
region_rect_add
|
||||
(updates,
|
||||
obj->prev->cache.clip.x - offx, obj->prev->cache.clip.y - offy,
|
||||
obj->prev->cache.clip.w, obj->prev->cache.clip.h);
|
||||
evas_common_tilebuf_add_redraw
|
||||
region_rect_add
|
||||
(updates,
|
||||
obj->cur->cache.clip.x - offx, obj->cur->cache.clip.y - offy,
|
||||
obj->cur->cache.clip.w, obj->cur->cache.clip.h);
|
||||
|
@ -180,7 +182,7 @@ nochange:
|
|||
printf(" NO- %p - %4i %4i %4ix%4i\n", eo_obj,
|
||||
obj->cur->cache.clip.x, obj->cur->cache.clip.y,
|
||||
obj->cur->cache.clip.w, obj->cur->cache.clip.h);
|
||||
evas_common_tilebuf_del_redraw
|
||||
region_rect_del
|
||||
(updates,
|
||||
obj->cur->cache.clip.x - offx, obj->cur->cache.clip.y - offy,
|
||||
obj->cur->cache.clip.w, obj->cur->cache.clip.h);
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
#include <sys/time.h>
|
||||
|
||||
#include "region.c"
|
||||
|
||||
#ifndef _WIN32
|
||||
static inline double
|
||||
get_time(void)
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
#include "evas_cs2_private.h"
|
||||
#endif
|
||||
|
||||
#include "region.h"
|
||||
|
||||
Eina_Bool _evas_render2(Eo *eo_e, Evas_Public_Data *e);
|
||||
Eina_List *_evas_render2_updates(Eo *eo_e, Evas_Public_Data *e);
|
||||
Eina_List *_evas_render2_updates_wait(Eo *eo_e, Evas_Public_Data *e);
|
||||
|
|
|
@ -173,16 +173,15 @@ _evas_render2_th_main_do(Eo *eo_e, Evas_Public_Data *e)
|
|||
Render2_Finish_Data *render_finish_data;
|
||||
Evas_Layer *lay;
|
||||
Evas_Object_Protected_Data *obj;
|
||||
double t;
|
||||
Tilebuf *updates = NULL;
|
||||
Tilebuf_Rect *rects, *r;
|
||||
Eina_List *updates_list = NULL, *l;
|
||||
double t;
|
||||
Eina_Rectangle *rect;
|
||||
|
||||
updates = evas_common_tilebuf_new(e->output.w, e->output.h);
|
||||
evas_common_tilebuf_set_tile_size(updates, TILESIZE, TILESIZE);
|
||||
// evas_common_tilebuf_tile_strict_set(updates, EINA_TRUE);
|
||||
Region *updates;
|
||||
Box *rects;
|
||||
int rects_num, i;
|
||||
static int num = 0;
|
||||
|
||||
updates = region_new();
|
||||
printf("........... updates # %i\n", num++);
|
||||
t = get_time();
|
||||
EINA_INLIST_FOREACH(e->layers, lay)
|
||||
|
@ -197,34 +196,34 @@ _evas_render2_th_main_do(Eo *eo_e, Evas_Public_Data *e)
|
|||
// add explicitly exposed/damaged regions of the canvas
|
||||
EINA_LIST_FREE(e->damages, rect)
|
||||
{
|
||||
evas_common_tilebuf_add_redraw(updates, rect->x, rect->y,
|
||||
rect->w, rect->h);
|
||||
region_rect_add(updates, rect->x, rect->y, rect->w, rect->h);
|
||||
eina_rectangle_free(rect);
|
||||
}
|
||||
// build obscure objects list of active objects that obscure
|
||||
EINA_LIST_FOREACH(e->obscures, l, rect)
|
||||
{
|
||||
evas_common_tilebuf_del_redraw(updates, rect->x, rect->y,
|
||||
rect->w, rect->h);
|
||||
region_rect_del(updates, rect->x, rect->y, rect->w, rect->h);
|
||||
}
|
||||
t = get_time() - t;
|
||||
printf("T: update generation: "); out_time(t);
|
||||
|
||||
rects = evas_common_tilebuf_get_render_rects(updates);
|
||||
EINA_INLIST_FOREACH(EINA_INLIST_GET(rects), r)
|
||||
rects = region_rects(updates);
|
||||
rects_num = region_rects_num(updates);
|
||||
for (i = 0; i < rects_num; i++)
|
||||
{
|
||||
rect = malloc(sizeof(Eina_Rectangle));
|
||||
if (rect)
|
||||
{
|
||||
printf(" Render Region [ %4i %4i %4ix%4i ]\n", r->x, r->y, r->w, r->h);
|
||||
rect->x = r->x; rect->y = r->y;
|
||||
rect->w = r->w; rect->h = r->h;
|
||||
rect->x = rects[i].x1;
|
||||
rect->y = rects[i].y1;
|
||||
rect->w = rects[i].x2 - rects[i].x1;
|
||||
rect->h = rects[i].y2 - rects[i].y1;
|
||||
printf(" Render Region [ %4i %4i %4ix%4i ]\n",
|
||||
rect->x, rect->y, rect->w, rect->h);
|
||||
updates_list = eina_list_append(updates_list, rect);
|
||||
}
|
||||
}
|
||||
evas_common_tilebuf_free_render_rects(rects);
|
||||
|
||||
evas_common_tilebuf_free(updates);
|
||||
region_free(updates);
|
||||
|
||||
e->changed = EINA_FALSE;
|
||||
// remove from the "i'm rendering" pool - do back in mainloop
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,97 @@
|
|||
#ifndef _REGION_H_
|
||||
#define _REGION_H_
|
||||
|
||||
/***********************************************************
|
||||
|
||||
Copyright 1987, 1998 The Open Group
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name of The Open Group shall not be
|
||||
used in advertising or otherwise to promote the sale, use or other dealings
|
||||
in this Software without prior written authorization from The Open Group.
|
||||
|
||||
|
||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Digital not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
******************************************************************/
|
||||
/* $Id: pixman.h,v 1.21 2005/06/25 01:21:16 jrmuizel Exp $ */
|
||||
|
||||
/* pixregion.h */
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
typedef struct _Region Region;
|
||||
typedef struct _Box Box;
|
||||
|
||||
typedef enum _Region_State
|
||||
{
|
||||
REGION_STATE_OUT,
|
||||
REGION_STATE_IN,
|
||||
REGION_STATE_PARTIAL
|
||||
} Region_State;
|
||||
|
||||
struct _Box
|
||||
{
|
||||
int x1, y1, x2, y2;
|
||||
};
|
||||
|
||||
/* creation/destruction */
|
||||
|
||||
Region *region_new (void);
|
||||
void region_free (Region *region);
|
||||
|
||||
void region_move (Region *region, int x, int y);
|
||||
Eina_Bool region_copy (Region *dest, Region *source);
|
||||
Eina_Bool region_intersect (Region *dest, Region *source);
|
||||
Eina_Bool region_add (Region *dest, Region *source);
|
||||
Eina_Bool region_rect_add (Region *dest, int x, int y, unsigned int w, unsigned int h);
|
||||
Eina_Bool region_del (Region *dest, Region *source);
|
||||
Eina_Bool region_rect_del (Region *dest, int x, int y, unsigned int w, unsigned int h);
|
||||
|
||||
int region_rects_num (Region *region);
|
||||
Box *region_rects (Region *region);
|
||||
|
||||
Eina_Bool region_point_inside (Region *region, int x, int y, Box *bx);
|
||||
Region_State region_rect_inside (Region *region, Box *bx);
|
||||
Eina_Bool region_exists (Region *region);
|
||||
Box *region_bounds (Region *region);
|
||||
|
||||
Eina_Bool region_append (Region *dest, Region *region);
|
||||
Eina_Bool region_validate (Region *region, Eina_Bool *overlap_ret);
|
||||
void region_reset (Region *region, Box *bx);
|
||||
void region_empty (Region *region);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue