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,
&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,
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) |
(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;
}
}