[Glamor] [V2 PATCH 4/6] Fix the problem of vertical and horizontal case error in linear gradient.

He Junyan junyan.he at linux.intel.com
Tue May 15 03:17:08 PDT 2012


> If we have non-int transform matrix, both the vertical and
> horizontal check are invalid here, right? You may need to
> check whether we have a non-int transform matrix, and then
> choose different method to check the hor/vert condition?

The case of Vertical is not needed, and the case for horizontal
is nessary because the dividend of slope will be zero.
The cairo benchmark show:
./cairo/perf/cairo-perf-trace -i 5
./cairo-trace/benchmark/firefox-canvas.trace
[ # ]  backend                         test   min(s) median(s) stddev. count
[  0]     xlib               firefox-canvas   44.808   45.541   1.07%    5/5


./cairo/perf/cairo-perf-trace -i 3
./cairo-trace/benchmark/firefox-canvas.trace
[ # ]  backend                         test   min(s) median(s) stddev. count
[  0]     xlib               firefox-canvas   44.864   45.596   1.01%
 3/3^


So should be no regression for the performance.

> From: Junyan He<junyan.he at linux.intel.com>
> 
>   1. The vertical and horizontal judgement in linear
>   gradient have problem when p1 point and p2 point
>   distance is very small but the gradient pict have a
>   transform matrix which will convert the X Y coordinates
>   to small values. So the judgement is not suitable.
>   Because this judgement's purpose is to assure the
>   divisor not to be zero, so we simply it to enter
>   horizontal judgement when p1 and p2's Y is same.
>   Vertical case is deleted. 2. Delete the unused p1 p2
>   uniform variable.
> 
> 
> Signed-off-by: Junyan He<junyan.he at linux.intel.com>
> ---
>   src/glamor_gradient.c |   24 ++++--------------------
>   1 files changed, 4 insertions(+), 20 deletions(-)
>   mode change 100644 =>  100755 src/glamor_gradient.c
> 
> diff --git a/src/glamor_gradient.c b/src/glamor_gradient.c
> old mode 100644
> new mode 100755
> index 7c0496d..fdc90fb
> --- a/src/glamor_gradient.c
> +++ b/src/glamor_gradient.c
> @@ -491,8 +491,6 @@ _glamor_create_linear_gradient_program(ScreenPtr screen, int stops_count, int dy
>   	    "uniform mat3 transform_mat;\n"
>   	    "uniform int repeat_type;\n"
>   	    "uniform int hor_ver;\n"
> -	    "uniform vec4 pt1;\n"
> -	    "uniform vec4 pt2;\n"
>   	    "uniform float pt_slope;\n"
>   	    "uniform float cos_val;\n"
>   	    "uniform float p1_distance;\n"
> @@ -529,10 +527,6 @@ _glamor_create_linear_gradient_program(ScreenPtr screen, int stops_count, int dy
>   	    "        distance = source_texture_trans.x;\n"
>   	    "        _p1_distance = p1_distance * source_texture_trans.z;\n"
>   	    "        _pt_distance = pt_distance * source_texture_trans.z;\n"
> -	    "    } else if (hor_ver == 2) {\n"//vertical case.
> -	    "        distance = source_texture_trans.y;\n"
> -	    "        _p1_distance = p1_distance * source_texture_trans.z;\n"
> -	    "        _pt_distance = pt_distance * source_texture_trans.z;\n"
>   	    "    } \n"
>   	    "    \n"
>   	    "    distance = distance - _p1_distance; \n"
> @@ -1366,10 +1360,6 @@ glamor_generate_linear_gradient_picture(ScreenPtr screen,
>   	}
> 
>   	/* Bind all the uniform vars .*/
> -	pt1_uniform_location =
> -	    dispatch->glGetUniformLocation(gradient_prog, "pt1");
> -	pt2_uniform_location =
> -	    dispatch->glGetUniformLocation(gradient_prog, "pt2");
>   	n_stop_uniform_location =
>   	    dispatch->glGetUniformLocation(gradient_prog, "n_stop");
>   	pt_slope_uniform_location =
> @@ -1542,22 +1532,16 @@ glamor_generate_linear_gradient_picture(ScreenPtr screen,
>   		dispatch->glUniform1i(n_stop_uniform_location, count);
>   	}
> 
> -	if (abs((pt2[1] - pt1[1]) / yscale)<  1.0) { // The horizontal case.
> +	if (src_picture->pSourcePict->linear.p2.y ==
> +	              src_picture->pSourcePict->linear.p1.y) { // The horizontal case.
>   		dispatch->glUniform1i(hor_ver_uniform_location, 1);
> -		DEBUGF("p1.x: %f, p2.x: %f, enter the horizontal case\n", pt1[1], pt2[1]);
> +		DEBUGF("p1.y: %f, p2.y: %f, enter the horizontal case\n",
> +		       pt1[1], pt2[1]);
> 
>   		p1_distance = pt1[0];
>   		pt_distance = (pt2[0] - p1_distance);
>   		dispatch->glUniform1f(p1_distance_uniform_location, p1_distance);
>   		dispatch->glUniform1f(pt_distance_uniform_location, pt_distance);
> -	} else if (abs((pt2[0] - pt1[0]) / xscale)<  1.0) { //The vertical case.
> -		dispatch->glUniform1i(hor_ver_uniform_location, 2);
> -		DEBUGF("p1.y: %f, p2.y: %f, enter the vertical case\n", pt1[0], pt2[0]);
> -
> -		p1_distance = pt1[1];
> -		pt_distance = (pt2[1] - p1_distance);
> -		dispatch->glUniform1f(p1_distance_uniform_location, p1_distance);
> -		dispatch->glUniform1f(pt_distance_uniform_location, pt_distance);
>   	} else {
>   		/* The slope need to compute here. In shader, the viewport set will change
>   		   the orginal slope and the slope which is vertical to it will not be correct.*/


More information about the Glamor mailing list