mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2025-12-24 09:00:05 +01:00
Eliminate the shadow clear on transform change
When the crtc transformation changes, the entire crtc must be repainted.
This was being done by clearing the shadow and then painting the rectangle
containing the screen image; the clear being required as the screen image
may not fill the crtc. When changing the transform rapidly, this leads to
flashing. Eliminate the clear by painting the entire crtc instead of just
the screen rectangle.
(cherry picked fom commit 5394b7e662)
Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
5946d603e7
commit
a86dd529e9
2 changed files with 29 additions and 14 deletions
|
|
@ -337,6 +337,10 @@ struct _xf86Crtc {
|
|||
BoxRec panningTotalArea;
|
||||
BoxRec panningTrackingArea;
|
||||
INT16 panningBorder[4];
|
||||
/**
|
||||
* Clear the shadow
|
||||
*/
|
||||
Bool shadowClear;
|
||||
};
|
||||
|
||||
typedef struct _xf86OutputFuncs {
|
||||
|
|
|
|||
|
|
@ -113,22 +113,33 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region)
|
|||
SetPicturePictFilter (src, crtc->filter,
|
||||
crtc->params, crtc->nparams);
|
||||
|
||||
while (n--)
|
||||
if (crtc->shadowClear)
|
||||
{
|
||||
BoxRec dst_box;
|
||||
|
||||
dst_box = *b;
|
||||
dst_box.x1 -= crtc->filter_width >> 1;
|
||||
dst_box.x2 += crtc->filter_width >> 1;
|
||||
dst_box.y1 -= crtc->filter_height >> 1;
|
||||
dst_box.y2 += crtc->filter_height >> 1;
|
||||
pixman_f_transform_bounds (&crtc->f_framebuffer_to_crtc, &dst_box);
|
||||
CompositePicture (PictOpSrc,
|
||||
src, NULL, dst,
|
||||
dst_box.x1, dst_box.y1, 0, 0, dst_box.x1, dst_box.y1,
|
||||
dst_box.x2 - dst_box.x1,
|
||||
dst_box.y2 - dst_box.y1);
|
||||
b++;
|
||||
0, 0, 0, 0, 0, 0,
|
||||
crtc->mode.HDisplay, crtc->mode.VDisplay);
|
||||
crtc->shadowClear = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
while (n--)
|
||||
{
|
||||
BoxRec dst_box;
|
||||
|
||||
dst_box = *b;
|
||||
dst_box.x1 -= crtc->filter_width >> 1;
|
||||
dst_box.x2 += crtc->filter_width >> 1;
|
||||
dst_box.y1 -= crtc->filter_height >> 1;
|
||||
dst_box.y2 += crtc->filter_height >> 1;
|
||||
pixman_f_transform_bounds (&crtc->f_framebuffer_to_crtc, &dst_box);
|
||||
CompositePicture (PictOpSrc,
|
||||
src, NULL, dst,
|
||||
dst_box.x1, dst_box.y1, 0, 0, dst_box.x1, dst_box.y1,
|
||||
dst_box.x2 - dst_box.x1,
|
||||
dst_box.y2 - dst_box.y1);
|
||||
b++;
|
||||
}
|
||||
}
|
||||
FreePicture (src, None);
|
||||
FreePicture (dst, None);
|
||||
|
|
@ -192,7 +203,7 @@ xf86CrtcDamageShadow (xf86CrtcPtr crtc)
|
|||
DamageRegionAppend (&(*pScreen->GetScreenPixmap)(pScreen)->drawable,
|
||||
&damage_region);
|
||||
REGION_UNINIT (pScreen, &damage_region);
|
||||
xf86CrtcShadowClear (crtc);
|
||||
crtc->shadowClear = TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue