[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