diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-09-05 21:15:56 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-09-06 23:13:06 +0300 |
commit | 84d67bd0a937e842618ee7843958f3147ba6af58 (patch) | |
tree | f5f26528e2fc44e5aca53e7ae8187a31a3f91f09 /source/blender/gpu/GPU_index_buffer.h | |
parent | 32d0918f3d0f020153f09981b3c6aa39ca5adbd0 (diff) |
Cleanup: GPU: Rename GPU_element to GPU_index_buffer
Makes it follow the functions names.
Diffstat (limited to 'source/blender/gpu/GPU_index_buffer.h')
-rw-r--r-- | source/blender/gpu/GPU_index_buffer.h | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/source/blender/gpu/GPU_index_buffer.h b/source/blender/gpu/GPU_index_buffer.h new file mode 100644 index 00000000000..b966eabefae --- /dev/null +++ b/source/blender/gpu/GPU_index_buffer.h @@ -0,0 +1,119 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2016 by Mike Erwin. + * All rights reserved. + */ + +/** \file + * \ingroup gpu + * + * GPU index buffer + */ + +#pragma once + +#include "GPU_primitive.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define GPU_TRACK_INDEX_RANGE 1 + +typedef enum { + GPU_INDEX_U16, + GPU_INDEX_U32, +} GPUIndexBufType; + +typedef struct GPUIndexBuf { + uint index_start; + uint index_len; + bool is_subrange; +#if GPU_TRACK_INDEX_RANGE + GPUIndexBufType index_type; + uint32_t gl_index_type; + uint base_index; +#endif + uint32_t ibo_id; /* 0 indicates not yet sent to VRAM */ + union { + void *data; /* non-NULL indicates not yet sent to VRAM */ + struct GPUIndexBuf *src; /* if is_subrange is true, this is the source buffer. */ + }; +} GPUIndexBuf; + +GPUIndexBuf *GPU_indexbuf_calloc(void); + +void GPU_indexbuf_use(GPUIndexBuf *); +uint GPU_indexbuf_size_get(const GPUIndexBuf *); + +typedef struct GPUIndexBufBuilder { + uint max_allowed_index; + uint max_index_len; + uint index_len; + GPUPrimType prim_type; + uint *data; +} GPUIndexBufBuilder; + +/* supports all primitive types. */ +void GPU_indexbuf_init_ex(GPUIndexBufBuilder *, GPUPrimType, uint index_len, uint vertex_len); + +/* supports only GPU_PRIM_POINTS, GPU_PRIM_LINES and GPU_PRIM_TRIS. */ +void GPU_indexbuf_init(GPUIndexBufBuilder *, GPUPrimType, uint prim_len, uint vertex_len); + +void GPU_indexbuf_add_generic_vert(GPUIndexBufBuilder *, uint v); +void GPU_indexbuf_add_primitive_restart(GPUIndexBufBuilder *); + +void GPU_indexbuf_add_point_vert(GPUIndexBufBuilder *, uint v); +void GPU_indexbuf_add_line_verts(GPUIndexBufBuilder *, uint v1, uint v2); +void GPU_indexbuf_add_tri_verts(GPUIndexBufBuilder *, uint v1, uint v2, uint v3); +void GPU_indexbuf_add_line_adj_verts(GPUIndexBufBuilder *, uint v1, uint v2, uint v3, uint v4); + +void GPU_indexbuf_set_point_vert(GPUIndexBufBuilder *builder, uint elem, uint v1); +void GPU_indexbuf_set_line_verts(GPUIndexBufBuilder *builder, uint elem, uint v1, uint v2); +void GPU_indexbuf_set_tri_verts(GPUIndexBufBuilder *builder, uint elem, uint v1, uint v2, uint v3); + +/* Skip primitive rendering at the given index. */ +void GPU_indexbuf_set_point_restart(GPUIndexBufBuilder *builder, uint elem); +void GPU_indexbuf_set_line_restart(GPUIndexBufBuilder *builder, uint elem); +void GPU_indexbuf_set_tri_restart(GPUIndexBufBuilder *builder, uint elem); + +GPUIndexBuf *GPU_indexbuf_build(GPUIndexBufBuilder *); +void GPU_indexbuf_build_in_place(GPUIndexBufBuilder *, GPUIndexBuf *); + +/* Create a subrange of an existing indexbuffer. */ +GPUIndexBuf *GPU_indexbuf_create_subrange(GPUIndexBuf *elem_src, uint start, uint length); +void GPU_indexbuf_create_subrange_in_place(GPUIndexBuf *elem, + GPUIndexBuf *elem_src, + uint start, + uint length); + +void GPU_indexbuf_discard(GPUIndexBuf *); + +int GPU_indexbuf_primitive_len(GPUPrimType prim_type); + +/* Macros */ + +#define GPU_INDEXBUF_DISCARD_SAFE(elem) \ + do { \ + if (elem != NULL) { \ + GPU_indexbuf_discard(elem); \ + elem = NULL; \ + } \ + } while (0) + +#ifdef __cplusplus +} +#endif |