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:
Carsten Haitzler 2015-07-21 18:01:11 +09:00
parent e0c81ed35f
commit 65ebf496fd
6 changed files with 1504 additions and 23 deletions

View File

@ -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);

View File

@ -2,6 +2,8 @@
#include <sys/time.h>
#include "region.c"
#ifndef _WIN32
static inline double
get_time(void)

View File

@ -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);

View File

@ -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

View File

@ -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