Sketch out per-vertex point size.
authorBrian <brian.paul@tungstengraphics.com>
Thu, 30 Aug 2007 17:08:03 +0000 (11:08 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Thu, 30 Aug 2007 20:43:08 +0000 (14:43 -0600)
The code is all in place, but mostly disabled for now:
In t_vp_build.c, write the VERT_RESULT_PSIZE register
In sp_state_derived.c, need to emit vertex point size if drawing points.
In setup_point() use the point size from the vertex.

src/mesa/pipe/draw/draw_twoside.c
src/mesa/pipe/softpipe/sp_prim_setup.c
src/mesa/pipe/softpipe/sp_state_derived.c
src/mesa/tnl/t_vp_build.c

index 5a7697d5f81a5310e703dbc1df12f7cdb43bd915..a05eea41fc221159bb6a76711d35b069700b3ca6 100644 (file)
@@ -36,7 +36,7 @@
 struct twoside_stage {
    struct draw_stage stage;
    float sign;         /**< +1 or -1 */
-   const unsigned *lookup;
+   const unsigned *lookup;   /**< vertex attribute positions */
 };
 
 
index c2a5a7907ddaa14beb61a9591bd3c83c7d7878d8..a7e1c9e017ac5a208a03826ff711efbcdd02dcf7 100644 (file)
@@ -79,6 +79,8 @@ struct setup_stage {
 
    float oneoverarea;
 
+   const unsigned *lookup;  /**< vertex attribute positions */
+
    struct tgsi_interp_coef coef[TGSI_ATTRIB_MAX];
    struct quad_header quad; 
 
@@ -884,10 +886,13 @@ static void
 setup_point(struct draw_stage *stage, struct prim_header *prim)
 {
    struct setup_stage *setup = setup_stage( stage );
-   /*XXX this should be a vertex attrib! */
-   const float halfSize = 0.5f * setup->softpipe->setup.point_size;
-   const boolean round = setup->softpipe->setup.point_smooth;
    const struct vertex_header *v0 = prim->v[0];
+
+   const int sizeAttr = setup->lookup[TGSI_ATTRIB_POINTSIZE];
+   const float halfSize
+      = sizeAttr ? (0.5f * v0->data[sizeAttr][0])
+        : (0.5f * setup->softpipe->setup.point_size);
+   const boolean round = setup->softpipe->setup.point_smooth;
    const float x = v0->data[TGSI_ATTRIB_POS][0];
    const float y = v0->data[TGSI_ATTRIB_POS][1];
    unsigned slot, j;
@@ -1072,5 +1077,7 @@ struct draw_stage *sp_draw_render_stage( struct softpipe_context *softpipe )
 
    setup->quad.coef = setup->coef;
 
+   setup->lookup = softpipe->draw->vertex_info.attrib_to_slot;
+
    return &setup->stage;
 }
index b0d79eeddaf1c30930e1655c979f4c96c87706a0..3bbe9c9fd9dae14ae424f90e9bd2f61f5b2d7848 100644 (file)
@@ -102,6 +102,12 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
       emit_vertex_attr(vinfo, TGSI_ATTRIB_FOG, FORMAT_1F, INTERP_PERSPECTIVE);
    }
 
+   /* point size */
+#if 0
+   /* XXX only emit if drawing points or front/back polygon mode is point mode */
+   emit_vertex_attr(vinfo, TGSI_ATTRIB_POINTSIZE, FORMAT_4F, INTERP_CONSTANT);
+#endif
+
    /* texcoords and varying vars */
    for (i = TGSI_ATTRIB_TEX0; i < TGSI_ATTRIB_VAR7; i++) {
       if (inputsRead & (1 << i)) {
index eb5e176895e38bc74783c36c70ba7de20ad1e681..f923b8e13264494c409c87af210e365742ce014c 100644 (file)
@@ -1364,6 +1364,16 @@ static void build_pointsize( struct tnl_program *p )
    release_temp(p, ut);
 }
 
+/**
+ * Emit constant point size.
+ */
+static void constant_pointsize( struct tnl_program *p )
+{
+   struct ureg state_size = register_param1(p, STATE_POINT_SIZE);
+   struct ureg out = register_output(p, VERT_RESULT_PSIZ);
+   emit_op1(p, OPCODE_MOV, out, WRITEMASK_X, state_size);
+}
+
 static void build_tnl_program( struct tnl_program *p )
 {   /* Emit the program, starting with modelviewproject:
     */
@@ -1392,6 +1402,10 @@ static void build_tnl_program( struct tnl_program *p )
 
    if (p->state->point_attenuated)
       build_pointsize(p);
+#if 0
+   else
+      constant_pointsize(p);
+#endif
 
    /* Finish up:
     */