svga: add some comments about primitive conversion

And clean up the svga_translate_prim() function with better
variable names.

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
This commit is contained in:
Brian Paul 2013-06-19 10:39:43 -06:00
parent 8b3d4efed8
commit 1e16e48f88
2 changed files with 26 additions and 11 deletions

View file

@ -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,

View file

@ -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;
}
}