svga: set POINTSIZEMIN to 1.0 for non-sprite non-aa points
authorMarek Olšák <maraeo@gmail.com>
Fri, 27 Jan 2012 19:29:15 +0000 (20:29 +0100)
committerMarek Olšák <maraeo@gmail.com>
Mon, 30 Jan 2012 23:54:34 +0000 (00:54 +0100)
v2: add the helper function, improve the condition

src/gallium/auxiliary/util/u_inlines.h
src/gallium/drivers/svga/svga_state_rss.c

index 9660cdc6eaeedebac1216b9d632e75075f99960a..c90dc57073f3e5f1b9cc407c73ca38af1687bef9 100644 (file)
@@ -461,6 +461,17 @@ static INLINE void util_copy_vertex_buffers(struct pipe_vertex_buffer *dst,
    memcpy(dst, src, src_count * sizeof(struct pipe_vertex_buffer));
 }
 
+static INLINE float
+util_get_min_point_size(const struct pipe_rasterizer_state *state)
+{
+   /* The point size should be clamped to this value at the rasterizer stage.
+    */
+   return state->gl_rasterization_rules &&
+          !state->point_quad_rasterization &&
+          !state->point_smooth &&
+          !state->multisample ? 1.0f : 0.0f;
+}
+
 #ifdef __cplusplus
 }
 #endif
index af68d9cde3d76fe2489653e1de539f50f6de3f2a..1ee8b7f49b11ef7fde1d88f1e52dbedf18cce905 100644 (file)
@@ -78,6 +78,7 @@ static int emit_rss( struct svga_context *svga,
                      unsigned dirty )
 {
    struct rs_queue queue;
+   float point_size_min;
 
    queue.rs_count = 0;
 
@@ -211,14 +212,15 @@ static int emit_rss( struct svga_context *svga,
       if (svga->state.sw.need_pipeline)
          cullmode = SVGA3D_FACE_NONE;
 
+      point_size_min = util_get_min_point_size(&curr->templ);
+
       EMIT_RS( svga, cullmode, CULLMODE, fail );
       EMIT_RS( svga, curr->scissortestenable, SCISSORTESTENABLE, fail );
       EMIT_RS( svga, curr->multisampleantialias, MULTISAMPLEANTIALIAS, fail );
       EMIT_RS( svga, curr->lastpixel, LASTPIXEL, fail );
       EMIT_RS( svga, curr->linepattern, LINEPATTERN, fail );
       EMIT_RS_FLOAT( svga, curr->pointsize, POINTSIZE, fail );
-      /* XXX still need to set this? */
-      EMIT_RS_FLOAT( svga, 0.0, POINTSIZEMIN, fail );
+      EMIT_RS_FLOAT( svga, point_size_min, POINTSIZEMIN, fail );
       EMIT_RS_FLOAT( svga, SVGA_MAX_POINTSIZE, POINTSIZEMAX, fail );
       EMIT_RS( svga, curr->pointsprite, POINTSPRITEENABLE, fail);
    }