[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