glamor: Check for composite operations which are equivalent to copies

Increases x11perf -compwinwin500 numbers by a factor of 10 for me with
radeonsi.

Conditions copied from exaComposite().

Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit b64108fa30)
This commit is contained in:
Michel Dänzer 2016-05-25 19:09:23 +09:00 committed by Adam Jackson
parent 009304ef12
commit d37329cba4

View File

@ -1404,6 +1404,29 @@ glamor_composite_clipped_region(CARD8 op,
DEBUGF("clipped (%d %d) (%d %d) (%d %d) width %d height %d \n",
x_source, y_source, x_mask, y_mask, x_dest, y_dest, width, height);
/* Is the composite operation equivalent to a copy? */
if (!mask && !source->alphaMap && !dest->alphaMap
&& source->pDrawable && !source->transform
&& ((op == PictOpSrc
&& ((source->format == dest->format
|| (PICT_FORMAT_COLOR(dest->format)
&& PICT_FORMAT_COLOR(source->format)
&& dest->format == PICT_FORMAT(PICT_FORMAT_BPP(source->format),
PICT_FORMAT_TYPE(source->format),
0,
PICT_FORMAT_R(source->format),
PICT_FORMAT_G(source->format),
PICT_FORMAT_B(source->format))))
|| (op == PictOpOver
&& source->format == dest->format
&& !PICT_FORMAT_A(source->format)))))) {
glamor_copy(source->pDrawable, dest->pDrawable, NULL,
box, nbox, x_source - x_dest,
y_source - y_dest, FALSE, FALSE, 0, NULL);
ok = TRUE;
goto out;
}
/* XXX is it possible source mask have non-zero drawable.x/y? */
if (source
&& ((!source->pDrawable