diff options
Diffstat (limited to 'src/gallium/drivers/svga')
-rw-r--r-- | src/gallium/drivers/svga/svga_draw_arrays.c | 5 | ||||
-rw-r--r-- | src/gallium/drivers/svga/svga_draw_private.h | 32 |
2 files changed, 26 insertions, 11 deletions
diff --git a/src/gallium/drivers/svga/svga_draw_arrays.c b/src/gallium/drivers/svga/svga_draw_arrays.c index a506371c599..7adefd0c38c 100644 --- a/src/gallium/drivers/svga/svga_draw_arrays.c +++ b/src/gallium/drivers/svga/svga_draw_arrays.c @@ -225,6 +225,7 @@ svga_hwtnl_draw_arrays( struct svga_hwtnl *hwtnl, if (hwtnl->api_fillmode != PIPE_POLYGON_MODE_FILL && prim >= PIPE_PRIM_TRIANGLES) { + /* Convert unfilled polygons into points, lines, triangles */ gen_type = u_unfilled_generator( prim, start, count, @@ -235,6 +236,10 @@ svga_hwtnl_draw_arrays( struct svga_hwtnl *hwtnl, &gen_func ); } else { + /* Convert PIPE_PRIM_LINE_LOOP to PIPE_PRIM_LINESTRIP, + * convert PIPE_PRIM_POLYGON to PIPE_PRIM_TRIANGLE_FAN, + * etc, if needed (as determined by svga_hw_prims mask). + */ gen_type = u_index_generator( svga_hw_prims, prim, start, diff --git a/src/gallium/drivers/svga/svga_draw_private.h b/src/gallium/drivers/svga/svga_draw_private.h index 8126f7ee23c..1b054038e9f 100644 --- a/src/gallium/drivers/svga/svga_draw_private.h +++ b/src/gallium/drivers/svga/svga_draw_private.h @@ -35,7 +35,10 @@ struct svga_context; struct u_upload_mgr; -/* Should include polygon? +/** + * Mask indicating which types of gallium primitives are actually + * handled by the svga device. Other types will be converted to + * these types by the index/translation code. */ static const unsigned svga_hw_prims = ((1 << PIPE_PRIM_POINTS) | @@ -46,38 +49,45 @@ static const unsigned svga_hw_prims = (1 << PIPE_PRIM_TRIANGLE_FAN)); -static INLINE unsigned svga_translate_prim(unsigned mode, - unsigned count, - unsigned *out_count) +/** + * Translate a gallium PIPE_PRIM_x value to an SVGA3D_PRIMITIVE_x value. + * Also, compute the number of primitives that'll be drawn given a + * vertex count. + * Note that this function doesn't have to handle PIPE_PRIM_LINE_LOOP, + * PIPE_PRIM_QUADS, PIPE_PRIM_QUAD_STRIP or PIPE_PRIM_POLYGON. We convert + * those to other types of primitives with index/translation code. + */ +static INLINE unsigned +svga_translate_prim(unsigned mode, unsigned vcount,unsigned *prim_count) { switch (mode) { case PIPE_PRIM_POINTS: - *out_count = count; + *prim_count = vcount; return SVGA3D_PRIMITIVE_POINTLIST; case PIPE_PRIM_LINES: - *out_count = count / 2; + *prim_count = vcount / 2; return SVGA3D_PRIMITIVE_LINELIST; case PIPE_PRIM_LINE_STRIP: - *out_count = count - 1; + *prim_count = vcount - 1; return SVGA3D_PRIMITIVE_LINESTRIP; case PIPE_PRIM_TRIANGLES: - *out_count = count / 3; + *prim_count = vcount / 3; return SVGA3D_PRIMITIVE_TRIANGLELIST; case PIPE_PRIM_TRIANGLE_STRIP: - *out_count = count - 2; + *prim_count = vcount - 2; return SVGA3D_PRIMITIVE_TRIANGLESTRIP; case PIPE_PRIM_TRIANGLE_FAN: - *out_count = count - 2; + *prim_count = vcount - 2; return SVGA3D_PRIMITIVE_TRIANGLEFAN; default: assert(0); - *out_count = 0; + *prim_count = 0; return 0; } } |