Mesa (gallium-nopointsizeminmax): gallium: clean up point sprite rasterizer state

Roland Scheidegger sroland at kemper.freedesktop.org
Wed Feb 3 16:41:55 UTC 2010


Module: Mesa
Branch: gallium-nopointsizeminmax
Commit: 4a4daa75a85db22cd37ebd533ebbccb427e07077
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4a4daa75a85db22cd37ebd533ebbccb427e07077

Author: Roland Scheidegger <sroland at vmware.com>
Date:   Wed Feb  3 17:25:14 2010 +0100

gallium: clean up point sprite rasterizer state

Don't need sprite coord origin per coord.
Also, don't need separate sprite enable bit - if all coords have it diabled,
then there are no point sprites (technically, there's a distinction in pre-GL3,
but it only differs in having more leniency in clamping to max size, something
the state tracker would need to handle and the hardware won't bother anyway).
Also, use packed field for the per-coord enables.
All in all, should save 3 dwords in rasterizer state (from 10 down to 7).

---

 src/gallium/auxiliary/draw/draw_pipe_validate.c    |    6 ++--
 src/gallium/auxiliary/draw/draw_pipe_wide_point.c  |   16 +++++++-----
 src/gallium/docs/source/cso/rasterizer.rst         |    7 ++++-
 src/gallium/drivers/i965/brw_sf.c                  |   17 +++++++------
 src/gallium/drivers/i965/brw_sf_state.c            |    2 +-
 src/gallium/drivers/nv10/nv10_state.c              |    4 +-
 src/gallium/drivers/nv20/nv20_state.c              |    4 +-
 src/gallium/drivers/nv30/nv30_state.c              |    4 +-
 src/gallium/drivers/nv40/nv40_state.c              |    4 +-
 src/gallium/drivers/nv50/nv50_program.c            |   14 ++++------
 src/gallium/drivers/nv50/nv50_state.c              |    2 +-
 src/gallium/drivers/softpipe/sp_video_context.c    |    3 +-
 src/gallium/drivers/svga/svga_pipe_rasterizer.c    |    2 +-
 src/gallium/drivers/trace/tr_dump_state.c          |    5 +--
 src/gallium/include/pipe/p_defines.h               |    5 +--
 src/gallium/include/pipe/p_state.h                 |    4 +-
 .../state_trackers/python/retrace/interpreter.py   |    2 +-
 src/mesa/state_tracker/st_atom_rasterizer.c        |   25 ++++++++++---------
 18 files changed, 64 insertions(+), 62 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_pipe_validate.c b/src/gallium/auxiliary/draw/draw_pipe_validate.c
index bea90e5..ac29634 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_validate.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_validate.c
@@ -105,7 +105,7 @@ draw_need_pipeline(const struct draw_context *draw,
          return TRUE;
 
       /* point sprites */
-      if (rasterizer->point_sprite && draw->pipeline.point_sprite)
+      if (rasterizer->sprite_coord_enable && draw->pipeline.point_sprite)
          return TRUE;
    }
 
@@ -165,7 +165,7 @@ static struct draw_stage *validate_pipeline( struct draw_stage *stage )
                  && !draw->rasterizer->line_smooth);
 
    /* drawing large points? */
-   if (draw->rasterizer->point_sprite && draw->pipeline.point_sprite)
+   if (draw->rasterizer->sprite_coord_enable && draw->pipeline.point_sprite)
       wide_points = TRUE;
    else if (draw->rasterizer->point_smooth && draw->pipeline.aapoint)
       wide_points = FALSE;
@@ -197,7 +197,7 @@ static struct draw_stage *validate_pipeline( struct draw_stage *stage )
       precalc_flat = 1;
    }
 
