i965: Fix non-AA wide line rendering with fractional line widths
authorIago Toral Quiroga <itoral@igalia.com>
Tue, 10 Feb 2015 15:40:46 +0000 (16:40 +0100)
committerIago Toral Quiroga <itoral@igalia.com>
Tue, 24 Feb 2015 07:58:54 +0000 (08:58 +0100)
"(...)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

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_context.c
src/mesa/drivers/dri/i965/gen6_sf_state.c
src/mesa/drivers/dri/i965/gen7_sf_state.c
src/mesa/drivers/dri/i965/gen8_sf_state.c

index 50b138720d851f46961a04dee5bf0ffe624b1ede..786e6f5dc0765adb3940ad8133db734079045191 100644 (file)
@@ -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;
index 7f0bab86c55b3795ccef0e105acc77247c5c77a8..f9d8d27fe734c3dbe0596ad0ba0bade7b6aa666d 100644 (file)
@@ -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 =
+         roundf(CLAMP(ctx->Line.Width, 0.0, ctx->Const.MaxLineWidth));
+      uint32_t line_width_u3_7 = U_FIXED(line_width, 7);
       /* TODO: line width of 0 is not allowed when MSAA enabled */
       if (line_width_u3_7 == 0)
          line_width_u3_7 = 1;
index 6644010ca1b053ad4daf4b35246b9d217b624f3a..c9815b03bb47f442ee05293aca7920246a3ad149 100644 (file)
@@ -192,8 +192,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 =
+         roundf(CLAMP(ctx->Line.Width, 0.0, ctx->Const.MaxLineWidth));
+      uint32_t line_width_u3_7 = U_FIXED(line_width, 7);
       /* TODO: line width of 0 is not allowed when MSAA enabled */
       if (line_width_u3_7 == 0)
          line_width_u3_7 = 1;
index 713ee5f93a0e30cacdf2460cf3621d08686b1bed..27116f7e4c8c23ec47ff1fa1b525ade9fbfd6065 100644 (file)
@@ -154,8 +154,12 @@ upload_sf(struct brw_context *brw)
        dw1 |= GEN6_SF_VIEWPORT_TRANSFORM_ENABLE;
 
    /* _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 =
+      roundf(CLAMP(ctx->Line.Width, 0.0, ctx->Const.MaxLineWidth));
+   uint32_t line_width_u3_7 = U_FIXED(line_width, 7);
    if (line_width_u3_7 == 0)
       line_width_u3_7 = 1;
    if (brw->gen >= 9 || brw->is_cherryview) {