gallium: add point_quad_rasterization bit to rasterizer state

This determines if points should be rasterized according to GL point rules
or as normal quads (GL point sprites / d3d points / d3d point sprites).
This commit is contained in:
Roland Scheidegger 2010-02-04 21:35:28 +01:00
parent 2c326e7266
commit 68f93ea3eb
10 changed files with 22 additions and 6 deletions

View File

@ -128,6 +128,7 @@ static void set_texcoords(const struct widepoint_stage *wide,
static void widepoint_point( struct draw_stage *stage,
struct prim_header *header )
{
/* XXX should take point_quad_rasterization into account? */
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->sprite_coord_enable;

View File

@ -85,8 +85,10 @@ point_size
sprite_coord_enable
Specifies if a coord has its texture coordinates replaced or not. This
is a packed bitfield containing the enable for all coords - if all are 0
point sprites are effectively disabled. If any coord is non-zero,
point_smooth should be disabled.
point sprites are effectively disabled, though points may still be
rendered slightly different according to point_quad_rasterization.
If any coord is non-zero, point_smooth should be disabled, and
point_quad_rasterization enabled.
If enabled, the four vertices of the resulting quad will be assigned
texture coordinates, according to sprite_coord_mode.
sprite_coord_mode
@ -103,6 +105,14 @@ sprite_coord_mode
Note that when geometry shaders are available, this state could be
removed. A special geometry shader defined by the state tracker could
convert the incoming points into quads with the proper texture coords.
point_quad_rasterization
This determines if points should be rasterized as quads or points.
d3d always uses quad rasterization for points, regardless if point sprites
are enabled or not, but OGL has different rules. If point_quad_rasterization
is set, point_smooth should be disabled, and points will be rendered as
squares even if multisample is enabled.
sprite_coord_enable should be zero if point_quad_rasterization is not
enabled.
scissor
Whether the scissor test is enabled.

View File

@ -391,7 +391,7 @@ nv30_rasterizer_state_create(struct pipe_context *pipe,
}
so_method(so, rankine, NV34TCL_POINT_SPRITE, 1);
if (cso->sprite_coord_enable) {
if (cso->point_quad_rasterization) {
unsigned psctl = (1 << 0), i;
for (i = 0; i < 8; i++) {

View File

@ -401,7 +401,7 @@ nv40_rasterizer_state_create(struct pipe_context *pipe,
}
so_method(so, curie, NV40TCL_POINT_SPRITE, 1);
if (cso->sprite_coord_enable) {
if (cso->point_quad_rasterization) {
unsigned psctl = (1 << 0), i;
for (i = 0; i < 8; i++) {

View File

@ -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->sprite_coord_enable ? 1 : 0);
so_data (so, cso->point_quad_rasterization ? 1 : 0);
so_method(so, tesla, NV50TCL_POLYGON_MODE_FRONT, 3);
if (cso->front_winding == PIPE_WINDING_CCW) {

View File

@ -178,6 +178,7 @@ init_pipe_state(struct sp_mpeg12_context *ctx)
rast.bypass_vs_clip_and_viewport = 0;
rast.line_width = 1;
rast.point_smooth = 0;
rast.point_quad_rasterization = 0;
rast.point_size = 1;
rast.offset_units = 1;
rast.offset_scale = 1;

View File

@ -72,6 +72,7 @@ svga_create_rasterizer_state(struct pipe_context *pipe,
/* poly_smooth - XXX: no fallback available */
/* poly_stipple_enable - draw module */
/* sprite_coord_enable - ? */
/* point_quad_rasterization - ? */
/* point_size_per_vertex - ? */
/* sprite_coord_mode - ??? */
/* bypass_vs_viewport_and_clip - handled by viewport setup */

View File

@ -114,6 +114,7 @@ void trace_dump_rasterizer_state(const struct pipe_rasterizer_state *state)
trace_dump_member(bool, state, point_smooth);
trace_dump_member(uint, state, sprite_coord_enable);
trace_dump_member(bool, state, sprite_coord_mode);
trace_dump_member(bool, state, point_quad_rasterization);
trace_dump_member(bool, state, point_size_per_vertex);
trace_dump_member(bool, state, multisample);
trace_dump_member(bool, state, line_smooth);

View File

@ -103,6 +103,7 @@ struct pipe_rasterizer_state
unsigned point_smooth:1;
unsigned sprite_coord_enable:PIPE_MAX_SHADER_OUTPUTS;
unsigned sprite_coord_mode:1; /**< PIPE_SPRITE_COORD_ */
unsigned point_quad_rasterization:1; /** points rasterized as quads or points */
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;

View File

@ -183,7 +183,7 @@ static void update_raster_state( struct st_context *st )
if (ctx->Polygon.StippleFlag)
raster->poly_stipple_enable = 1;
/* _NEW_POINT
*/
raster->point_size = ctx->Point.Size;
@ -202,6 +202,7 @@ static void update_raster_state( struct st_context *st )
raster->sprite_coord_enable |= 1 << i;
}
}
raster->point_quad_rasterization = 1;
}
/* ST_NEW_VERTEX_PROGRAM