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_common_private.h"
|
||||||
#include "evas_private.h"
|
#include "evas_private.h"
|
||||||
|
|
||||||
|
#include "evas_render2.h"
|
||||||
|
|
||||||
#define MY_CLASS EVAS_RECTANGLE_CLASS
|
#define MY_CLASS EVAS_RECTANGLE_CLASS
|
||||||
|
|
||||||
/* private magic number for rectangle objects */
|
/* 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,
|
printf(" UP1 %p - %4i %4i %4ix%4i\n", eo_obj,
|
||||||
obj->cur->cache.clip.x, obj->cur->cache.clip.y,
|
obj->cur->cache.clip.x, obj->cur->cache.clip.y,
|
||||||
obj->cur->cache.clip.w, obj->cur->cache.clip.h);
|
obj->cur->cache.clip.w, obj->cur->cache.clip.h);
|
||||||
evas_common_tilebuf_add_redraw
|
region_rect_add
|
||||||
(updates,
|
(updates,
|
||||||
obj->cur->cache.clip.x - offx, obj->cur->cache.clip.y - offy,
|
obj->cur->cache.clip.x - offx, obj->cur->cache.clip.y - offy,
|
||||||
obj->cur->cache.clip.w, obj->cur->cache.clip.h);
|
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,
|
printf(" UP2 %p - %4i %4i %4ix%4i\n", eo_obj,
|
||||||
obj->prev->cache.clip.x, obj->prev->cache.clip.y,
|
obj->prev->cache.clip.x, obj->prev->cache.clip.y,
|
||||||
obj->prev->cache.clip.w, obj->prev->cache.clip.h);
|
obj->prev->cache.clip.w, obj->prev->cache.clip.h);
|
||||||
evas_common_tilebuf_add_redraw
|
region_rect_add
|
||||||
(updates,
|
(updates,
|
||||||
obj->prev->cache.clip.x - offx, obj->prev->cache.clip.y - offy,
|
obj->prev->cache.clip.x - offx, obj->prev->cache.clip.y - offy,
|
||||||
obj->prev->cache.clip.w, obj->prev->cache.clip.h);
|
obj->prev->cache.clip.w, obj->prev->cache.clip.h);
|
||||||
evas_common_tilebuf_add_redraw
|
region_rect_add
|
||||||
(updates,
|
(updates,
|
||||||
obj->cur->cache.clip.x - offx, obj->cur->cache.clip.y - offy,
|
obj->cur->cache.clip.x - offx, obj->cur->cache.clip.y - offy,
|
||||||
obj->cur->cache.clip.w, obj->cur->cache.clip.h);
|
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,
|
printf(" NO- %p - %4i %4i %4ix%4i\n", eo_obj,
|
||||||
obj->cur->cache.clip.x, obj->cur->cache.clip.y,
|
obj->cur->cache.clip.x, obj->cur->cache.clip.y,
|
||||||
obj->cur->cache.clip.w, obj->cur->cache.clip.h);
|
obj->cur->cache.clip.w, obj->cur->cache.clip.h);
|
||||||
evas_common_tilebuf_del_redraw
|
region_rect_del
|
||||||
(updates,
|
(updates,
|
||||||
obj->cur->cache.clip.x - offx, obj->cur->cache.clip.y - offy,
|
obj->cur->cache.clip.x - offx, obj->cur->cache.clip.y - offy,
|
||||||
obj->cur->cache.clip.w, obj->cur->cache.clip.h);
|
obj->cur->cache.clip.w, obj->cur->cache.clip.h);
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include "region.c"
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
static inline double
|
static inline double
|
||||||
get_time(void)
|
get_time(void)
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
#include "evas_cs2_private.h"
|
#include "evas_cs2_private.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "region.h"
|
||||||
|
|
||||||
Eina_Bool _evas_render2(Eo *eo_e, Evas_Public_Data *e);
|
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(Eo *eo_e, Evas_Public_Data *e);
|
||||||
Eina_List *_evas_render2_updates_wait(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;
|
Render2_Finish_Data *render_finish_data;
|
||||||
Evas_Layer *lay;
|
Evas_Layer *lay;
|
||||||
Evas_Object_Protected_Data *obj;
|
Evas_Object_Protected_Data *obj;
|
||||||
double t;
|
|
||||||
Tilebuf *updates = NULL;
|
|
||||||
Tilebuf_Rect *rects, *r;
|
|
||||||
Eina_List *updates_list = NULL, *l;
|
Eina_List *updates_list = NULL, *l;
|
||||||
|
double t;
|
||||||
Eina_Rectangle *rect;
|
Eina_Rectangle *rect;
|
||||||
|
Region *updates;
|
||||||
updates = evas_common_tilebuf_new(e->output.w, e->output.h);
|
Box *rects;
|
||||||
evas_common_tilebuf_set_tile_size(updates, TILESIZE, TILESIZE);
|
int rects_num, i;
|
||||||
// evas_common_tilebuf_tile_strict_set(updates, EINA_TRUE);
|
|
||||||
static int num = 0;
|
static int num = 0;
|
||||||
|
|
||||||
|
updates = region_new();
|
||||||
printf("........... updates # %i\n", num++);
|
printf("........... updates # %i\n", num++);
|
||||||
t = get_time();
|
t = get_time();
|
||||||
EINA_INLIST_FOREACH(e->layers, lay)
|
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
|
// add explicitly exposed/damaged regions of the canvas
|
||||||
EINA_LIST_FREE(e->damages, rect)
|
EINA_LIST_FREE(e->damages, rect)
|
||||||
{
|
{
|
||||||
evas_common_tilebuf_add_redraw(updates, rect->x, rect->y,
|
region_rect_add(updates, rect->x, rect->y, rect->w, rect->h);
|
||||||
rect->w, rect->h);
|
|
||||||
eina_rectangle_free(rect);
|
eina_rectangle_free(rect);
|
||||||
}
|
}
|
||||||
// build obscure objects list of active objects that obscure
|
// build obscure objects list of active objects that obscure
|
||||||
EINA_LIST_FOREACH(e->obscures, l, rect)
|
EINA_LIST_FOREACH(e->obscures, l, rect)
|
||||||
{
|
{
|
||||||
evas_common_tilebuf_del_redraw(updates, rect->x, rect->y,
|
region_rect_del(updates, rect->x, rect->y, rect->w, rect->h);
|
||||||
rect->w, rect->h);
|
|
||||||
}
|
}
|
||||||
t = get_time() - t;
|
t = get_time() - t;
|
||||||
printf("T: update generation: "); out_time(t);
|
printf("T: update generation: "); out_time(t);
|
||||||
|
|
||||||
rects = evas_common_tilebuf_get_render_rects(updates);
|
rects = region_rects(updates);
|
||||||
EINA_INLIST_FOREACH(EINA_INLIST_GET(rects), r)
|
rects_num = region_rects_num(updates);
|
||||||
|
for (i = 0; i < rects_num; i++)
|
||||||
{
|
{
|
||||||
rect = malloc(sizeof(Eina_Rectangle));
|
rect = malloc(sizeof(Eina_Rectangle));
|
||||||
if (rect)
|
if (rect)
|
||||||
{
|
{
|
||||||
printf(" Render Region [ %4i %4i %4ix%4i ]\n", r->x, r->y, r->w, r->h);
|
rect->x = rects[i].x1;
|
||||||
rect->x = r->x; rect->y = r->y;
|
rect->y = rects[i].y1;
|
||||||
rect->w = r->w; rect->h = r->h;
|
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);
|
updates_list = eina_list_append(updates_list, rect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
evas_common_tilebuf_free_render_rects(rects);
|
region_free(updates);
|
||||||
|
|
||||||
evas_common_tilebuf_free(updates);
|
|
||||||
|
|
||||||
e->changed = EINA_FALSE;
|
e->changed = EINA_FALSE;
|
||||||
// remove from the "i'm rendering" pool - do back in mainloop
|
// 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