summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorRoland Scheidegger <[email protected]>2010-02-03 17:25:14 +0100
committerRoland Scheidegger <[email protected]>2010-02-03 17:25:14 +0100
commit4a4daa75a85db22cd37ebd533ebbccb427e07077 (patch)
tree981d728824666f3c19995ce54e05a511c1fdd690 /src/gallium/drivers
parenta407636efb6c32cee81b9a1525dbc804aacd957b (diff)
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).
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/i965/brw_sf.c17
-rw-r--r--src/gallium/drivers/i965/brw_sf_state.c2
-rw-r--r--src/gallium/drivers/nv10/nv10_state.c4
-rw-r--r--src/gallium/drivers/nv20/nv20_state.c4
-rw-r--r--src/gallium/drivers/nv30/nv30_state.c4
-rw-r--r--src/gallium/drivers/nv40/nv40_state.c4
-rw-r--r--src/gallium/drivers/nv50/nv50_program.c14
-rw-r--r--src/gallium/drivers/nv50/nv50_state.c2
-rw-r--r--src/gallium/drivers/softpipe/sp_video_context.c3
-rw-r--r--src/gallium/drivers/svga/svga_pipe_rasterizer.c2
-rw-r--r--src/gallium/drivers/trace/tr_dump_state.c5
11 files changed, 29 insertions, 32 deletions
diff --git a/src/gallium/drivers/i965/brw_sf.c b/src/gallium/drivers/i965/brw_sf.c
index e1986a9dbbd..fc3102b5318 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 663a688772c..0ad91e03072 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 ffc6be3c401..6f674d6e13f 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 3a82e63423d..3d9a276fa12 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 a80dfb04880..ab9fc5293c8 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 ed0ca9e02c3..a5c5e291f3e 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 e16fa479e5f..593d7436037 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 1f67df814b1..cbe2f349c2b 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 cae2d3efc58..7dde3c13301 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 b5ecc4c56ca..0a613cb553d 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 0e7b7ec123f..ed327f60f08 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();
}