gallium: add point_quad_rasterization bit to rasterizer state
authorRoland Scheidegger <sroland@vmware.com>
Thu, 4 Feb 2010 20:35:28 +0000 (21:35 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Thu, 4 Feb 2010 20:35:28 +0000 (21:35 +0100)
This determines if points should be rasterized according to GL point rules
or as normal quads (GL point sprites / d3d points / d3d point sprites).

src/gallium/auxiliary/draw/draw_pipe_wide_point.c
src/gallium/docs/source/cso/rasterizer.rst
src/gallium/drivers/nv30/nv30_state.c
src/gallium/drivers/nv40/nv40_state.c
src/gallium/drivers/nv50/nv50_state.c
src/gallium/drivers/softpipe/sp_video_context.c
src/gallium/drivers/svga/svga_pipe_rasterizer.c
src/gallium/drivers/trace/tr_dump_state.c
src/gallium/include/pipe/p_state.h
src/mesa/state_tracker/st_atom_rasterizer.c

index d9d4d2a8b67d8fbb88896116f58fdde283bb1c55..fdabce7d443d11a57347f4778ecc4e10f7614c6a 100644 (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;
index 721229d67d36afcd5ddcfc50ccb1747537966913..00d65fc598a844582c77bb9e9a354412b5eb8b8b 100644 (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.
index ab9fc5293c868a6b901426131fd315cbd067c03b..66096de61e8af2bfb210eaf81ae60c6d37a640a9 100644 (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++) {
index a5c5e291f3e49f547d66b7a5e7e5d0d36408bb8b..5084c48eeb442144df31980ca80fb713bf9a9de7 100644 (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++) {
index cbe2f349c2bd062a7d2a79af58aeb627694ea038..f19a21d5cc49a433a5f6598950c244dcce69e3de 100644 (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) {
index 7dde3c1330107cf6564ef892afc3d1b96385361c..cfa2a0b2f10d2becd47a15a2e88d7c9dc95ee239 100644 (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;
index 0a613cb553dc9316c8c521890ddcc45fe629b722..09ccb718840a71b4f167abbd6250e6cc75915f7c 100644 (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 */
index ed327f60f08e39ec00c055caf3217e98c827e05f..720b6cd1ffa938b428b49d77ba04d85760be5fda 100644 (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);
index 50a4cd6e138dfcfe32763a6dfd9c0b86f94e8a8e..4387b92be202dc64129904f09fdccbb041c331bb 100644 (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;
index 16c842d2f695904d3ba586b0ce51266c364fa7c3..9c9a99bcfc6f0a68305b6daf96578fd408275564 100644 (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