[Mesa-dev] [PATCH 1/2] llvmpipe: scale up bounding box planes to subpixel precision

Brian Paul brianp at vmware.com
Wed Jan 6 07:10:50 PST 2016


Intricate stuff.  As long as testing was successful, looks good to me.

For both, Reviewed-by: Brian Paul <brianp at vmware.com>

On 01/05/2016 05:06 PM, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> Otherwise some planes we get in rasterization have subpixel precision, others
> not. Doesn't matter so far, but will soon. (OpenGL actually supports viewports
> with subpixel accuracy, so could even do bounding box calcs with that).
> ---
>   src/gallium/drivers/llvmpipe/lp_setup_line.c  | 20 ++++++++++----------
>   src/gallium/drivers/llvmpipe/lp_setup_point.c | 20 ++++++++++----------
>   src/gallium/drivers/llvmpipe/lp_setup_tri.c   | 20 ++++++++++----------
>   3 files changed, 30 insertions(+), 30 deletions(-)
>
> diff --git a/src/gallium/drivers/llvmpipe/lp_setup_line.c b/src/gallium/drivers/llvmpipe/lp_setup_line.c
> index a0de599..f425825 100644
> --- a/src/gallium/drivers/llvmpipe/lp_setup_line.c
> +++ b/src/gallium/drivers/llvmpipe/lp_setup_line.c
> @@ -713,24 +713,24 @@ try_setup_line( struct lp_setup_context *setup,
>         const struct u_rect *scissor =
>            &setup->scissors[viewport_index];
>
> -      plane[4].dcdx = -1;
> +      plane[4].dcdx = -1 << 8;
>         plane[4].dcdy = 0;
> -      plane[4].c = 1-scissor->x0;
> -      plane[4].eo = 1;
> +      plane[4].c = (1-scissor->x0) << 8;
> +      plane[4].eo = 1 << 8;
>
> -      plane[5].dcdx = 1;
> +      plane[5].dcdx = 1 << 8;
>         plane[5].dcdy = 0;
> -      plane[5].c = scissor->x1+1;
> +      plane[5].c = (scissor->x1+1) << 8;
>         plane[5].eo = 0;
>
>         plane[6].dcdx = 0;
> -      plane[6].dcdy = 1;
> -      plane[6].c = 1-scissor->y0;
> -      plane[6].eo = 1;
> +      plane[6].dcdy = 1 << 8;
> +      plane[6].c = (1-scissor->y0) << 8;
> +      plane[6].eo = 1 << 8;
>
>         plane[7].dcdx = 0;
> -      plane[7].dcdy = -1;
> -      plane[7].c = scissor->y1+1;
> +      plane[7].dcdy = -1 << 8;
> +      plane[7].c = (scissor->y1+1) << 8;
>         plane[7].eo = 0;
>      }
>
> diff --git a/src/gallium/drivers/llvmpipe/lp_setup_point.c b/src/gallium/drivers/llvmpipe/lp_setup_point.c
> index 14c389f..ddb6f0e 100644
> --- a/src/gallium/drivers/llvmpipe/lp_setup_point.c
> +++ b/src/gallium/drivers/llvmpipe/lp_setup_point.c
> @@ -492,24 +492,24 @@ try_setup_point( struct lp_setup_context *setup,
>      {
>         struct lp_rast_plane *plane = GET_PLANES(point);
>
> -      plane[0].dcdx = -1;
> +      plane[0].dcdx = -1 << 8;
>         plane[0].dcdy = 0;
> -      plane[0].c = 1-bbox.x0;
> -      plane[0].eo = 1;
> +      plane[0].c = (1-bbox.x0) << 8;
> +      plane[0].eo = 1 << 8;
>
> -      plane[1].dcdx = 1;
> +      plane[1].dcdx = 1 << 8;
>         plane[1].dcdy = 0;
> -      plane[1].c = bbox.x1+1;
> +      plane[1].c = (bbox.x1+1) << 8;
>         plane[1].eo = 0;
>
>         plane[2].dcdx = 0;
> -      plane[2].dcdy = 1;
> -      plane[2].c = 1-bbox.y0;
> -      plane[2].eo = 1;
> +      plane[2].dcdy = 1 << 8;
> +      plane[2].c = (1-bbox.y0) << 8;
> +      plane[2].eo = 1 << 8;
>
>         plane[3].dcdx = 0;
> -      plane[3].dcdy = -1;
> -      plane[3].c = bbox.y1+1;
> +      plane[3].dcdy = -1 << 8;
> +      plane[3].c = (bbox.y1+1) << 8;
>         plane[3].eo = 0;
>      }
>
> diff --git a/src/gallium/drivers/llvmpipe/lp_setup_tri.c b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
> index fefd1c1..5ad4ac1 100644
> --- a/src/gallium/drivers/llvmpipe/lp_setup_tri.c
> +++ b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
> @@ -576,24 +576,24 @@ do_triangle_ccw(struct lp_setup_context *setup,
>      if (nr_planes == 7) {
>         const struct u_rect *scissor = &setup->scissors[viewport_index];
>
> -      plane[3].dcdx = -1;
> +      plane[3].dcdx = -1 << 8;
>         plane[3].dcdy = 0;
> -      plane[3].c = 1-scissor->x0;
> -      plane[3].eo = 1;
> +      plane[3].c = (1-scissor->x0) << 8;
> +      plane[3].eo = 1 << 8;
>
> -      plane[4].dcdx = 1;
> +      plane[4].dcdx = 1 << 8;
>         plane[4].dcdy = 0;
> -      plane[4].c = scissor->x1+1;
> +      plane[4].c = (scissor->x1+1) << 8;
>         plane[4].eo = 0;
>
>         plane[5].dcdx = 0;
> -      plane[5].dcdy = 1;
> -      plane[5].c = 1-scissor->y0;
> -      plane[5].eo = 1;
> +      plane[5].dcdy = 1 << 8;
> +      plane[5].c = (1-scissor->y0) << 8;
> +      plane[5].eo = 1 << 8;
>
>         plane[6].dcdx = 0;
> -      plane[6].dcdy = -1;
> -      plane[6].c = scissor->y1+1;
> +      plane[6].dcdy = -1 << 8;
> +      plane[6].c = (scissor->y1+1) << 8;
>         plane[6].eo = 0;
>      }
>
>



More information about the mesa-dev mailing list