i965: do not round line width when multisampling or antialiaing are enabled
authorIago Toral Quiroga <itoral@igalia.com>
Wed, 10 Jun 2015 07:07:32 +0000 (09:07 +0200)
committerIago Toral Quiroga <itoral@igalia.com>
Thu, 11 Jun 2015 06:32:07 +0000 (08:32 +0200)
In commit fe74fee8fa721a we rounded the line width to the nearest integer to
match the GLES3 spec requirements stated in section 13.4.2.1, but that seems
to break a dEQP test that renders wide lines in some multisampling scenarios.

Ian noted that the Open 4.4 spec has the following similar text:

    "The actual width of non-antialiased lines is determined by rounding the
    supplied width to the nearest integer, then clamping it to the
    implementation-dependent maximum non-antialiased line width."

and suggested that when ES removed antialiased lines, they removed
"non-antialised" from that paragraph but probably should not have.

Going by that note, this patch restricts the quantization implemented in
fe74fee8fa721a only to regular aliased lines. This seems to keep the
tests fixed with that commit passing while fixing the broken test.

v2:
  - Drop one of the clamps (Ken, Marius)
  - Add a rule to prevent advertising line widths that when rounded go beyond
    the limits allowed by the hardware (Ken)
  - Update comments in the code accordingly (Ian)
  - Put the code in a utility function (Ian)

Fixes:
dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives.lines_wide

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90749

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Cc: "10.6" <mesa-stable@lists.freedesktop.org>
src/mesa/drivers/dri/i965/brw_context.c
src/mesa/drivers/dri/i965/brw_util.h
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 652d9a34e8f7e377a0c9d4d0e9dbe02a1293996c..ab047046fdb63fb9fe7e686677651eb8cdce65ec 100644 (file)
@@ -442,6 +442,13 @@ brw_initialize_context_constants(struct brw_context *brw)
       ctx->Const.LineWidthGranularity = 0.5;
    }
 
+   /* For non-antialiased lines, we have to round the line width to the
+    * nearest whole number. Make sure that we don't advertise a line
+    * width that, when rounded, will be beyond the actual hardware
+    * maximum.
+    */
+   assert(roundf(ctx->Const.MaxLineWidth) <= ctx->Const.MaxLineWidth);
+
    ctx->Const.MinPointSize = 1.0;
    ctx->Const.MinPointSizeAA = 1.0;
    ctx->Const.MaxPointSize = 255.0;
index b548d234538043885b67dde8e9eaf2e97b83e91b..671d72e1cc71af3fb725c24893c68f9729f01103 100644 (file)
 
 #include "main/mtypes.h"
 #include "main/imports.h"
+#include "brw_context.h"
 
 extern GLuint brw_translate_blend_factor( GLenum factor );
 extern GLuint brw_translate_blend_equation( GLenum mode );
 extern GLenum brw_fix_xRGB_alpha(GLenum function);
 
+static inline float
+brw_get_line_width(struct brw_context *brw)
+{
+   /* From the OpenGL 4.4 spec:
+    *
+    * "The actual width of non-antialiased lines is determined by rounding
+    * the supplied width to the nearest integer, then clamping it to the
+    * implementation-dependent maximum non-antialiased line width."
+    */
+   return CLAMP(!brw->ctx.Multisample._Enabled && !brw->ctx.Line.SmoothFlag
+                ? roundf(brw->ctx.Line.Width) : brw->ctx.Line.Width,
+                0.0, brw->ctx.Const.MaxLineWidth);
+}
+
 #endif
index e445ce256000cc016d76de546e55c50f9b78dbb8..d5777647f7ecc9853a90107d1dacee8ec853440a 100644 (file)
@@ -361,11 +361,7 @@ upload_sf_state(struct brw_context *brw)
 
    /* _NEW_LINE */
    {
-      /* 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));
+      float line_width = brw_get_line_width(brw);
       uint32_t line_width_u3_7 = U_FIXED(line_width, 7);
 
       /* Line width of 0 is not allowed when MSAA enabled */
index 58e33370c57b169ba28fcf44aafbdd3684f9dda5..87ff284e31c904be1e4e807a287b3c988cf38662 100644 (file)
@@ -192,11 +192,7 @@ upload_sf_state(struct brw_context *brw)
 
    /* _NEW_LINE */
    {
-      /* 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));
+      float line_width = brw_get_line_width(brw);
       uint32_t line_width_u3_7 = U_FIXED(line_width, 7);
       /* Line width of 0 is not allowed when MSAA enabled */
       if (ctx->Multisample._Enabled) {
index 52a21b6a8e8d7069d297b447a2fc59c8147bf8dc..83ef62bc9611b9b15d0b6c11db493677abcf6e12 100644 (file)
@@ -154,11 +154,7 @@ upload_sf(struct brw_context *brw)
        dw1 |= GEN6_SF_VIEWPORT_TRANSFORM_ENABLE;
 
    /* _NEW_LINE */
-   /* 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));
+   float line_width = brw_get_line_width(brw);
    uint32_t line_width_u3_7 = U_FIXED(line_width, 7);
    if (line_width_u3_7 == 0)
       line_width_u3_7 = 1;