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;
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
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.
}
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++) {
}
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++) {
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) {
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;
/* 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 */
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);
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;
if (ctx->Polygon.StippleFlag)
raster->poly_stipple_enable = 1;
-
+
/* _NEW_POINT
*/
raster->point_size = ctx->Point.Size;
raster->sprite_coord_enable |= 1 << i;
}
}
+ raster->point_quad_rasterization = 1;
}
/* ST_NEW_VERTEX_PROGRAM