gallium/util: Add u_stream_outputs_for_vertices helper
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 8 Aug 2019 21:27:41 +0000 (14:27 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 12 Aug 2019 19:22:54 +0000 (12:22 -0700)
This u_prim.h helper determines the number of outputs for stream output,
given a particular primitive type and a vertex count. This is useful for
statically calculating sizes of stream output buffers (i.e. when there
is no geometry/tessellation shader in use).

This helper will be used in Panfrost's transform feedback
implementation, as you can probably guess since why else would I be
submitting it....

See also dEQP's getTransformFeedbackOutputCount routine.

v2: Simplify definition using new helpers, which also extends to non-ES2
primitive types (Eric).

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/gallium/auxiliary/util/u_prim.h

index ae05788702c278ab63d0ab7c94a83d0562dc4601..d80e235ffd9f4ef4e18a8240671aa3bdb286a16c 100644 (file)
@@ -327,6 +327,25 @@ u_vertices_for_prims(enum pipe_prim_type prim_type, int count)
    return info->min + (count - 1) * info->incr;
 }
 
+/**
+ * Returns the number of stream out outputs for a given number of vertices and
+ * primitive type.
+ */
+
+static inline unsigned
+u_stream_outputs_for_vertices(enum pipe_prim_type primitive, unsigned nr)
+{
+   /* Extraneous vertices don't contribute to stream outputs */
+   u_trim_pipe_prim(primitive, &nr);
+
+   /* Consider how many primitives are actually generated */
+   unsigned prims = u_decomposed_prims_for_vertices(primitive, nr);
+
+   /* One output per vertex after decomposition */
+   enum pipe_prim_type base = u_base_prim_type(primitive);
+   return u_vertices_for_prims(base, prims);
+}
+
 const char *u_prim_name(enum pipe_prim_type pipe_prim);