summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/svga/svga_draw_arrays.c5
-rw-r--r--src/gallium/drivers/svga/svga_draw_private.h32
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;
}
}