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:
parent
2c326e7266
commit
68f93ea3eb
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue