Do not reduce a composite to a copy if we need to sample outside of the source
In order to maintain Render semantics, samples outside of the source should return CLEAR. The copy routines instead are based on the core protocol and expects the source rectangle to be wholly contained within the drawable and so does no fixup. Fixes the rendering of GTK icons. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com>
This commit is contained in:
parent
566cca59e1
commit
864153bb9e
|
@ -602,7 +602,7 @@ glamor_composite_with_copy(CARD8 op,
|
||||||
INT16 y_dest, CARD16 width, CARD16 height)
|
INT16 y_dest, CARD16 width, CARD16 height)
|
||||||
{
|
{
|
||||||
RegionRec region;
|
RegionRec region;
|
||||||
int ret;
|
int ret = FALSE;
|
||||||
|
|
||||||
if (!source->pDrawable)
|
if (!source->pDrawable)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -622,14 +622,27 @@ glamor_composite_with_copy(CARD8 op,
|
||||||
x_source, y_source,
|
x_source, y_source,
|
||||||
0, 0, x_dest, y_dest, width, height))
|
0, 0, x_dest, y_dest, width, height))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
ret = TRUE;
|
/* Fallback if we sample outside the source so that we swizzle the
|
||||||
if (!glamor_copy_n_to_n_nf(source->pDrawable,
|
* clear color appropriately. If the source has an alpha channel,
|
||||||
dest->pDrawable, NULL,
|
* we could rely on CLAMP_TO_BORDER working as required...
|
||||||
REGION_RECTS(®ion),
|
*/
|
||||||
REGION_NUM_RECTS(®ion),
|
if (region.extents.x1 + x_source - x_dest < 0)
|
||||||
x_source - x_dest, y_source - y_dest,
|
goto cleanup_region;
|
||||||
FALSE, FALSE, 0, NULL))
|
if (region.extents.x2 + x_source - x_dest > source->pDrawable->width)
|
||||||
ret = FALSE;
|
goto cleanup_region;
|
||||||
|
|
||||||
|
if (region.extents.y1 + y_source - y_dest < 0)
|
||||||
|
goto cleanup_region;
|
||||||
|
if (region.extents.y2 + y_source - y_dest > source->pDrawable->height)
|
||||||
|
goto cleanup_region;
|
||||||
|
|
||||||
|
ret = glamor_copy_n_to_n_nf(source->pDrawable,
|
||||||
|
dest->pDrawable, NULL,
|
||||||
|
REGION_RECTS(®ion),
|
||||||
|
REGION_NUM_RECTS(®ion),
|
||||||
|
x_source - x_dest, y_source - y_dest,
|
||||||
|
FALSE, FALSE, 0, NULL);
|
||||||
|
cleanup_region:
|
||||||
REGION_UNINIT(dest->pDrawable->pScreen, ®ion);
|
REGION_UNINIT(dest->pDrawable->pScreen, ®ion);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user