gallium: replace draw_convert_wide_points() with draw_wide_point_threshold()
authorBrian <brian@poulsbo.localnet.net>
Tue, 26 Feb 2008 21:29:35 +0000 (14:29 -0700)
committerBrian <brian@poulsbo.localnet.net>
Tue, 26 Feb 2008 21:32:57 +0000 (14:32 -0700)
Specifying a threshold size is a bit more flexible, and allows the option
of converting even 1-pixel points to triangles (set threshold=0).

Also, remove 0.25 pixel bias in wide_point().

src/gallium/auxiliary/draw/draw_context.c
src/gallium/auxiliary/draw/draw_private.h
src/gallium/auxiliary/draw/draw_validate.c
src/gallium/auxiliary/draw/draw_wide_prims.c
src/gallium/drivers/softpipe/sp_context.c

index 7dd1c6f..48f0094 100644 (file)
@@ -80,7 +80,7 @@ struct draw_context *draw_create( void )
 
    draw->shader_queue_flush = draw_vertex_shader_queue_flush;
 
-   draw->convert_wide_points = TRUE;
+   draw->wide_point_threshold = 1000000.0; /* infinity */
    draw->convert_wide_lines = TRUE;
 
    draw->reduced_prim = ~0; /* != any of PIPE_PRIM_x */
@@ -220,14 +220,14 @@ draw_set_mapped_constant_buffer(struct draw_context *draw,
 
 
 /**
- * Tells the draw module whether to convert wide points (size != 1)
- * into triangles.
+ * Tells the draw module to draw points with triangles if their size
+ * is greater than this threshold.
  */
 void
-draw_convert_wide_points(struct draw_context *draw, boolean enable)
+draw_wide_point_threshold(struct draw_context *draw, float threshold)
 {
    draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
-   draw->convert_wide_points = enable;
+   draw->wide_point_threshold = threshold;
 }
 
 
index 6abced1..03e3d3a 100644 (file)
@@ -215,7 +215,7 @@ struct draw_context
    float plane[12][4];
    unsigned nr_planes;
 
-   boolean convert_wide_points; /**< convert wide points to tris? */
+   float wide_point_threshold; /**< convert pnts to tris if larger than this */
    boolean convert_wide_lines;  /**< convert wide lines to tris? */
    boolean use_sse;
 
index 3a19dd4..ded7d10 100644 (file)
@@ -52,6 +52,19 @@ static struct draw_stage *validate_pipeline( struct draw_stage *stage )
     */
    stage->next = next;
 
+   /* drawing wide lines? */
+   wide_lines = (draw->rasterizer->line_width != 1.0
+                 && draw->convert_wide_lines
+                 && !draw->rasterizer->line_smooth);
+
+   /* drawing large points? */
+   if (draw->rasterizer->point_smooth && draw->pipeline.aapoint)
+      wide_points = FALSE;
+   else if (draw->rasterizer->point_size > draw->wide_point_threshold)
+      wide_points = TRUE;
+   else
+      wide_points = FALSE;
+
    /*
     * NOTE: we build up the pipeline in end-to-start order.
     *
@@ -69,16 +82,6 @@ static struct draw_stage *validate_pipeline( struct draw_stage *stage )
       next = draw->pipeline.aapoint;
    }
 
-   /* drawing wide lines? */
-   wide_lines = (draw->rasterizer->line_width != 1.0
-                 && draw->convert_wide_lines
-                 && !draw->rasterizer->line_smooth);
-
-   /* drawing large points? */
-   wide_points = (draw->rasterizer->point_size != 1.0
-                  && draw->convert_wide_points
-                  && !draw->pipeline.aapoint);
-   
    if (wide_lines ||
        wide_points ||
        draw->rasterizer->point_sprite) {
index 1f8069b..d967810 100644 (file)
@@ -219,8 +219,8 @@ static void wide_point( struct draw_stage *stage,
       half_size = wide->half_point_size;
    }
 
-   left_adj = -half_size + 0.25f;
-   right_adj = half_size + 0.25f;
+   left_adj = -half_size; /* + 0.25f;*/
+   right_adj = half_size; /* + 0.25f;*/
 
    pos0[0] += left_adj;
    pos0[1] -= half_size;
@@ -266,7 +266,8 @@ static void wide_first_point( struct draw_stage *stage,
 
    wide->half_point_size = 0.5f * draw->rasterizer->point_size;
 
-   if (draw->rasterizer->point_size != 1.0) {
+   /* XXX we won't know the real size if it's computed by the vertex shader! */
+   if (draw->rasterizer->point_size > draw->wide_point_threshold) {
       stage->point = wide_point;
    }
    else {
index 2cdf3c7..6a88432 100644 (file)
@@ -337,9 +337,6 @@ struct pipe_context *softpipe_create( struct pipe_winsys *pipe_winsys,
    draw_install_pstipple_stage(softpipe->draw, &softpipe->pipe);
 #endif
 
-   /* sp_prim_setup can do wide points (don't convert to quads) */
-   draw_convert_wide_points(softpipe->draw, FALSE);
-
    sp_init_surface_functions(softpipe);
 
    return &softpipe->pipe;