GPU: Make changes to GPUIndexBuf and GPUVertBuf to allow multithreading
[blender.git] / source / blender / gpu / GPU_element.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2016 by Mike Erwin.
19  * All rights reserved.
20  *
21  * Contributor(s): Blender Foundation
22  *
23  * ***** END GPL LICENSE BLOCK *****
24  */
25
26 /** \file blender/gpu/GPU_element.h
27  *  \ingroup gpu
28  *
29  * GPU element list (AKA index buffer)
30  */
31
32 #ifndef __GPU_ELEMENT_H__
33 #define __GPU_ELEMENT_H__
34
35 #include "GPU_primitive.h"
36
37 #define GPU_TRACK_INDEX_RANGE 1
38
39 #define GPU_PRIM_RESTART 0xFFFFFFFF
40
41 typedef enum {
42         GPU_INDEX_U8, /* GL has this, Vulkan does not */
43         GPU_INDEX_U16,
44         GPU_INDEX_U32
45 } GPUIndexBufType;
46
47 typedef struct GPUIndexBuf {
48         uint index_len;
49 #if GPU_TRACK_INDEX_RANGE
50         GPUIndexBufType index_type;
51         uint32_t gl_index_type;
52         uint min_index;
53         uint max_index;
54         uint base_index;
55 #endif
56         uint32_t ibo_id; /* 0 indicates not yet sent to VRAM */
57         void *data; /* non-NULL indicates not yet sent to VRAM */
58         bool use_prim_restart;
59 } GPUIndexBuf;
60
61 void GPU_indexbuf_use(GPUIndexBuf *);
62 uint GPU_indexbuf_size_get(const GPUIndexBuf *);
63
64 typedef struct GPUIndexBufBuilder {
65         uint max_allowed_index;
66         uint max_index_len;
67         uint index_len;
68         GPUPrimType prim_type;
69         uint *data;
70         bool use_prim_restart;
71 } GPUIndexBufBuilder;
72
73
74 /* supports all primitive types. */
75 void GPU_indexbuf_init_ex(GPUIndexBufBuilder *, GPUPrimType, uint index_len, uint vertex_len, bool use_prim_restart);
76
77 /* supports only GPU_PRIM_POINTS, GPU_PRIM_LINES and GPU_PRIM_TRIS. */
78 void GPU_indexbuf_init(GPUIndexBufBuilder *, GPUPrimType, uint prim_len, uint vertex_len);
79
80 void GPU_indexbuf_add_generic_vert(GPUIndexBufBuilder *, uint v);
81 void GPU_indexbuf_add_primitive_restart(GPUIndexBufBuilder *);
82
83 void GPU_indexbuf_add_point_vert(GPUIndexBufBuilder *, uint v);
84 void GPU_indexbuf_add_line_verts(GPUIndexBufBuilder *, uint v1, uint v2);
85 void GPU_indexbuf_add_tri_verts(GPUIndexBufBuilder *, uint v1, uint v2, uint v3);
86 void GPU_indexbuf_add_line_adj_verts(GPUIndexBufBuilder *, uint v1, uint v2, uint v3, uint v4);
87
88 GPUIndexBuf *GPU_indexbuf_build(GPUIndexBufBuilder *);
89 void GPU_indexbuf_build_in_place(GPUIndexBufBuilder *, GPUIndexBuf *);
90
91 void GPU_indexbuf_discard(GPUIndexBuf *);
92
93 int GPU_indexbuf_primitive_len(GPUPrimType prim_type);
94
95 /* Macros */
96
97 #define GPU_INDEXBUF_DISCARD_SAFE(elem) do { \
98         if (elem != NULL) { \
99                 GPU_indexbuf_discard(elem); \
100                 elem = NULL; \
101         } \
102 } while (0)
103
104 #endif /* __GPU_ELEMENT_H__ */