i965: fix point sprite on sandybridge
authorZhenyu Wang <zhenyuw@linux.intel.com>
Sun, 26 Sep 2010 06:36:14 +0000 (14:36 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Tue, 28 Sep 2010 07:58:21 +0000 (15:58 +0800)
Need to set point sprite function in fixed SF state now on sandybridge.

src/mesa/drivers/dri/i965/gen6_sf_state.c

index a0322784685820614e72d1146743e542877dc9e8..6c88338195801c0cd0398e47e7f71a9e63877514 100644 (file)
@@ -68,7 +68,7 @@ upload_sf_state(struct brw_context *brw)
    /* CACHE_NEW_VS_PROG */
    uint32_t num_inputs = brw_count_bits(brw->vs.prog_data->outputs_written);
    uint32_t num_outputs = brw_count_bits(brw->fragment_program->Base.InputsRead);
-   uint32_t dw1, dw2, dw3, dw4;
+   uint32_t dw1, dw2, dw3, dw4, dw16;
    int i;
    /* _NEW_BUFFER */
    GLboolean render_to_fbo = brw->intel.ctx.DrawBuffer->Name != 0;
@@ -82,6 +82,7 @@ upload_sf_state(struct brw_context *brw)
       GEN6_SF_STATISTICS_ENABLE;
    dw3 = 0;
    dw4 = 0;
+   dw16 = 0;
 
    /* _NEW_POLYGON */
    if ((ctx->Polygon.FrontFace == GL_CCW) ^ render_to_fbo)
@@ -129,7 +130,7 @@ upload_sf_state(struct brw_context *brw)
 
    dw4 |= U_FIXED(CLAMP(ctx->Point.Size, 0.125, 225.875), 3) <<
       GEN6_SF_POINT_WIDTH_SHIFT;
-   if (render_to_fbo)
+   if (ctx->Point.SpriteOrigin == GL_LOWER_LEFT)
       dw1 |= GEN6_SF_POINT_SPRITE_LOWERLEFT;
 
    /* _NEW_LIGHT */
@@ -143,6 +144,13 @@ upload_sf_state(struct brw_context *brw)
         (1 << GEN6_SF_TRIFAN_PROVOKE_SHIFT);
    }
 
+   if (ctx->Point.PointSprite) {
+       for (i = 0; i < 8; i++) { 
+          if (ctx->Point.CoordReplace[i])
+              dw16 |= (1 << i);
+       }
+   }
+
    BEGIN_BATCH(20);
    OUT_BATCH(CMD_3D_SF_STATE << 16 | (20 - 2));
    OUT_BATCH(dw1);
@@ -172,7 +180,7 @@ upload_sf_state(struct brw_context *brw)
       }
       OUT_BATCH(attr_overrides);
    }
-   OUT_BATCH(0); /* point sprite texcoord bitmask */
+   OUT_BATCH(dw16); /* point sprite texcoord bitmask */
    OUT_BATCH(0); /* constant interp bitmask */
    OUT_BATCH(0); /* wrapshortest enables 0-7 */
    OUT_BATCH(0); /* wrapshortest enables 8-15 */