mesa: fix issues around multisample enable
authorRoland Scheidegger <sroland@tungstengraphics.com>
Wed, 2 Jul 2008 18:08:27 +0000 (20:08 +0200)
committerRoland Scheidegger <sroland@tungstengraphics.com>
Wed, 2 Jul 2008 18:22:08 +0000 (20:22 +0200)
multisample enable is enabled by default, however gl mandates multisample
rendering rules only apply if there's also a multisampled buffer.

src/mesa/drivers/dri/r300/r300_render.c
src/mesa/main/mtypes.h
src/mesa/main/multisample.c
src/mesa/main/state.c
src/mesa/state_tracker/st_atom_rasterizer.c
src/mesa/swrast/s_points.c

index eee1e803a00a38b32a512d48b4b4fe60bfe83cbf..c809679e6cd41cf54ae192dd23d39681104ed8f9 100644 (file)
@@ -359,7 +359,7 @@ static int r300Fallback(GLcontext * ctx)
 
        if (!r300->disable_lowimpact_fallback) {
                FALLBACK_IF(ctx->Polygon.StippleFlag);
-               FALLBACK_IF(ctx->Multisample.Enabled);
+               FALLBACK_IF(ctx->Multisample._Enabled);
                FALLBACK_IF(ctx->Line.StippleFlag);
                FALLBACK_IF(ctx->Line.SmoothFlag);
                FALLBACK_IF(ctx->Point.SmoothFlag);
index 0a065541e1f7e995b61edac9ffa2b6a7becd4dd3..00e7d5d395d6ff75e973d4ac0deda7eec077b86f 100644 (file)
@@ -961,6 +961,7 @@ struct gl_list_extensions
 struct gl_multisample_attrib
 {
    GLboolean Enabled;
+   GLboolean _Enabled;   /**< true if Enabled and multisample buffer */
    GLboolean SampleAlphaToCoverage;
    GLboolean SampleAlphaToOne;
    GLboolean SampleCoverage;
index e138087436eb41b66492082551ee8663b590befb..b9cfad9216081ea80c9e96f9ec9c8f12294507ac 100644 (file)
@@ -57,7 +57,7 @@ _mesa_SampleCoverageARB(GLclampf value, GLboolean invert)
 void
 _mesa_init_multisample(GLcontext *ctx)
 {
-   ctx->Multisample.Enabled = GL_FALSE;
+   ctx->Multisample.Enabled = GL_TRUE;
    ctx->Multisample.SampleAlphaToCoverage = GL_FALSE;
    ctx->Multisample.SampleAlphaToOne = GL_FALSE;
    ctx->Multisample.SampleCoverage = GL_FALSE;
index 315253d90a7faa28c270eebc62aca659ef366409..344af91e172fcf50b0158072ce58349c46ecd4fa 100644 (file)
@@ -288,6 +288,20 @@ update_viewport_matrix(GLcontext *ctx)
 }
 
 
+/**
+ * Update derived multisample state.
+ */
+static void
+update_multisample(GLcontext *ctx)
+{
+   ctx->Multisample._Enabled = GL_FALSE;
+   if (ctx->DrawBuffer) {
+      if (ctx->DrawBuffer->Visual.sampleBuffers)
+         ctx->Multisample._Enabled = GL_TRUE;
+   }
+}
+
+
 /**
  * Update derived color/blend/logicop state.
  */
@@ -425,6 +439,9 @@ _mesa_update_state_locked( GLcontext *ctx )
    if (new_state & (_NEW_BUFFERS | _NEW_VIEWPORT))
       update_viewport_matrix(ctx);
 
+   if (new_state & _NEW_MULTISAMPLE)
+      update_multisample( ctx );
+
    if (new_state & _NEW_COLOR)
       update_color( ctx );
 
index 87a91d56d06b07d57d8f75cd8965395b472cb98e..ff40bb43124931b3b4e97874dbbc269b4e33b714 100644 (file)
@@ -254,7 +254,7 @@ static void update_raster_state( struct st_context *st )
    raster->line_stipple_factor = ctx->Line.StippleFactor - 1;
 
    /* _NEW_MULTISAMPLE */
-   if (ctx->Multisample.Enabled)
+   if (ctx->Multisample._Enabled)
       raster->multisample = 1;
 
    /* _NEW_SCISSOR */
index c0f32e9c91baf1de53b1928f22ace11e4280bfa2..f4b3650210e2bdc2343e1d19018b390f44c64269 100644 (file)
@@ -250,7 +250,7 @@ smooth_point(GLcontext *ctx, const SWvertex *vert)
    size = CLAMP(size, ctx->Const.MinPointSizeAA, ctx->Const.MaxPointSizeAA);
 
    /* alpha attenuation / fade factor */
-   if (ctx->Multisample.Enabled) {
+   if (ctx->Multisample._Enabled) {
       if (vert->pointSize >= ctx->Point.Threshold) {
          alphaAtten = 1.0F;
       }