diff --git a/src/mesa/state_tracker/st_atom_rasterizer.c b/src/mesa/state_tracker/st_atom_rasterizer.c index 9f3ba33427f..4c1abfb6800 100644 --- a/src/mesa/state_tracker/st_atom_rasterizer.c +++ b/src/mesa/state_tracker/st_atom_rasterizer.c @@ -163,13 +163,40 @@ st_update_rasterizer(struct st_context *st) raster->offset_clamp = ctx->Polygon.OffsetClamp; } - raster->poly_smooth = ctx->Polygon.SmoothFlag; raster->poly_stipple_enable = ctx->Polygon.StippleFlag; + /* Multisampling disables point, line, and polygon smoothing. + * + * GL_ARB_multisample says: + * + * "If MULTISAMPLE_ARB is enabled, and SAMPLE_BUFFERS_ARB is a value of + * one, then points are rasterized using the following algorithm, + * regardless of whether point antialiasing (POINT_SMOOTH) is enabled" + * + * "If MULTISAMPLE_ARB is enabled, and SAMPLE_BUFFERS_ARB is a value of + * one, then lines are rasterized using the following algorithm, + * regardless of whether line antialiasing (LINE_SMOOTH) is enabled" + * + * "If MULTISAMPLE_ARB is enabled, and SAMPLE_BUFFERS_ARB is a value of + * one, then polygons are rasterized using the following algorithm, + * regardless of whether polygon antialiasing (POLYGON_SMOOTH) is + * enabled" + */ + + /* _NEW_MULTISAMPLE */ + bool multisample = _mesa_is_multisample_enabled(ctx); + raster->multisample = multisample; + + /* _NEW_POLYGON | _NEW_MULTISAMPLE */ + raster->poly_smooth = !multisample && ctx->Polygon.SmoothFlag; + /* _NEW_POINT */ raster->point_size = ctx->Point.Size; - raster->point_smooth = !ctx->Point.PointSprite && ctx->Point.SmoothFlag; + + /* _NEW_POINT | _NEW_MULTISAMPLE */ + raster->point_smooth = !multisample && !ctx->Point.PointSprite && + ctx->Point.SmoothFlag; /* _NEW_POINT | _NEW_PROGRAM */ @@ -206,10 +233,10 @@ st_update_rasterizer(struct st_context *st) ctx->Point.MaxSize); } - /* _NEW_LINE + /* _NEW_LINE | _NEW_MULTISAMPLE */ - raster->line_smooth = ctx->Line.SmoothFlag; - if (ctx->Line.SmoothFlag) { + if (!multisample && ctx->Line.SmoothFlag) { + raster->line_smooth = 1; raster->line_width = CLAMP(ctx->Line.Width, ctx->Const.MinLineWidthAA, ctx->Const.MaxLineWidthAA); @@ -226,9 +253,6 @@ st_update_rasterizer(struct st_context *st) /* GL stipple factor is in [1,256], remap to [0, 255] here */ raster->line_stipple_factor = ctx->Line.StippleFactor - 1; - /* _NEW_MULTISAMPLE */ - raster->multisample = _mesa_is_multisample_enabled(ctx); - /* _NEW_MULTISAMPLE | _NEW_BUFFERS */ raster->force_persample_interp = !st->force_persample_in_shader &&