Am 08.01.2014 18:27, schrieb jfons...@vmware.com:
> From: José Fonseca <jfons...@vmware.com>
> 
> Commit eda21d2a3010d9fc5a68b55a843c5e44b2abf8dd fixed the rasterization
> of points for Direct3D but ended up breaking the rasterization of OpenGL
> non-sprite points, in particular conform's pntrast.c test.
> 
> The only way to get both working is to properly honour
> pipe_rasterizer::point_quad_rasterization, and follow the weird OpenGL
> rule when it is false.
> ---
>  src/gallium/drivers/llvmpipe/lp_setup_point.c | 64 
> ++++++++++++++++++++++-----
>  1 file changed, 54 insertions(+), 10 deletions(-)
> 
> diff --git a/src/gallium/drivers/llvmpipe/lp_setup_point.c 
> b/src/gallium/drivers/llvmpipe/lp_setup_point.c
> index 988e0c5..e5ce4ee 100644
> --- a/src/gallium/drivers/llvmpipe/lp_setup_point.c
> +++ b/src/gallium/drivers/llvmpipe/lp_setup_point.c
> @@ -338,9 +338,13 @@ try_setup_point( struct lp_setup_context *setup,
>     int fixed_width = MAX2(FIXED_ONE,
>                            (subpixel_snap(size) + FIXED_ONE/2 - 1) & 
> ~(FIXED_ONE-1));
>  
> -   const int x0 = subpixel_snap(v0[0][0] - setup->pixel_offset) - 
> fixed_width/2;
> -   const int y0 = subpixel_snap(v0[0][1] - setup->pixel_offset) - 
> fixed_width/2;
> -     
> +   /* Yes this is necessary to accurately calculate bounding boxes
> +    * with the two fill-conventions we support.  GL (normally) ends
> +    * up needing a bottom-left fill convention, which requires
> +    * slightly different rounding.
> +    */
> +   int adj = (setup->bottom_edge_rule != 0) ? 1 : 0;
> +
>     struct lp_scene *scene = setup->scene;
>     struct lp_rast_triangle *point;
>     unsigned bytes;
> @@ -363,13 +367,14 @@ try_setup_point( struct lp_setup_context *setup,
>        print_point(setup, v0);
>  
>     /* Bounding rectangle (in pixels) */
> -   {
> -      /* Yes this is necessary to accurately calculate bounding boxes
> -       * with the two fill-conventions we support.  GL (normally) ends
> -       * up needing a bottom-left fill convention, which requires
> -       * slightly different rounding.
> +   if (!lp_context->rasterizer ||
> +       lp_context->rasterizer->point_quad_rasterization) {
> +      /*
> +       * Rasterize points as quads.
>         */
> -      int adj = (setup->bottom_edge_rule != 0) ? 1 : 0;
> +
> +      const int x0 = subpixel_snap(v0[0][0] - setup->pixel_offset) - 
> fixed_width/2;
> +      const int y0 = subpixel_snap(v0[0][1] - setup->pixel_offset) - 
> fixed_width/2;
>  
>        bbox.x0 = (x0 + (FIXED_ONE-1)) >> FIXED_ORDER;
>        bbox.x1 = (x0 + fixed_width + (FIXED_ONE-1)) >> FIXED_ORDER;
> @@ -380,8 +385,47 @@ try_setup_point( struct lp_setup_context *setup,
>         */
>        bbox.x1--;
>        bbox.y1--;
> +   } else {
> +      /*
> +       * OpenGL rasterization rules for non-sprite points.
Maybe add "legacy" here before OpenGL?

> +       *
> +       * Per OpenGL 2.1 spec, section 3.3.1, "Basic Point Rasterization".
> +       */
> +
> +      const int x0 = subpixel_snap(v0[0][0]);
> +      const int y0 = subpixel_snap(v0[0][1]) - adj;
> +
> +      int int_width = fixed_width >> FIXED_ORDER;
> +
> +      assert(setup->pixel_offset != 0);
> +
> +      if (int_width == 1) {
> +         bbox.x0 = x0 >> FIXED_ORDER;
> +         bbox.y0 = y0 >> FIXED_ORDER;
> +         bbox.x1 = bbox.x0;
> +         bbox.y1 = bbox.y0;
> +      } else {
> +         if (int_width & 1) {
> +            /* Odd width */
> +            bbox.x0 = (x0 >> FIXED_ORDER) - (int_width - 1)/2;
> +            bbox.y0 = (y0 >> FIXED_ORDER) - (int_width - 1)/2;
> +         } else {
> +            /* Even width */
> +            bbox.x0 = ((x0 + FIXED_ONE/2) >> FIXED_ORDER) - int_width/2;
> +            bbox.y0 = ((y0 + FIXED_ONE/2) >> FIXED_ORDER) - int_width/2;
> +         }
> +
> +         bbox.x1 = bbox.x0 + int_width - 1;
> +         bbox.y1 = bbox.y0 + int_width - 1;
> +      }
>     }
> -   
> +
> +   if (0) {
> +      debug_printf("  bbox: (%i, %i) - (%i, %i)\n",
> +                   bbox.x0, bbox.y0,
> +                   bbox.x1, bbox.y1);
> +   }
> +
>     if (!u_rect_test_intersection(&setup->draw_regions[viewport_index], 
> &bbox)) {
>        if (0) debug_printf("offscreen\n");
>        LP_COUNT(nr_culled_tris);
> 

This looks good to me. Note though this type of point rasterization is
only available in pre 3.0 contexts (or compatibilility contexts which we
don't support) anyway.

Roland
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to