-   if (wide_points || draw->rasterizer->point_sprite) {
+   if (wide_points || draw->rasterizer->sprite_coord_enable) {
       draw->pipeline.wide_point->next = next;
       next = draw->pipeline.wide_point;
    }
diff --git a/src/gallium/auxiliary/draw/draw_pipe_wide_point.c b/src/gallium/auxiliary/draw/draw_pipe_wide_point.c
index f723e65..d9d4d2a 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_wide_point.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_wide_point.c
@@ -69,8 +69,9 @@ struct widepoint_stage {
    float ybias;
 
    uint texcoord_slot[PIPE_MAX_SHADER_OUTPUTS];
-   uint texcoord_mode[PIPE_MAX_SHADER_OUTPUTS];
+   uint texcoord_enable[PIPE_MAX_SHADER_OUTPUTS];
    uint num_texcoords;
+   uint texcoord_mode;
 
    int psize_slot;
 
@@ -96,10 +97,10 @@ static void set_texcoords(const struct widepoint_stage *wide,
 {
    uint i;
    for (i = 0; i < wide->num_texcoords; i++) {
-      if (wide->texcoord_mode[i] != PIPE_SPRITE_COORD_NONE) {
+      if (wide->texcoord_enable[i]) {
          uint j = wide->texcoord_slot[i];
          v->data[j][0] = tc[0];
-         if (wide->texcoord_mode[i] == PIPE_SPRITE_COORD_LOWER_LEFT)
+         if (wide->texcoord_mode == PIPE_SPRITE_COORD_LOWER_LEFT)
             v->data[j][1] = 1.0f - tc[1];
          else
             v->data[j][1] = tc[1];
@@ -129,7 +130,7 @@ static void widepoint_point( struct draw_stage *stage,
 {
    const struct widepoint_stage *wide = widepoint_stage(stage);
    const unsigned pos = draw_current_shader_position_output(stage->draw);
-   const boolean sprite = (boolean) stage->draw->rasterizer->point_sprite;
+   const boolean sprite = (boolean) stage->draw->rasterizer->sprite_coord_enable;
    float half_size;
    float left_adj, right_adj, bot_adj, top_adj;
 
@@ -222,21 +223,22 @@ static void widepoint_first_point( struct draw_stage *stage,
 
    /* XXX we won't know the real size if it's computed by the vertex shader! */
    if ((draw->rasterizer->point_size > draw->pipeline.wide_point_threshold) ||
-       (draw->rasterizer->point_sprite && draw->pipeline.point_sprite)) {
+       (draw->rasterizer->sprite_coord_enable && draw->pipeline.point_sprite)) {
       stage->point = widepoint_point;
    }
    else {
       stage->point = draw_pipe_passthrough_point;
    }
 
-   if (draw->rasterizer->point_sprite) {
+   if (draw->rasterizer->sprite_coord_enable) {
       /* find vertex shader texcoord outputs */
       const struct draw_vertex_shader *vs = draw->vs.vertex_shader;
       uint i, j = 0;
+      wide->texcoord_mode = draw->rasterizer->sprite_coord_mode;
       for (i = 0; i < vs->info.num_outputs; i++) {
          if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_GENERIC) {
             wide->texcoord_slot[j] = i;
-            wide->texcoord_mode[j] = draw->rasterizer->sprite_coord_mode[j];
+            wide->texcoord_enable[j] = (draw->rasterizer->sprite_coord_enable >> j) & 1;
             j++;
          }
       }
diff --git a/src/gallium/docs/source/cso/rasterizer.rst b/src/gallium/docs/source/cso/rasterizer.rst
index 5ffd600..89c3c06 100644
--- a/src/gallium/docs/source/cso/rasterizer.rst
+++ b/src/gallium/docs/source/cso/rasterizer.rst
@@ -83,7 +83,10 @@ point_size_per_vertex
 point_size
     The size of points, if not specified per-vertex.
 point_sprite
-    Whether points are drawn as sprites (textured quads)
+    Whether points are drawn as sprites (textured quads). This is mutually
+    exclusive with point_smooth. Note that sprite_coord_mode set to
+    PIPE_SPRITE_COORD_NONE for all coords and point_sprite enabled is basically
+    equivalent to point_sprite disabled.
 sprite_coord_mode
     Specifies how the value for each shader output should be computed when
     drawing sprites.  If PIPE_SPRITE_COORD_NONE, don't change the vertex
@@ -98,7 +101,7 @@ sprite_coord_mode
     sprite rendering.
     Note that when geometry shaders are available, this state could be
     removed.  A special geometry shader defined by the state tracker could
-    converts the incoming points into quads with the proper texture coords.
+    convert the incoming points into quads with the proper texture coords.
 
 scissor
     Whether the scissor test is enabled.
diff --git a/src/gallium/drivers/i965/brw_sf.c b/src/gallium/drivers/i965/brw_sf.c
index e1986a9..fc3102b 100644
--- a/src/gallium/drivers/i965/brw_sf.c
+++ b/src/gallium/drivers/i965/brw_sf.c
@@ -128,6 +128,7 @@ static enum pipe_error compile_sf_prog( struct brw_context *brw,
 static enum pipe_error upload_sf_prog(struct brw_context *brw)
 {
    const struct brw_fs_signature *sig = &brw->curr.fragment_shader->signature;
+   const struct pipe_rasterizer_state *rast = &brw->curr.rast->templ;
    struct brw_sf_prog_key key;
    enum pipe_error ret;
    unsigned i;
@@ -166,8 +167,8 @@ static enum pipe_error upload_sf_prog(struct brw_context *brw)
    case PIPE_PRIM_TRIANGLES: 
       /* PIPE_NEW_RAST
        */
-      if (brw->curr.rast->templ.fill_cw != PIPE_POLYGON_MODE_FILL ||
-	  brw->curr.rast->templ.fill_ccw != PIPE_POLYGON_MODE_FILL)
+      if (rast->fill_cw != PIPE_POLYGON_MODE_FILL ||
+	  rast->fill_ccw != PIPE_POLYGON_MODE_FILL)
 	 key.primitive = SF_UNFILLED_TRIS;
       else
 	 key.primitive = SF_TRIANGLES;
@@ -180,14 +181,14 @@ static enum pipe_error upload_sf_prog(struct brw_context *brw)
       break;
    }
 
-   key.do_point_sprite = brw->curr.rast->templ.point_sprite;
-   key.sprite_origin_lower_left = 0; /* XXX: ctx->Point.SpriteOrigin - fix rast state */
-   key.do_flat_shading = brw->curr.rast->templ.flatshade;
-   key.do_twoside_color = brw->curr.rast->templ.light_twoside;
+   key.do_point_sprite = rast->sprite_coord_enable ? 1 : 0;
+   key.sprite_origin_lower_left = (rast->sprite_coord_mode == PIPE_SPRITE_COORD_LOWER_LEFT);
+   key.point_coord_replace_attrs = rast->sprite_coord_enable;
+   key.do_flat_shading = rast->flatshade;
+   key.do_twoside_color = rast->light_twoside;
 
    if (key.do_twoside_color) {
-      key.frontface_ccw = (brw->curr.rast->templ.front_winding == 
-			   PIPE_WINDING_CCW);
+      key.frontface_ccw = (rast->front_winding == PIPE_WINDING_CCW);
    }
 
    if (brw_search_cache(&brw->cache, BRW_SF_PROG,
diff --git a/src/gallium/drivers/i965/brw_sf_state.c b/src/gallium/drivers/i965/brw_sf_state.c
index 663a688..0ad91e0 100644
--- a/src/gallium/drivers/i965/brw_sf_state.c
+++ b/src/gallium/drivers/i965/brw_sf_state.c
@@ -123,7 +123,7 @@ sf_unit_populate_key(struct brw_context *brw, struct brw_sf_unit_key *key)
    key->line_last_pixel_enable = rast->line_last_pixel;
    key->gl_rasterization_rules = rast->gl_rasterization_rules;
 
-   key->point_sprite = rast->point_sprite;
+   key->point_sprite = rast->sprite_coord_enable ? 1 : 0;
    key->point_attenuated = rast->point_size_per_vertex;
 
    key->point_size = rast->point_size;
diff --git a/src/gallium/drivers/nv10/nv10_state.c b/src/gallium/drivers/nv10/nv10_state.c
index ffc6be3..6f674d6 100644
--- a/src/gallium/drivers/nv10/nv10_state.c
+++ b/src/gallium/drivers/nv10/nv10_state.c
@@ -299,10 +299,10 @@ nv10_rasterizer_state_create(struct pipe_context *pipe,
 		break;
 	}
 
-	if (cso->point_sprite) {
+	if (cso->sprite_coord_enable) {
 		rs->point_sprite = (1 << 0);
 		for (i = 0; i < 8; i++) {
-			if (cso->sprite_coord_mode[i] != PIPE_SPRITE_COORD_NONE)
+			if ((cso->sprite_coord_enable >> i) & 1)
 				rs->point_sprite |= (1 << (8 + i));
 		}
 	} else {
diff --git a/src/gallium/drivers/nv20/nv20_state.c b/src/gallium/drivers/nv20/nv20_state.c
index 3a82e63..3d9a276 100644
--- a/src/gallium/drivers/nv20/nv20_state.c
+++ b/src/gallium/drivers/nv20/nv20_state.c
@@ -292,10 +292,10 @@ nv20_rasterizer_state_create(struct pipe_context *pipe,
 		break;
 	}
 
-	if (cso->point_sprite) {
+	if (cso->sprite_coord_enable) {
 		rs->point_sprite = (1 << 0);
 		for (i = 0; i < 8; i++) {
-			if (cso->sprite_coord_mode[i] != PIPE_SPRITE_COORD_NONE)
+			if ((cso->sprite_coord_enable >> i) & 1)
 				rs->point_sprite |= (1 << (8 + i));
 		}
 	} else {
diff --git a/src/gallium/drivers/nv30/nv30_state.c b/src/gallium/drivers/nv30/nv30_state.c
index a80dfb0..ab9fc52 100644
--- a/src/gallium/drivers/nv30/nv30_state.c
+++ b/src/gallium/drivers/nv30/nv30_state.c
@@ -391,11 +391,11 @@ nv30_rasterizer_state_create(struct pipe_context *pipe,
 	}
 
 	so_method(so, rankine, NV34TCL_POINT_SPRITE, 1);
-	if (cso->point_sprite) {
+	if (cso->sprite_coord_enable) {
 		unsigned psctl = (1 << 0), i;
 
 		for (i = 0; i < 8; i++) {
-			if (cso->sprite_coord_mode[i] != PIPE_SPRITE_COORD_NONE)
+			if ((cso->sprite_coord_enable >> i) & 1)
 				psctl |= (1 << (8 + i));
 		}
 
diff --git a/src/gallium/drivers/nv40/nv40_state.c b/src/gallium/drivers/nv40/nv40_state.c
index ed0ca9e..a5c5e29 100644
--- a/src/gallium/drivers/nv40/nv40_state.c
+++ b/src/gallium/drivers/nv40/nv40_state.c
@@ -401,11 +401,11 @@ nv40_rasterizer_state_create(struct pipe_context *pipe,
 	}
 
 	so_method(so, curie, NV40TCL_POINT_SPRITE, 1);
-	if (cso->point_sprite) {
+	if (cso->sprite_coord_enable) {
 		unsigned psctl = (1 << 0), i;
 
 		for (i = 0; i < 8; i++) {
-			if (cso->sprite_coord_mode[i] != PIPE_SPRITE_COORD_NONE)
+			if ((cso->sprite_coord_enable >> i) & 1)
 				psctl |= (1 << (8 + i));
 		}
 
diff --git a/src/gallium/drivers/nv50/nv50_program.c b/src/gallium/drivers/nv50/nv50_program.c
index e16fa47..593d743 100644
--- a/src/gallium/drivers/nv50/nv50_program.c
+++ b/src/gallium/drivers/nv50/nv50_program.c
@@ -4067,15 +4067,13 @@ nv50_pntc_replace(struct nv50_context *nv50, uint32_t pntc[8], unsigned base)
 		}
 
 		if (j < vp->info.num_outputs) {
-			ubyte mode =
-				nv50->rasterizer->pipe.sprite_coord_mode[si];
+			ubyte enable =
+				 (nv50->rasterizer->pipe.sprite_coord_enable >> si) & 1;
 
-			if (mode == PIPE_SPRITE_COORD_NONE) {
+			if (enable == 0) {
 				m += n;
 				continue;
-			} else
-			if (mode == PIPE_SPRITE_COORD_LOWER_LEFT)
-				origin = 0;
+			}
 		}
 
 		/* this is either PointCoord or replaced by sprite coords */
@@ -4086,7 +4084,7 @@ nv50_pntc_replace(struct nv50_context *nv50, uint32_t pntc[8], unsigned base)
 			++m;
 		}
 	}
-	return origin;
+	return (nv50->rasterizer->pipe.sprite_coord_mode == PIPE_SPRITE_COORD_LOWER_LEFT ? 0 : origin);
 }
 
 static int
@@ -4202,7 +4200,7 @@ nv50_linkage_validate(struct nv50_context *nv50)
 	so_method(so, tesla, NV50TCL_NOPERSPECTIVE_BITMAP(0), 4);
 	so_datap (so, lin, 4);
 
-	if (nv50->rasterizer->pipe.point_sprite) {
+	if (nv50->rasterizer->pipe.sprite_coord_enable) {
 		so_method(so, tesla, NV50TCL_POINT_SPRITE_CTRL, 1);
 		so_data  (so,
 			  nv50_pntc_replace(nv50, pcrd, (reg[4] >> 8) & 0xff));
diff --git a/src/gallium/drivers/nv50/nv50_state.c b/src/gallium/drivers/nv50/nv50_state.c
index 1f67df8..cbe2f34 100644
--- a/src/gallium/drivers/nv50/nv50_state.c
+++ b/src/gallium/drivers/nv50/nv50_state.c
@@ -318,7 +318,7 @@ nv50_rasterizer_state_create(struct pipe_context *pipe,
 	so_data  (so, fui(cso->point_size));
 
 	so_method(so, tesla, NV50TCL_POINT_SPRITE_ENABLE, 1);
-	so_data  (so, cso->point_sprite);
+	so_data  (so, cso->sprite_coord_enable ? 1 : 0);
 
 	so_method(so, tesla, NV50TCL_POLYGON_MODE_FRONT, 3);
 	if (cso->front_winding == PIPE_WINDING_CCW) {
diff --git a/src/gallium/drivers/softpipe/sp_video_context.c b/src/gallium/drivers/softpipe/sp_video_context.c
index cae2d3e..7dde3c1 100644
--- a/src/gallium/drivers/softpipe/sp_video_context.c
+++ b/src/gallium/drivers/softpipe/sp_video_context.c
@@ -167,7 +167,7 @@ init_pipe_state(struct sp_mpeg12_context *ctx)
    rast.scissor = 0;
    rast.poly_smooth = 0;
    rast.poly_stipple_enable = 0;
-   rast.point_sprite = 0;
+   rast.sprite_coord_enable = 0;
    rast.point_size_per_vertex = 0;
    rast.multisample = 0;
    rast.line_smooth = 0;
@@ -181,7 +181,6 @@ init_pipe_state(struct sp_mpeg12_context *ctx)
    rast.point_size = 1;
    rast.offset_units = 1;
    rast.offset_scale = 1;
-   /*rast.sprite_coord_mode[i] = ;*/
    ctx->rast = ctx->pipe->create_rasterizer_state(ctx->pipe, &rast);
    ctx->pipe->bind_rasterizer_state(ctx->pipe, ctx->rast);
 
diff --git a/src/gallium/drivers/svga/svga_pipe_rasterizer.c b/src/gallium/drivers/svga/svga_pipe_rasterizer.c
index b5ecc4c..0a613cb 100644
--- a/src/gallium/drivers/svga/svga_pipe_rasterizer.c
+++ b/src/gallium/drivers/svga/svga_pipe_rasterizer.c
@@ -71,7 +71,7 @@ svga_create_rasterizer_state(struct pipe_context *pipe,
    /* light_twoside          - XXX: need fragment shader varient */
    /* poly_smooth            - XXX: no fallback available */
    /* poly_stipple_enable    - draw module */
-   /* point_sprite           - ? */
+   /* sprite_coord_enable    - ? */
    /* point_size_per_vertex  - ? */
    /* sprite_coord_mode      - ??? */
    /* bypass_vs_viewport_and_clip        - handled by viewport setup */
diff --git a/src/gallium/drivers/trace/tr_dump_state.c b/src/gallium/drivers/trace/tr_dump_state.c
index 0e7b7ec..ed327f6 100644
--- a/src/gallium/drivers/trace/tr_dump_state.c
+++ b/src/gallium/drivers/trace/tr_dump_state.c
@@ -112,7 +112,8 @@ void trace_dump_rasterizer_state(const struct pipe_rasterizer_state *state)
    trace_dump_member(bool, state, poly_smooth);
    trace_dump_member(bool, state, poly_stipple_enable);
    trace_dump_member(bool, state, point_smooth);
-   trace_dump_member(bool, state, point_sprite);
+   trace_dump_member(uint, state, sprite_coord_enable);
+   trace_dump_member(bool, state, sprite_coord_mode);
    trace_dump_member(bool, state, point_size_per_vertex);
    trace_dump_member(bool, state, multisample);
    trace_dump_member(bool, state, line_smooth);
@@ -129,8 +130,6 @@ void trace_dump_rasterizer_state(const struct pipe_rasterizer_state *state)
    trace_dump_member(float, state, offset_units);
    trace_dump_member(float, state, offset_scale);
 
-   trace_dump_member_array(uint, state, sprite_coord_mode);
-
    trace_dump_struct_end();
 }
 
diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
index 35f3830..a85a170 100644
--- a/src/gallium/include/pipe/p_defines.h
+++ b/src/gallium/include/pipe/p_defines.h
@@ -364,9 +364,8 @@ enum pipe_transfer_usage {
 /**
  * Point sprite coord modes
  */
-#define PIPE_SPRITE_COORD_NONE       0
-#define PIPE_SPRITE_COORD_UPPER_LEFT 1
-#define PIPE_SPRITE_COORD_LOWER_LEFT 2
+#define PIPE_SPRITE_COORD_UPPER_LEFT 0
+#define PIPE_SPRITE_COORD_LOWER_LEFT 1
 
 
 /**
diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h
index ea3ec20..50a4cd6 100644
--- a/src/gallium/include/pipe/p_state.h
+++ b/src/gallium/include/pipe/p_state.h
@@ -101,7 +101,8 @@ struct pipe_rasterizer_state
    unsigned poly_smooth:1;
    unsigned poly_stipple_enable:1;
    unsigned point_smooth:1;
-   unsigned point_sprite:1;
+   unsigned sprite_coord_enable:PIPE_MAX_SHADER_OUTPUTS;
+   unsigned sprite_coord_mode:1;     /**< PIPE_SPRITE_COORD_ */
    unsigned point_size_per_vertex:1; /**< size computed in vertex shader */
    unsigned multisample:1;         /* XXX maybe more ms state in future */
    unsigned line_smooth:1;
@@ -143,7 +144,6 @@ struct pipe_rasterizer_state
    float point_size;           /**< used when no per-vertex size */
    float offset_units;
    float offset_scale;
-   ubyte sprite_coord_mode[PIPE_MAX_SHADER_OUTPUTS]; /**< PIPE_SPRITE_COORD_ */
 };
 
 
diff --git a/src/gallium/state_trackers/python/retrace/interpreter.py b/src/gallium/state_trackers/python/retrace/interpreter.py
index a68709f..bb61979 100755
--- a/src/gallium/state_trackers/python/retrace/interpreter.py
+++ b/src/gallium/state_trackers/python/retrace/interpreter.py
@@ -113,7 +113,7 @@ struct_factories = {
 
 
 member_array_factories = {
-    "pipe_rasterizer_state": {"sprite_coord_mode": gallium.ByteArray},                          
+    #"pipe_rasterizer_state": {"sprite_coord_mode": gallium.ByteArray},                          
     "pipe_poly_stipple": {"stipple": gallium.UnsignedArray},                          
     "pipe_viewport_state": {"scale": gallium.FloatArray, "translate": gallium.FloatArray},                          
     #"pipe_clip_state": {"ucp": gallium.FloatArray},
diff --git a/src/mesa/state_tracker/st_atom_rasterizer.c b/src/mesa/state_tracker/st_atom_rasterizer.c
index 710574f..16c842d 100644
--- a/src/mesa/state_tracker/st_atom_rasterizer.c
+++ b/src/mesa/state_tracker/st_atom_rasterizer.c
@@ -188,18 +188,19 @@ static void update_raster_state( struct st_context *st )
     */
    raster->point_size = ctx->Point.Size;
 
-   raster->point_smooth = ctx->Point.SmoothFlag;
-   raster->point_sprite = ctx->Point.PointSprite;
-   for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
-      if (ctx->Point.CoordReplace[i]) {
-         if ((ctx->Point.SpriteOrigin == GL_UPPER_LEFT) ^
-             (st_fb_orientation(ctx->DrawBuffer) == Y_0_BOTTOM))
-            raster->sprite_coord_mode[i] = PIPE_SPRITE_COORD_UPPER_LEFT;
-         else 
-            raster->sprite_coord_mode[i] = PIPE_SPRITE_COORD_LOWER_LEFT;
-      }
-      else {
-         raster->sprite_coord_mode[i] = PIPE_SPRITE_COORD_NONE;
+   if (!ctx->Point.PointSprite && ctx->Point.SmoothFlag)
+      raster->point_smooth = 1;
+
+   if (ctx->Point.PointSprite) {
+      if ((ctx->Point.SpriteOrigin == GL_UPPER_LEFT) ^
+          (st_fb_orientation(ctx->DrawBuffer) == Y_0_BOTTOM))
+         raster->sprite_coord_mode = PIPE_SPRITE_COORD_UPPER_LEFT;
+      else 
+         raster->sprite_coord_mode = PIPE_SPRITE_COORD_LOWER_LEFT;
+      for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
+         if (ctx->Point.CoordReplace[i]) {
+            raster->sprite_coord_enable |= 1 << i;
+         }
       }
    }
 




More information about the mesa-commit mailing list