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:
@@ -128,6 +128,7 @@ static void set_texcoords(const struct widepoint_stage *wide,
|
|||||||
static void widepoint_point( struct draw_stage *stage,
|
static void widepoint_point( struct draw_stage *stage,
|
||||||
struct prim_header *header )
|
struct prim_header *header )
|
||||||
{
|
{
|
||||||
|
/* XXX should take point_quad_rasterization into account? */
|
||||||
const struct widepoint_stage *wide = widepoint_stage(stage);
|
const struct widepoint_stage *wide = widepoint_stage(stage);
|
||||||
const unsigned pos = draw_current_shader_position_output(stage->draw);
|
const unsigned pos = draw_current_shader_position_output(stage->draw);
|
||||||
const boolean sprite = (boolean) stage->draw->rasterizer->sprite_coord_enable;
|
const boolean sprite = (boolean) stage->draw->rasterizer->sprite_coord_enable;
|
||||||
|
@@ -85,8 +85,10 @@ point_size
|
|||||||
sprite_coord_enable
|
sprite_coord_enable
|
||||||
Specifies if a coord has its texture coordinates replaced or not. This
|
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
|
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 sprites are effectively disabled, though points may still be
|
||||||
point_smooth should be disabled.
|
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
|
If enabled, the four vertices of the resulting quad will be assigned
|
||||||
texture coordinates, according to sprite_coord_mode.
|
texture coordinates, according to sprite_coord_mode.
|
||||||
sprite_coord_mode
|
sprite_coord_mode
|
||||||
@@ -103,6 +105,14 @@ sprite_coord_mode
|
|||||||
Note that when geometry shaders are available, this state could be
|
Note that when geometry shaders are available, this state could be
|
||||||
removed. A special geometry shader defined by the state tracker could
|
removed. A special geometry shader defined by the state tracker could
|
||||||
convert the incoming points into quads with the proper texture coords.
|
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
|
scissor
|
||||||
Whether the scissor test is enabled.
|
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);
|
so_method(so, rankine, NV34TCL_POINT_SPRITE, 1);
|
||||||
if (cso->sprite_coord_enable) {
|
if (cso->point_quad_rasterization) {
|
||||||
unsigned psctl = (1 << 0), i;
|
unsigned psctl = (1 << 0), i;
|
||||||
|
|
||||||
for (i = 0; i < 8; 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);
|
so_method(so, curie, NV40TCL_POINT_SPRITE, 1);
|
||||||
if (cso->sprite_coord_enable) {
|
if (cso->point_quad_rasterization) {
|
||||||
unsigned psctl = (1 << 0), i;
|
unsigned psctl = (1 << 0), i;
|
||||||
|
|
||||||
for (i = 0; i < 8; 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_data (so, fui(cso->point_size));
|
||||||
|
|
||||||
so_method(so, tesla, NV50TCL_POINT_SPRITE_ENABLE, 1);
|
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);
|
so_method(so, tesla, NV50TCL_POLYGON_MODE_FRONT, 3);
|
||||||
if (cso->front_winding == PIPE_WINDING_CCW) {
|
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.bypass_vs_clip_and_viewport = 0;
|
||||||
rast.line_width = 1;
|
rast.line_width = 1;
|
||||||
rast.point_smooth = 0;
|
rast.point_smooth = 0;
|
||||||
|
rast.point_quad_rasterization = 0;
|
||||||
rast.point_size = 1;
|
rast.point_size = 1;
|
||||||
rast.offset_units = 1;
|
rast.offset_units = 1;
|
||||||
rast.offset_scale = 1;
|
rast.offset_scale = 1;
|
||||||
|
@@ -72,6 +72,7 @@ svga_create_rasterizer_state(struct pipe_context *pipe,
|
|||||||
/* poly_smooth - XXX: no fallback available */
|
/* poly_smooth - XXX: no fallback available */
|
||||||
/* poly_stipple_enable - draw module */
|
/* poly_stipple_enable - draw module */
|
||||||
/* sprite_coord_enable - ? */
|
/* sprite_coord_enable - ? */
|
||||||
|
/* point_quad_rasterization - ? */
|
||||||
/* point_size_per_vertex - ? */
|
/* point_size_per_vertex - ? */
|
||||||
/* sprite_coord_mode - ??? */
|
/* sprite_coord_mode - ??? */
|
||||||
/* bypass_vs_viewport_and_clip - handled by viewport setup */
|
/* 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(bool, state, point_smooth);
|
||||||
trace_dump_member(uint, state, sprite_coord_enable);
|
trace_dump_member(uint, state, sprite_coord_enable);
|
||||||
trace_dump_member(bool, state, sprite_coord_mode);
|
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, point_size_per_vertex);
|
||||||
trace_dump_member(bool, state, multisample);
|
trace_dump_member(bool, state, multisample);
|
||||||
trace_dump_member(bool, state, line_smooth);
|
trace_dump_member(bool, state, line_smooth);
|
||||||
|
@@ -103,6 +103,7 @@ struct pipe_rasterizer_state
|
|||||||
unsigned point_smooth:1;
|
unsigned point_smooth:1;
|
||||||
unsigned sprite_coord_enable:PIPE_MAX_SHADER_OUTPUTS;
|
unsigned sprite_coord_enable:PIPE_MAX_SHADER_OUTPUTS;
|
||||||
unsigned sprite_coord_mode:1; /**< PIPE_SPRITE_COORD_ */
|
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 point_size_per_vertex:1; /**< size computed in vertex shader */
|
||||||
unsigned multisample:1; /* XXX maybe more ms state in future */
|
unsigned multisample:1; /* XXX maybe more ms state in future */
|
||||||
unsigned line_smooth:1;
|
unsigned line_smooth:1;
|
||||||
|
@@ -202,6 +202,7 @@ static void update_raster_state( struct st_context *st )
|
|||||||
raster->sprite_coord_enable |= 1 << i;
|
raster->sprite_coord_enable |= 1 << i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
raster->point_quad_rasterization = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ST_NEW_VERTEX_PROGRAM
|
/* ST_NEW_VERTEX_PROGRAM
|
||||||
|
Reference in New Issue
Block a user