i965: Enable smooth points when multisampling without point sprites.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 11 Feb 2014 03:37:08 +0000 (19:37 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 19 Feb 2014 23:43:22 +0000 (15:43 -0800)
According to the "Point Multisample Rasterization" of the OpenGL
specification (3.0 or later), smooth points are supposed to be enabled
implicitly when multisampling, regardless of the GL_POINT_SMOOTH flag.

However, if GL_POINT_SPRITE is enabled, you get square points no matter
what.  Core contexts always enable point sprites, so this effectively
makes smooth points go away, even in the case of multisampling.

Fixes Piglit's EXT_framebuffer_multisample/point-smooth tests.
(Yes, that's right folks, we actually have Piglit tests for this.)

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
src/mesa/drivers/dri/i965/gen8_sf_state.c

index b31b17e1064d0ca93a3727f70a0f469631175243..0693fee7047420ba0478257a6d47f5a2bcda1a36 100644 (file)
@@ -139,8 +139,11 @@ upload_sf(struct brw_context *brw)
    if (!(ctx->VertexProgram.PointSizeEnabled || ctx->Point._Attenuated))
       dw3 |= GEN6_SF_USE_STATE_POINT_WIDTH;
 
-   if (ctx->Point.SmoothFlag)
+   /* _NEW_POINT | _NEW_MULTISAMPLE */
+   if ((ctx->Point.SmoothFlag || ctx->Multisample._Enabled) &&
+       !ctx->Point.PointSprite) {
       dw3 |= GEN8_SF_SMOOTH_POINT_ENABLE;
+   }
 
    dw3 |= GEN6_SF_LINE_AA_MODE_TRUE;
 
@@ -166,6 +169,7 @@ const struct brw_tracked_state gen8_sf_state = {
       .mesa  = _NEW_LIGHT |
                _NEW_PROGRAM |
                _NEW_LINE |
+               _NEW_MULTISAMPLE |
                _NEW_POINT,
       .brw   = BRW_NEW_CONTEXT,
       .cache = 0,