diff options
author | Zhigang Gong <zhigang.gong@linux.intel.com> | 2012-06-11 02:15:53 +0800 |
---|---|---|
committer | Zhigang Gong <zhigang.gong@linux.intel.com> | 2012-06-11 16:34:01 +0800 |
commit | b0257c3a67798d44e0f8218ccc798c5392729c62 (patch) | |
tree | 7ce5157377289c88b8573954331e6b20073cf897 | |
parent | e836be57a45c3acee73251190593a882428fa7ed (diff) |
largepixmap: Enable glamor_composite.
Now we start to enable glamor_composite on large pixmap.
We need to do a three layer clipping to split the dest/source/mask
to small pieces. This commit only support non-transformation and
repeat normal case.
Signed-off-by: Zhigang Gong <zhigang.gong@linux.intel.com>
-rw-r--r-- | src/glamor_glyphs.c | 2 | ||||
-rw-r--r-- | src/glamor_largepixmap.c | 183 | ||||
-rw-r--r-- | src/glamor_render.c | 12 |
3 files changed, 195 insertions, 2 deletions
diff --git a/src/glamor_glyphs.c b/src/glamor_glyphs.c index fe7d9de..dd3b4c6 100644 --- a/src/glamor_glyphs.c +++ b/src/glamor_glyphs.c @@ -62,7 +62,7 @@ */ #define GLYPH_BUFFER_SIZE 1024 -#define CACHE_PICTURE_SIZE 1024 +#define CACHE_PICTURE_SIZE 1024 #define GLYPH_MIN_SIZE 8 #define GLYPH_MAX_SIZE 64 #define GLYPH_CACHE_SIZE (CACHE_PICTURE_SIZE * CACHE_PICTURE_SIZE / (GLYPH_MIN_SIZE * GLYPH_MIN_SIZE)) diff --git a/src/glamor_largepixmap.c b/src/glamor_largepixmap.c index e8c1030..a1a73a4 100644 --- a/src/glamor_largepixmap.c +++ b/src/glamor_largepixmap.c @@ -410,3 +410,186 @@ glamor_compute_clipped_regions(glamor_pixmap_private *priv, RegionPtr region, in { return _glamor_compute_clipped_regions(priv, region, n_region, repeat_type, 0); } + +Bool +glamor_composite_largepixmap_region(CARD8 op, + PicturePtr source, + PicturePtr mask, + PicturePtr dest, + glamor_pixmap_private * source_pixmap_priv, + glamor_pixmap_private * mask_pixmap_priv, + glamor_pixmap_private * dest_pixmap_priv, + RegionPtr region, Bool force_clip, + INT16 x_source, + INT16 y_source, + INT16 x_mask, + INT16 y_mask, + INT16 x_dest, INT16 y_dest, + CARD16 width, CARD16 height) +{ + glamor_screen_private *glamor_priv; + glamor_pixmap_clipped_regions *clipped_dest_regions; + glamor_pixmap_clipped_regions *clipped_source_regions; + glamor_pixmap_clipped_regions *clipped_mask_regions; + int n_dest_regions; + int n_mask_regions; + int n_source_regions; + int i,j,k; + int need_clean_source_fbo = 0; + int need_clean_mask_fbo = 0; + int is_normal_source_fbo = 0; + int is_normal_mask_fbo = 0; + int fixed_block_width, fixed_block_height; + int null_source, null_mask; + glamor_pixmap_private * need_free_source_pixmap_priv = NULL; + glamor_pixmap_private * need_free_mask_pixmap_priv = NULL; + int source_repeat_type = 0, mask_repeat_type = 0; + PixmapPtr source_pixmap = NULL; + PixmapPtr mask_pixmap = NULL; + int ok = TRUE; + + if (source_pixmap_priv) { + source_pixmap = source_pixmap_priv->base.pixmap; + if (source_pixmap_priv->type == GLAMOR_TEXTURE_LARGE + && (source->transform + || source->repeatType != RepeatNone)) + return FALSE; + } + + if (mask_pixmap_priv) { + mask_pixmap = mask_pixmap_priv->base.pixmap; + if (mask_pixmap_priv->type == GLAMOR_TEXTURE_LARGE + && (mask->transform + || mask->repeatType != RepeatNone)) + return FALSE; + } + + if (source->repeat) + source_repeat_type = source->repeatType; + else + source_repeat_type = RepeatNone; + + if (mask && mask->repeat) + mask_repeat_type = mask->repeatType; + else + mask_repeat_type = RepeatNone; + + glamor_priv = dest_pixmap_priv->base.glamor_priv; + fixed_block_width = glamor_priv->max_fbo_size; + fixed_block_height = glamor_priv->max_fbo_size; + RegionTranslate(region, -dest->pDrawable->x, + -dest->pDrawable->y); + + if (force_clip) + clipped_dest_regions = glamor_compute_clipped_regions_ext(dest_pixmap_priv, + region, + &n_dest_regions, + fixed_block_width, + fixed_block_height); + else + clipped_dest_regions = glamor_compute_clipped_regions(dest_pixmap_priv, + region, + &n_dest_regions, + 0); + DEBUGF("dest clipped result %d region: \n", n_dest_regions); + for(i = 0; i < n_dest_regions; i++) + { + DEBUGF("dest region %d idx %d\n", i, clipped_dest_regions[i].block_idx); + DEBUGRegionPrint(clipped_dest_regions[i].region); + SET_PIXMAP_FBO_CURRENT(dest_pixmap_priv, clipped_dest_regions[i].block_idx); + if ( source_pixmap_priv && source_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) { + RegionTranslate(clipped_dest_regions[i].region, + x_source - x_dest, + y_source - y_dest); + clipped_source_regions = glamor_compute_clipped_regions(source_pixmap_priv, + clipped_dest_regions[i].region, + &n_source_regions, source_repeat_type); + DEBUGF("source clipped result %d region: \n", n_source_regions); + for(j = 0; j < n_source_regions; j++) + { + SET_PIXMAP_FBO_CURRENT(source_pixmap_priv, + clipped_source_regions[j].block_idx); + + if (mask_pixmap_priv && mask_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) { + DEBUGF("source region %d idx %d\n", j, clipped_source_regions[j].block_idx); + DEBUGRegionPrint(clipped_source_regions[j].region); + RegionTranslate(clipped_source_regions[j].region, + - x_source + x_mask, + - y_source + y_mask); + clipped_mask_regions = glamor_compute_clipped_regions(mask_pixmap_priv, + clipped_source_regions[j].region, + &n_mask_regions, mask_repeat_type); + DEBUGF("mask clipped result %d region: \n", n_mask_regions); + +#define COMPOSITE_REGION(region) do { \ + if (!glamor_composite_clipped_region(op, \ + source, \ + mask, dest, region, \ + x_source, y_source, x_mask, y_mask, \ + x_dest, y_dest)) { \ + assert(0); \ + } \ + } while(0) + for(k = 0; k < n_mask_regions; k++) + { + DEBUGF("mask region %d idx %d\n", k, clipped_mask_regions[k].block_idx); + DEBUGRegionPrint(clipped_mask_regions[k].region); + SET_PIXMAP_FBO_CURRENT(mask_pixmap_priv, + clipped_mask_regions[k].block_idx); + DEBUGF("mask fbo off %d %d \n", + mask_pixmap_priv->large.box.x1, + mask_pixmap_priv->large.box.y1); + DEBUGF("start composite mask hasn't transform.\n"); + RegionTranslate(clipped_mask_regions[k].region, + x_dest - x_mask + dest->pDrawable->x, + y_dest - y_mask + dest->pDrawable->y); + COMPOSITE_REGION(clipped_mask_regions[k].region); + RegionDestroy(clipped_mask_regions[k].region); + } + free(clipped_mask_regions); + } else { + RegionTranslate(clipped_source_regions[j].region, + -x_source + x_dest + dest->pDrawable->x, + -y_source + y_dest + dest->pDrawable->y); + COMPOSITE_REGION(clipped_source_regions[j].region); + } + if (clipped_source_regions && clipped_source_regions[j].region) + RegionDestroy(clipped_source_regions[j].region); + } + free(clipped_source_regions); + } + else { + if (mask_pixmap_priv && mask_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) { + RegionTranslate(clipped_dest_regions[i].region, + x_mask - x_dest, + y_mask - y_dest); + clipped_mask_regions = glamor_compute_clipped_regions(mask_pixmap_priv, + clipped_dest_regions[i].region, + &n_mask_regions, mask_repeat_type); + for(k = 0; k < n_mask_regions; k++) + { + DEBUGF("mask region %d idx %d\n", k, clipped_mask_regions[k].block_idx); + DEBUGRegionPrint(clipped_mask_regions[k].region); + SET_PIXMAP_FBO_CURRENT(mask_pixmap_priv, + clipped_mask_regions[k].block_idx); + RegionTranslate(clipped_mask_regions[k].region, + x_dest - x_mask + dest->pDrawable->x, + y_dest - y_mask + dest->pDrawable->y); + COMPOSITE_REGION(clipped_mask_regions[k].region); + RegionDestroy(clipped_mask_regions[k].region); + } + free(clipped_mask_regions); + } + else { + RegionTranslate(clipped_dest_regions[i].region, + dest->pDrawable->x, + dest->pDrawable->y); + COMPOSITE_REGION(clipped_dest_regions[i].region); + } + } + RegionDestroy(clipped_dest_regions[i].region); + } + free(clipped_dest_regions); + ok = TRUE; + return ok; +} diff --git a/src/glamor_render.c b/src/glamor_render.c index 48a5bb3..b19d66c 100644 --- a/src/glamor_render.c +++ b/src/glamor_render.c @@ -1732,7 +1732,17 @@ _glamor_composite(CARD8 op, && source_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) || (mask_pixmap_priv && mask_pixmap_priv->type == GLAMOR_TEXTURE_LARGE)) - goto fail; + ok = glamor_composite_largepixmap_region(op, + source, mask, dest, + source_pixmap_priv, + mask_pixmap_priv, + dest_pixmap_priv, + ®ion, force_clip, + x_source, y_source, + x_mask, y_mask, + x_dest, y_dest, + width, height); + else ok = glamor_composite_clipped_region(op, source, mask, dest, ®ion, |