summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhigang Gong <zhigang.gong@linux.intel.com>2012-06-11 02:15:53 +0800
committerZhigang Gong <zhigang.gong@linux.intel.com>2012-06-11 16:34:01 +0800
commitb0257c3a67798d44e0f8218ccc798c5392729c62 (patch)
tree7ce5157377289c88b8573954331e6b20073cf897
parente836be57a45c3acee73251190593a882428fa7ed (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.c2
-rw-r--r--src/glamor_largepixmap.c183
-rw-r--r--src/glamor_render.c12
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,
+ &region, 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, &region,