glamor_polyfillrect: Optimize fallback path.
Download/upload required region only. Signed-off-by: Zhigang Gong <zhigang.gong@linux.intel.com>
This commit is contained in:
parent
cea0fe3e1f
commit
1f657f72ca
|
@ -33,6 +33,10 @@ glamor_fill(DrawablePtr drawable,
|
||||||
{
|
{
|
||||||
PixmapPtr dst_pixmap = glamor_get_drawable_pixmap(drawable);
|
PixmapPtr dst_pixmap = glamor_get_drawable_pixmap(drawable);
|
||||||
int off_x, off_y;
|
int off_x, off_y;
|
||||||
|
PixmapPtr sub_pixmap = NULL;
|
||||||
|
glamor_access_t sub_pixmap_access;
|
||||||
|
DrawablePtr saved_drawable = NULL;
|
||||||
|
int saved_x, saved_y;
|
||||||
|
|
||||||
glamor_get_drawable_deltas(drawable, dst_pixmap, &off_x, &off_y);
|
glamor_get_drawable_deltas(drawable, dst_pixmap, &off_x, &off_y);
|
||||||
|
|
||||||
|
@ -82,7 +86,26 @@ glamor_fill(DrawablePtr drawable,
|
||||||
&& glamor_ddx_fallback_check_gc(gc))
|
&& glamor_ddx_fallback_check_gc(gc))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
/* Is it possible to set the access as WO? */
|
||||||
|
|
||||||
|
sub_pixmap_access = GLAMOR_ACCESS_RW;
|
||||||
|
|
||||||
|
sub_pixmap = glamor_get_sub_pixmap(dst_pixmap, x + off_x,
|
||||||
|
y + off_y, width, height,
|
||||||
|
sub_pixmap_access);
|
||||||
|
|
||||||
|
if (sub_pixmap != NULL) {
|
||||||
|
if (gc->fillStyle != FillSolid) {
|
||||||
|
gc->patOrg.x += (drawable->x - x);
|
||||||
|
gc->patOrg.y += (drawable->y - y);
|
||||||
|
}
|
||||||
|
saved_drawable = drawable;
|
||||||
|
drawable = &sub_pixmap->drawable;
|
||||||
|
saved_x = x;
|
||||||
|
saved_y = y;
|
||||||
|
x = 0;
|
||||||
|
y = 0;
|
||||||
|
}
|
||||||
if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
|
if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
|
||||||
if (glamor_prepare_access_gc(gc)) {
|
if (glamor_prepare_access_gc(gc)) {
|
||||||
fbFill(drawable, gc, x, y, width, height);
|
fbFill(drawable, gc, x, y, width, height);
|
||||||
|
@ -90,6 +113,23 @@ glamor_fill(DrawablePtr drawable,
|
||||||
}
|
}
|
||||||
glamor_finish_access(drawable, GLAMOR_ACCESS_RW);
|
glamor_finish_access(drawable, GLAMOR_ACCESS_RW);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sub_pixmap != NULL) {
|
||||||
|
struct pixman_box16 box;
|
||||||
|
int dx, dy;
|
||||||
|
if (gc->fillStyle != FillSolid) {
|
||||||
|
gc->patOrg.x -= (saved_drawable->x - saved_x);
|
||||||
|
gc->patOrg.y -= (saved_drawable->y - saved_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
x = saved_x;
|
||||||
|
y = saved_y;
|
||||||
|
|
||||||
|
glamor_put_sub_pixmap(sub_pixmap, dst_pixmap,
|
||||||
|
x + off_x, y + off_y,
|
||||||
|
width, height, sub_pixmap_access);
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,10 +47,6 @@ _glamor_poly_fill_rect(DrawablePtr drawable,
|
||||||
|
|
||||||
glamor_priv = glamor_get_screen_private(drawable->pScreen);
|
glamor_priv = glamor_get_screen_private(drawable->pScreen);
|
||||||
|
|
||||||
if (gc->fillStyle != FillSolid && gc->fillStyle != FillTiled) {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
xorg = drawable->x;
|
xorg = drawable->x;
|
||||||
yorg = drawable->y;
|
yorg = drawable->y;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue