diff options
Diffstat (limited to 'source/blender/gpu/GPU_primitive.h')
-rw-r--r-- | source/blender/gpu/GPU_primitive.h | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/source/blender/gpu/GPU_primitive.h b/source/blender/gpu/GPU_primitive.h index 4860b037bfb..de2feac2607 100644 --- a/source/blender/gpu/GPU_primitive.h +++ b/source/blender/gpu/GPU_primitive.h @@ -9,6 +9,7 @@ #pragma once +#include "BLI_assert.h" #include "GPU_common.h" #ifdef __cplusplus @@ -42,6 +43,79 @@ typedef enum { GPU_PRIM_CLASS_ANY = GPU_PRIM_CLASS_POINT | GPU_PRIM_CLASS_LINE | GPU_PRIM_CLASS_SURFACE, } GPUPrimClass; +inline int gpu_get_prim_count_from_type(uint vertex_len, GPUPrimType prim_type) +{ + /* does vertex_len make sense for this primitive type? */ + if (vertex_len == 0) { + return 0; + } + + switch (prim_type) { + case GPU_PRIM_POINTS: + return vertex_len; + + case GPU_PRIM_LINES: + BLI_assert(vertex_len % 2 == 0); + return vertex_len / 2; + + case GPU_PRIM_LINE_STRIP: + return vertex_len - 1; + + case GPU_PRIM_LINE_LOOP: + return vertex_len; + + case GPU_PRIM_LINES_ADJ: + BLI_assert(vertex_len % 4 == 0); + return vertex_len / 4; + + case GPU_PRIM_LINE_STRIP_ADJ: + return vertex_len - 2; + + case GPU_PRIM_TRIS: + BLI_assert(vertex_len % 3 == 0); + return vertex_len / 3; + + case GPU_PRIM_TRI_STRIP: + BLI_assert(vertex_len >= 3); + return vertex_len - 2; + + case GPU_PRIM_TRI_FAN: + BLI_assert(vertex_len >= 3); + return vertex_len - 2; + + case GPU_PRIM_TRIS_ADJ: + BLI_assert(vertex_len % 6 == 0); + return vertex_len / 6; + + default: + BLI_assert_unreachable(); + return 0; + } +} + +inline bool is_restart_compatible(GPUPrimType type) +{ + switch (type) { + case GPU_PRIM_POINTS: + case GPU_PRIM_LINES: + case GPU_PRIM_TRIS: + case GPU_PRIM_LINES_ADJ: + case GPU_PRIM_TRIS_ADJ: + case GPU_PRIM_NONE: + default: { + return false; + } + case GPU_PRIM_LINE_STRIP: + case GPU_PRIM_LINE_LOOP: + case GPU_PRIM_TRI_STRIP: + case GPU_PRIM_TRI_FAN: + case GPU_PRIM_LINE_STRIP_ADJ: { + return true; + } + } + return false; +} + /** * TODO: Improve error checking by validating that the shader is suited for this primitive type. * GPUPrimClass GPU_primtype_class(GPUPrimType); |