[Mesa-dev] [PATCH 09/11] i965: Fix non-AA wide line rendering with fractional line widths

Kenneth Graunke kenneth at whitecape.org
Tue Feb 17 11:47:12 PST 2015


On Tuesday, February 10, 2015 04:40:46 PM Eduardo Lima Mitev wrote:
> From: Iago Toral Quiroga <itoral at igalia.com>
> 
> From 14.5.2.2. Wide Lines  of the OpenGL spec 4.5:
> 
> "(...)Let w be the width rounded to the nearest integer (...). If the
> line segment has endpoints given by (x0,y0) and (x1,y1) in window
> coordinates, the segment with endpoints (x0,y0-(w-1)/2) and
> (x1,y1-(w-1/2)) is rasterized, (...)"
> 
> The hardware it not rounding the line width, so we should do it.
> 
> Also, we should be careful not to go beyond the hardware limits
> for the line width after it gets rounded. Gen6-7 define a maximum line
> width slightly below 8.0, so we should advertise a maximum line
> width lower than 7.5 to make sure that 7.0 is the maximum integer
> line width that we can select. Since the line width granularity in these
> platforms is 0.125, we choose 7.375. Other platforms advertise rounded
> maximum line widths, so those are fine.
> 
> Fixes the following 3 dEQP tests:
> dEQP-GLES3.functional.rasterization.primitives.lines_wide
> dEQP-GLES3.functional.rasterization.fbo.texture_2d.primitives.lines_wide
> dEQP-GLES3.functional.rasterization.fbo.rbo_singlesample.primitives.lines_wide
> ---
>  src/mesa/drivers/dri/i965/brw_context.c   | 4 ++--
>  src/mesa/drivers/dri/i965/gen6_sf_state.c | 8 ++++++--
>  src/mesa/drivers/dri/i965/gen7_sf_state.c | 8 ++++++--
>  src/mesa/drivers/dri/i965/gen8_sf_state.c | 8 ++++++--
>  4 files changed, 20 insertions(+), 8 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
> index f5b0624..65b489e 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.c
> +++ b/src/mesa/drivers/dri/i965/brw_context.c
> @@ -428,8 +428,8 @@ brw_initialize_context_constants(struct brw_context *brw)
>        ctx->Const.MaxLineWidthAA = 40.0;
>        ctx->Const.LineWidthGranularity = 0.125;
>     } else if (brw->gen >= 6) {
> -      ctx->Const.MaxLineWidth = 7.875;
> -      ctx->Const.MaxLineWidthAA = 7.875;
> +      ctx->Const.MaxLineWidth = 7.375;
> +      ctx->Const.MaxLineWidthAA = 7.375;
>        ctx->Const.LineWidthGranularity = 0.125;
>     } else {
>        ctx->Const.MaxLineWidth = 7.0;
> diff --git a/src/mesa/drivers/dri/i965/gen6_sf_state.c b/src/mesa/drivers/dri/i965/gen6_sf_state.c
> index 7f0bab8..4d7714e 100644
> --- a/src/mesa/drivers/dri/i965/gen6_sf_state.c
> +++ b/src/mesa/drivers/dri/i965/gen6_sf_state.c
> @@ -361,8 +361,12 @@ upload_sf_state(struct brw_context *brw)
>  
>     /* _NEW_LINE */
>     {
> -      uint32_t line_width_u3_7 =
> -         U_FIXED(CLAMP(ctx->Line.Width, 0.0, ctx->Const.MaxLineWidth), 7);
> +      /* OpenGL dictates that line width should be rounded to the nearest
> +       * integer
> +       */
> +      float line_width =
> +         (int) CLAMP(ctx->Line.Width + 0.5, 0.0, ctx->Const.MaxLineWidth);

Nice catch!  It hadn't even occurred to me that GL would require the
line width to be rounded.

I think this would be a bit clearer as:

float line_width =
   roundf(CLAMP(ctx->Line.Width, 0.0, ctx->Const.MaxLineWidth));

With that changed in all three places, this is:
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150217/e2ce4c3c/attachment-0001.sig>


More information about the mesa-dev mailing list