gallium/util: add a helper to compute vertex count from primitive count

v2:
  - Only compute vertex counts for base primitives.
  - Add a unit test (Eric)

Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
Iago Toral Quiroga
2019-08-01 11:56:29 +02:00
parent 9eb8699e0f
commit cf8986bce0
3 changed files with 91 additions and 1 deletions
+44
View File
@@ -283,6 +283,50 @@ u_reduced_prims_for_vertices(enum pipe_prim_type primitive, int vertices)
}
}
static inline enum pipe_prim_type
u_base_prim_type(enum pipe_prim_type prim_type)
{
switch(prim_type) {
case PIPE_PRIM_POINTS:
return PIPE_PRIM_POINTS;
case PIPE_PRIM_LINES:
case PIPE_PRIM_LINE_LOOP:
case PIPE_PRIM_LINE_STRIP:
case PIPE_PRIM_LINES_ADJACENCY:
case PIPE_PRIM_LINE_STRIP_ADJACENCY:
return PIPE_PRIM_LINES;
case PIPE_PRIM_TRIANGLES:
case PIPE_PRIM_TRIANGLE_STRIP:
case PIPE_PRIM_TRIANGLE_FAN:
case PIPE_PRIM_TRIANGLES_ADJACENCY:
case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
return PIPE_PRIM_TRIANGLES;
case PIPE_PRIM_QUADS:
case PIPE_PRIM_QUAD_STRIP:
return PIPE_PRIM_QUADS;
default:
return prim_type;
}
}
static inline unsigned
u_vertices_for_prims(enum pipe_prim_type prim_type, int count)
{
if (count <= 0)
return 0;
/* We can only figure out the number of vertices from a number of primitives
* if we are using basic primitives (so no loops, strips, fans, etc).
*/
assert(prim_type == u_base_prim_type(prim_type) &&
prim_type != PIPE_PRIM_PATCHES && prim_type != PIPE_PRIM_POLYGON);
const struct u_prim_vertex_count *info = u_prim_vertex_count(prim_type);
assert(info);
return info->min + (count - 1) * info->incr;
}
const char *u_prim_name(enum pipe_prim_type pipe_prim);
+2 -1
View File
@@ -19,7 +19,8 @@
# SOFTWARE.
foreach t : ['pipe_barrier_test', 'u_cache_test', 'u_half_test',
'u_format_test', 'u_format_compatible_test', 'translate_test']
'u_format_test', 'u_format_compatible_test', 'translate_test',
'u_prim_verts_test' ]
exe = executable(
t,
'@0@.c'.format(t),
@@ -0,0 +1,45 @@
#include <stdlib.h>
#include <stdio.h>
#include "util/u_prim.h"
struct test_info {
enum pipe_prim_type prim_type;
uint32_t count;
uint32_t expected;
};
struct test_info tests[] = {
{ PIPE_PRIM_POINTS, 0, 0 },
{ PIPE_PRIM_POINTS, 1, 1 },
{ PIPE_PRIM_POINTS, 2, 2 },
{ PIPE_PRIM_LINES, 0, 0 },
{ PIPE_PRIM_LINES, 1, 2 },
{ PIPE_PRIM_LINES, 2, 4 },
{ PIPE_PRIM_TRIANGLES, 0, 0 },
{ PIPE_PRIM_TRIANGLES, 1, 3 },
{ PIPE_PRIM_TRIANGLES, 2, 6 },
{ PIPE_PRIM_QUADS, 0, 0 },
{ PIPE_PRIM_QUADS, 1, 4 },
{ PIPE_PRIM_QUADS, 2, 8 },
};
int
main(int argc, char **argv)
{
for(int i = 0; i < ARRAY_SIZE(tests); i++) {
struct test_info *info = &tests[i];
uint32_t n = u_vertices_for_prims(info->prim_type, info->count);
if (n != info->expected) {
printf("Failure! Expected %u vertices for %u x %s, but got %u.\n",
info->expected, info->count, u_prim_name(info->prim_type), n);
return 1;
}
}
printf("Success!\n");
return 0;
}