diff options
Diffstat (limited to 'extra/xf86-video-intel/0003-uxa-Remove-hook-for-CompositeRectangles.patch')
-rw-r--r-- | extra/xf86-video-intel/0003-uxa-Remove-hook-for-CompositeRectangles.patch | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/extra/xf86-video-intel/0003-uxa-Remove-hook-for-CompositeRectangles.patch b/extra/xf86-video-intel/0003-uxa-Remove-hook-for-CompositeRectangles.patch new file mode 100644 index 000000000..c1c4d55e8 --- /dev/null +++ b/extra/xf86-video-intel/0003-uxa-Remove-hook-for-CompositeRectangles.patch @@ -0,0 +1,255 @@ +From b669f171adece9df7f0c340c664b70e94118a55e Mon Sep 17 00:00:00 2001 +From: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri, 23 Mar 2012 14:56:06 +0000 +Subject: [PATCH 3/5] uxa: Remove hook for CompositeRectangles + +It was broken and not flushing damage correctly. With the +improvements made to the kernel, it is no longer a significant advantage +per se and not worth its additional complexity. + +Reported-by: Tilman Sauerbeck <tilman@code-monkey.de> +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=32547 +Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> +--- + uxa/uxa-priv.h | 1 - + uxa/uxa-render.c | 189 ------------------------------------------------------ + uxa/uxa.c | 4 -- + 3 files changed, 194 deletions(-) + +diff --git a/uxa/uxa-priv.h b/uxa/uxa-priv.h +index 0de45f5..b24ec4f 100644 +--- a/uxa/uxa-priv.h ++++ b/uxa/uxa-priv.h +@@ -123,7 +123,6 @@ typedef struct { + BitmapToRegionProcPtr SavedBitmapToRegion; + #ifdef RENDER + CompositeProcPtr SavedComposite; +- CompositeRectsProcPtr SavedCompositeRects; + TrianglesProcPtr SavedTriangles; + GlyphsProcPtr SavedGlyphs; + TrapezoidsProcPtr SavedTrapezoids; +diff --git a/uxa/uxa-render.c b/uxa/uxa-render.c +index 877b286..1e88c5d 100644 +--- a/uxa/uxa-render.c ++++ b/uxa/uxa-render.c +@@ -947,195 +947,6 @@ uxa_acquire_mask(ScreenPtr screen, + out_x, out_y); + } + +-static Bool +-_pixman_region_init_rectangles(pixman_region16_t *region, +- int num_rects, +- xRectangle *rects, +- int tx, int ty) +-{ +- pixman_box16_t stack_boxes[64], *boxes = stack_boxes; +- pixman_bool_t ret; +- int i; +- +- if (num_rects > sizeof(stack_boxes) / sizeof(stack_boxes[0])) { +- boxes = malloc(sizeof(pixman_box16_t) * num_rects); +- if (boxes == NULL) +- return FALSE; +- } +- +- for (i = 0; i < num_rects; i++) { +- boxes[i].x1 = rects[i].x + tx; +- boxes[i].y1 = rects[i].y + ty; +- boxes[i].x2 = rects[i].x + tx + rects[i].width; +- boxes[i].y2 = rects[i].y + ty + rects[i].height; +- } +- +- ret = pixman_region_init_rects(region, boxes, num_rects); +- +- if (boxes != stack_boxes) +- free(boxes); +- +- return ret; +-} +- +-void +-uxa_solid_rects (CARD8 op, +- PicturePtr dst, +- xRenderColor *color, +- int num_rects, +- xRectangle *rects) +-{ +- ScreenPtr screen = dst->pDrawable->pScreen; +- uxa_screen_t *uxa_screen = uxa_get_screen(screen); +- PixmapPtr dst_pixmap, src_pixmap = NULL; +- pixman_region16_t region; +- pixman_box16_t *boxes, *extents; +- PicturePtr src; +- int dst_x, dst_y; +- int num_boxes; +- +- if (!pixman_region_not_empty(dst->pCompositeClip)) +- return; +- +- if (uxa_screen->info->flags & UXA_USE_GLAMOR) { +- int ok; +- +- uxa_picture_prepare_access(dst, UXA_GLAMOR_ACCESS_RW); +- ok = glamor_composite_rects_nf(op, dst, color, +- num_rects, rects); +- uxa_picture_finish_access(dst, UXA_GLAMOR_ACCESS_RW); +- +- if (!ok) +- goto fallback; +- +- return; +- } +- +- if (dst->alphaMap) +- goto fallback; +- +- dst_pixmap = uxa_get_offscreen_pixmap(dst->pDrawable, &dst_x, &dst_y); +- if (!dst_pixmap) +- goto fallback; +- +- if (!_pixman_region_init_rectangles(®ion, +- num_rects, rects, +- dst->pDrawable->x, dst->pDrawable->y)) +- goto fallback; +- +- if (!pixman_region_intersect(®ion, ®ion, dst->pCompositeClip)) { +- pixman_region_fini(®ion); +- return; +- } +- +- pixman_region_translate(®ion, dst_x, dst_y); +- boxes = pixman_region_rectangles(®ion, &num_boxes); +- extents = pixman_region_extents (®ion); +- +- if (op == PictOpClear) +- color->red = color->green = color->blue = color->alpha = 0; +- if (color->alpha >= 0xff00 && op == PictOpOver) { +- color->alpha = 0xffff; +- op = PictOpSrc; +- } +- +- /* Using GEM, the relocation costs outweigh the advantages of the blitter */ +- if (num_boxes == 1 && (op == PictOpSrc || op == PictOpClear)) { +- CARD32 pixel; +- +-try_solid: +- if (uxa_screen->info->check_solid && +- !uxa_screen->info->check_solid(&dst_pixmap->drawable, GXcopy, FB_ALLONES)) +- goto err_region; +- +- if (!uxa_get_pixel_from_rgba(&pixel, +- color->red, +- color->green, +- color->blue, +- color->alpha, +- dst->format)) +- goto err_region; +- +- if (!uxa_screen->info->prepare_solid(dst_pixmap, GXcopy, FB_ALLONES, pixel)) +- goto err_region; +- +- while (num_boxes--) { +- uxa_screen->info->solid(dst_pixmap, +- boxes->x1, boxes->y1, +- boxes->x2, boxes->y2); +- boxes++; +- } +- +- uxa_screen->info->done_solid(dst_pixmap); +- } else { +- int error; +- +- src = CreateSolidPicture(0, color, &error); +- if (!src) +- goto err_region; +- +- if (!uxa_screen->info->check_composite(op, src, NULL, dst, +- extents->x2 - extents->x1, +- extents->y2 - extents->y1)) { +- if (op == PictOpSrc || op == PictOpClear) { +- FreePicture(src, 0); +- goto try_solid; +- } +- +- goto err_src; +- } +- +- if (!uxa_screen->info->check_composite_texture || +- !uxa_screen->info->check_composite_texture(screen, src)) { +- PicturePtr solid; +- int src_off_x, src_off_y; +- +- solid = uxa_acquire_solid(screen, src->pSourcePict); +- if (!solid) +- goto err_src; +- FreePicture(src, 0); +- +- src = solid; +- src_pixmap = uxa_get_offscreen_pixmap(src->pDrawable, +- &src_off_x, &src_off_y); +- if (!src_pixmap) +- goto err_src; +- } +- +- if (!uxa_screen->info->prepare_composite(op, src, NULL, dst, src_pixmap, NULL, dst_pixmap)) +- goto err_src; +- +- while (num_boxes--) { +- uxa_screen->info->composite(dst_pixmap, +- 0, 0, 0, 0, +- boxes->x1, +- boxes->y1, +- boxes->x2 - boxes->x1, +- boxes->y2 - boxes->y1); +- boxes++; +- } +- +- uxa_screen->info->done_composite(dst_pixmap); +- FreePicture(src, 0); +- } +- +- /* XXX xserver-1.8: CompositeRects is not tracked by Damage, so we must +- * manually append the damaged regions ourselves. +- */ +- pixman_region_translate(®ion, -dst_x, -dst_y); +- DamageRegionAppend(dst->pDrawable, ®ion); +- +- pixman_region_fini(®ion); +- return; +- +-err_src: +- FreePicture(src, 0); +-err_region: +- pixman_region_fini(®ion); +-fallback: +- uxa_screen->SavedCompositeRects(op, dst, color, num_rects, rects); +-} +- + static int + uxa_try_driver_composite(CARD8 op, + PicturePtr pSrc, +diff --git a/uxa/uxa.c b/uxa/uxa.c +index eb2ae03..b4a1da6 100644 +--- a/uxa/uxa.c ++++ b/uxa/uxa.c +@@ -407,7 +407,6 @@ static Bool uxa_close_screen(int i, ScreenPtr pScreen) + #ifdef RENDER + if (ps) { + ps->Composite = uxa_screen->SavedComposite; +- ps->CompositeRects = uxa_screen->SavedCompositeRects; + ps->Glyphs = uxa_screen->SavedGlyphs; + ps->Trapezoids = uxa_screen->SavedTrapezoids; + ps->AddTraps = uxa_screen->SavedAddTraps; +@@ -536,9 +535,6 @@ Bool uxa_driver_init(ScreenPtr screen, uxa_driver_t * uxa_driver) + uxa_screen->SavedComposite = ps->Composite; + ps->Composite = uxa_composite; + +- uxa_screen->SavedCompositeRects = ps->CompositeRects; +- ps->CompositeRects = uxa_solid_rects; +- + uxa_screen->SavedGlyphs = ps->Glyphs; + ps->Glyphs = uxa_glyphs; + +-- +1.7.10 + |