Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2020-09-05 21:15:56 +0300
committerClément Foucault <foucault.clem@gmail.com>2020-09-06 23:13:06 +0300
commit84d67bd0a937e842618ee7843958f3147ba6af58 (patch)
treef5f26528e2fc44e5aca53e7ae8187a31a3f91f09 /source/blender/gpu/GPU_index_buffer.h
parent32d0918f3d0f020153f09981b3c6aa39ca5adbd0 (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.h119
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