[Pixman] FAST_PATH_SAMPLES_COVER_CLIP flag & fast_composite_scaled_nearest_*

Siarhei Siamashka siarhei.siamashka at gmail.com
Mon Jul 19 05:17:06 PDT 2010


Hello,

Currently there is a discrepancy between how FAST_PATH_SAMPLES_COVER_CLIP flag 
is calculated and the actual implementation in fast_composite_scaled_nearest_* 
functions.

Function 'pixman_transform_bounds' which is used for deciding whether to set 
FAST_PATH_SAMPLES_COVER_CLIP flag, uses 'pixman_transform_point' call.
While 'fast_composite_scaled_nearest_*' functions do initial addition of 
'pixman_fixed_1 / 2', call to 'pixman_transform_point_3d' and subtraction of 
'pixman_fixed_e'.

Moreover, both 'pixman_transform_point' and 'pixman_transform_point_3d' 
functions are truncating low order bits in intermediate calculations, losing 
precision. This does not have any effect on the initial "top left corner" 
point, but still may cause differences on the other end of the bounding box 
(the scaler implementations use "unit_x"/"unit_y" increments on each iteration, 
while 'pixman_transform_bounds' tries to calculate the end result with 
'pixman_transform_point' which is not perfectly precise).

As a result, there are two problems possible:
1. Invalid memory accesses when fast_composite_scaled_nearest_* functions try 
to fetch pixels outside the source image (confirmed, a testcase will be 
submitted shortly).
2. FAST_PATH_SAMPLES_COVER_CLIP not being set for the scaling cases, when there 
is actually no need to access pixels outside the source image and reducing 
performance (I do not have a testcase for this yet, but have reports about the 
nearest scaling fast path not being used when it should).


I see two ways to fix this problem:
1. Try to ensure that FAST_PATH_SAMPLES_COVER_CLIP is set exactly when needed 
by NEAREST scaling fast paths.
2. Drop FAST_PATH_SAMPLES_COVER_CLIP flag altogether and update nearest scaling 
fast paths to also work correctly when sampling of the pixels outside the 
source image is needed (NORMAL repeat already can do this).

I also expected the possibility of this problem earlier [1], but somehow forgot 
to do the proper code review and tests for the FAST_PATH_SAMPLES_COVER_CLIP 
flag calculation.

1. http://lists.freedesktop.org/archives/pixman/2010-March/000093.html

-- 
Best regards,
Siarhei Siamashka


More information about the Pixman mailing list