Merge branch 'master' into blender2.8
[blender.git] / source / blender / draw / intern / draw_manager.h
1 /*
2  * Copyright 2016, Blender Foundation.
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  * Contributor(s): Blender Institute
19  *
20  */
21
22 /** \file draw_manager.h
23  *  \ingroup draw
24  */
25
26 /* Private functions / structs of the draw manager */
27
28 #ifndef __DRAW_MANAGER_H__
29 #define __DRAW_MANAGER_H__
30
31 #include "DRW_engine.h"
32 #include "DRW_render.h"
33
34 #include "BLI_linklist.h"
35 #include "BLI_threads.h"
36
37 #include "GPU_batch.h"
38 #include "GPU_context.h"
39 #include "GPU_framebuffer.h"
40 #include "GPU_shader.h"
41 #include "GPU_uniformbuffer.h"
42 #include "GPU_viewport.h"
43
44 #include "draw_instance_data.h"
45
46 /* Use draw manager to call GPU_select, see: DRW_draw_select_loop */
47 #define USE_GPU_SELECT
48
49 /* ------------ Profiling --------------- */
50
51 #define USE_PROFILE
52
53 #ifdef USE_PROFILE
54 #  include "PIL_time.h"
55
56 #  define PROFILE_TIMER_FALLOFF 0.04
57
58 #  define PROFILE_START(time_start) \
59         double time_start = PIL_check_seconds_timer();
60
61 #  define PROFILE_END_ACCUM(time_accum, time_start) { \
62         time_accum += (PIL_check_seconds_timer() - time_start) * 1e3; \
63 } ((void)0)
64
65 /* exp average */
66 #  define PROFILE_END_UPDATE(time_update, time_start) { \
67         double _time_delta = (PIL_check_seconds_timer() - time_start) * 1e3; \
68         time_update = (time_update * (1.0 - PROFILE_TIMER_FALLOFF)) + \
69                       (_time_delta * PROFILE_TIMER_FALLOFF); \
70 } ((void)0)
71
72 #else  /* USE_PROFILE */
73
74 #  define PROFILE_START(time_start) ((void)0)
75 #  define PROFILE_END_ACCUM(time_accum, time_start) ((void)0)
76 #  define PROFILE_END_UPDATE(time_update, time_start) ((void)0)
77
78 #endif  /* USE_PROFILE */
79
80 /* ------------ Data Structure --------------- */
81 /**
82  * Data structure containing all drawcalls organized by passes and materials.
83  * DRWPass > DRWShadingGroup > DRWCall > DRWCallState
84  *                           > DRWUniform
85  **/
86
87 /* Used by DRWCallState.flag */
88 enum {
89         DRW_CALL_CULLED                 = (1 << 0),
90         DRW_CALL_NEGSCALE               = (1 << 1),
91         DRW_CALL_BYPASS_CULLING         = (1 << 2),
92 };
93
94 /* Used by DRWCallState.matflag */
95 enum {
96         DRW_CALL_MODELINVERSE           = (1 << 0),
97         DRW_CALL_MODELVIEW              = (1 << 1),
98         DRW_CALL_MODELVIEWINVERSE       = (1 << 2),
99         DRW_CALL_MODELVIEWPROJECTION    = (1 << 3),
100         DRW_CALL_NORMALVIEW             = (1 << 4),
101         DRW_CALL_NORMALWORLD            = (1 << 5),
102         DRW_CALL_ORCOTEXFAC             = (1 << 6),
103         DRW_CALL_EYEVEC                 = (1 << 7),
104         DRW_CALL_OBJECTINFO             = (1 << 8),
105 };
106
107 typedef struct DRWCallState {
108         DRWCallVisibilityFn *visibility_cb;
109         void *user_data;
110
111         uchar flag;
112         uchar cache_id;   /* Compared with DST.state_cache_id to see if matrices are still valid. */
113         uint16_t matflag;         /* Which matrices to compute. */
114         /* Culling: Using Bounding Sphere for now for faster culling.
115          * Not ideal for planes. */
116         BoundSphere bsphere;
117         /* Matrices */
118         float model[4][4];
119         float modelinverse[4][4];
120         float modelview[4][4];
121         float modelviewinverse[4][4];
122         float modelviewprojection[4][4];
123         float normalview[3][3];
124         float normalworld[3][3]; /* Not view dependent */
125         float orcotexfac[2][3]; /* Not view dependent */
126         float objectinfo[2];
127         float eyevec[3];
128 } DRWCallState;
129
130 typedef enum {
131         DRW_CALL_SINGLE,                 /* A single batch */
132         DRW_CALL_RANGE,                  /* Like single but only draw a range of vertices/indices. */
133         DRW_CALL_INSTANCES,              /* Draw instances without any instancing attribs. */
134         DRW_CALL_GENERATE,               /* Uses a callback to draw with any number of batches. */
135         DRW_CALL_PROCEDURAL,             /* Generate a drawcall without any GPUBatch. */
136 } DRWCallType;
137
138 typedef struct DRWCall {
139         struct DRWCall *next;
140         DRWCallState *state;
141
142         union {
143                 struct { /* type == DRW_CALL_SINGLE */
144                         GPUBatch *geometry;
145                         short ma_index;
146                 } single;
147                 struct { /* type == DRW_CALL_RANGE */
148                         GPUBatch *geometry;
149                         uint start, count;
150                 } range;
151                 struct { /* type == DRW_CALL_INSTANCES */
152                         GPUBatch *geometry;
153                         /* Count can be adjusted between redraw. If needed, we can add fixed count. */
154                         uint *count;
155                 } instances;
156                 struct { /* type == DRW_CALL_GENERATE */
157                         DRWCallGenerateFn *geometry_fn;
158                         void *user_data;
159                 } generate;
160                 struct { /* type == DRW_CALL_PROCEDURAL */
161                         uint vert_count;
162                         GPUPrimType prim_type;
163                 } procedural;
164         };
165
166         DRWCallType type;
167 #ifdef USE_GPU_SELECT
168         int select_id;
169 #endif
170 } DRWCall;
171
172 /* Used by DRWUniform.type */
173 typedef enum {
174         DRW_UNIFORM_BOOL,
175         DRW_UNIFORM_BOOL_COPY,
176         DRW_UNIFORM_SHORT_TO_INT,
177         DRW_UNIFORM_SHORT_TO_FLOAT,
178         DRW_UNIFORM_INT,
179         DRW_UNIFORM_INT_COPY,
180         DRW_UNIFORM_FLOAT,
181         DRW_UNIFORM_FLOAT_COPY,
182         DRW_UNIFORM_TEXTURE,
183         DRW_UNIFORM_TEXTURE_PERSIST,
184         DRW_UNIFORM_TEXTURE_REF,
185         DRW_UNIFORM_BLOCK,
186         DRW_UNIFORM_BLOCK_PERSIST
187 } DRWUniformType;
188
189 #define MAX_UNIFORM_NAME 13
190
191 struct DRWUniform {
192         DRWUniform *next; /* single-linked list */
193         union {
194                 /* For reference or array/vector types. */
195                 const void *pvalue;
196                 /* Single values. */
197                 float fvalue;
198                 int ivalue;
199         };
200         int location;
201         char type; /* DRWUniformType */
202         char length; /* cannot be more than 16 */
203         char arraysize; /* cannot be more than 16 too */
204 #ifndef NDEBUG
205         char name[MAX_UNIFORM_NAME];
206 #endif
207 };
208
209 typedef enum {
210         DRW_SHG_NORMAL,
211         DRW_SHG_POINT_BATCH,
212         DRW_SHG_LINE_BATCH,
213         DRW_SHG_TRIANGLE_BATCH,
214         DRW_SHG_INSTANCE,
215         DRW_SHG_INSTANCE_EXTERNAL,
216         DRW_SHG_FEEDBACK_TRANSFORM,
217 } DRWShadingGroupType;
218
219 struct DRWShadingGroup {
220         DRWShadingGroup *next;
221
222         GPUShader *shader;        /* Shader to bind */
223         DRWUniform *uniforms;          /* Uniforms pointers */
224
225         /* Watch this! Can be nasty for debugging. */
226         union {
227                 struct { /* DRW_SHG_NORMAL */
228                         DRWCall *first, *last; /* Linked list of DRWCall or DRWCallDynamic depending of type */
229                 } calls;
230                 struct { /* DRW_SHG_FEEDBACK_TRANSFORM */
231                         DRWCall *first, *last; /* Linked list of DRWCall or DRWCallDynamic depending of type */
232                         struct GPUVertBuf *tfeedback_target; /* Transform Feedback target. */
233                 };
234                 struct { /* DRW_SHG_***_BATCH */
235                         struct GPUBatch *batch_geom;     /* Result of call batching */
236                         struct GPUVertBuf *batch_vbo;
237                         uint primitive_count;
238                 };
239                 struct { /* DRW_SHG_INSTANCE[_EXTERNAL] */
240                         struct GPUBatch *instance_geom;
241                         struct GPUVertBuf *instance_vbo;
242                         uint instance_count;
243                         float instance_orcofac[2][3]; /* TODO find a better place. */
244                 };
245         };
246
247         DRWState state_extra;            /* State changes for this batch only (or'd with the pass's state) */
248         DRWState state_extra_disable;    /* State changes for this batch only (and'd with the pass's state) */
249         uint stencil_mask;       /* Stencil mask to use for stencil test / write operations */
250         DRWShadingGroupType type;
251
252         /* Builtin matrices locations */
253         int model;
254         int modelinverse;
255         int modelview;
256         int modelviewinverse;
257         int modelviewprojection;
258         int normalview;
259         int normalworld;
260         int orcotexfac;
261         int eye;
262         int callid;
263         int objectinfo;
264         uint16_t matflag; /* Matrices needed, same as DRWCall.flag */
265
266         DRWPass *pass_parent; /* backlink to pass we're in */
267 #ifndef NDEBUG
268         char attribs_count;
269 #endif
270 #ifdef USE_GPU_SELECT
271         GPUVertBuf *inst_selectid;
272         int override_selectid; /* Override for single object instances. */
273 #endif
274 };
275
276 #define MAX_PASS_NAME 32
277
278 struct DRWPass {
279         /* Linked list */
280         struct {
281                 DRWShadingGroup *first;
282                 DRWShadingGroup *last;
283         } shgroups;
284
285         DRWState state;
286         char name[MAX_PASS_NAME];
287 };
288
289 typedef struct ViewUboStorage {
290         DRWMatrixState matstate;
291         float viewcamtexcofac[4];
292         float clipplanes[2][4];
293 } ViewUboStorage;
294
295 /* ------------- DRAW DEBUG ------------ */
296
297 typedef struct DRWDebugLine {
298         struct DRWDebugLine *next; /* linked list */
299         float pos[2][3];
300         float color[4];
301 } DRWDebugLine;
302
303 typedef struct DRWDebugSphere {
304         struct DRWDebugSphere *next; /* linked list */
305         float mat[4][4];
306         float color[4];
307 } DRWDebugSphere;
308
309 /* ------------- DRAW MANAGER ------------ */
310
311 #define MAX_CLIP_PLANES 6 /* GL_MAX_CLIP_PLANES is at least 6 */
312 #define STENCIL_UNDEFINED 256
313 typedef struct DRWManager {
314         /* TODO clean up this struct a bit */
315         /* Cache generation */
316         ViewportMemoryPool *vmempool;
317         DRWInstanceDataList *idatalist;
318         DRWInstanceData *object_instance_data[MAX_INSTANCE_DATA_SIZE];
319         /* State of the object being evaluated if already allocated. */
320         DRWCallState *ob_state;
321         uchar state_cache_id; /* Could be larger but 254 view changes is already a lot! */
322         struct DupliObject *dupli_source;
323         struct Object *dupli_parent;
324
325         /* Rendering state */
326         GPUShader *shader;
327
328         /* Managed by `DRW_state_set`, `DRW_state_reset` */
329         DRWState state;
330         DRWState state_lock;
331         uint stencil_mask;
332
333         /* Per viewport */
334         GPUViewport *viewport;
335         struct GPUFrameBuffer *default_framebuffer;
336         float size[2];
337         float inv_size[2];
338         float screenvecs[2][3];
339         float pixsize;
340
341         GLenum backface, frontface;
342
343         struct {
344                 uint is_select : 1;
345                 uint is_depth : 1;
346                 uint is_image_render : 1;
347                 uint is_scene_render : 1;
348                 uint draw_background : 1;
349                 uint draw_text : 1;
350         } options;
351
352         /* Current rendering context */
353         DRWContextState draw_ctx;
354
355         /* Convenience pointer to text_store owned by the viewport */
356         struct DRWTextStore **text_store_p;
357
358         ListBase enabled_engines; /* RenderEngineType */
359
360         bool buffer_finish_called; /* Avoid bad usage of DRW_render_instance_buffer_finish */
361
362         /* View dependent uniforms. */
363         DRWMatrixState original_mat; /* Original rv3d matrices. */
364         int override_mat;            /* Bitflag of which matrices are overridden. */
365         int num_clip_planes;         /* Number of active clipplanes. */
366         bool dirty_mat;
367
368         /* keep in sync with viewBlock */
369         ViewUboStorage view_data;
370
371         struct {
372                 float frustum_planes[6][4];
373                 BoundBox frustum_corners;
374                 BoundSphere frustum_bsphere;
375                 bool updated;
376         } clipping;
377
378 #ifdef USE_GPU_SELECT
379         uint select_id;
380 #endif
381
382         /* ---------- Nothing after this point is cleared after use ----------- */
383
384         /* gl_context serves as the offset for clearing only
385          * the top portion of the struct so DO NOT MOVE IT! */
386         void *gl_context;                /* Unique ghost context used by the draw manager. */
387         GPUContext *gpu_context;
388         TicketMutex *gl_context_mutex;    /* Mutex to lock the drw manager and avoid concurrent context usage. */
389
390         /** GPU Resource State: Memory storage between drawing. */
391         struct {
392                 GPUTexture **bound_texs;
393                 char *bound_tex_slots;
394                 int bind_tex_inc;
395                 GPUUniformBuffer **bound_ubos;
396                 char *bound_ubo_slots;
397                 int bind_ubo_inc;
398         } RST;
399
400         struct {
401                 /* TODO(fclem) optimize: use chunks. */
402                 DRWDebugLine *lines;
403                 DRWDebugSphere *spheres;
404         } debug;
405 } DRWManager;
406
407 extern DRWManager DST; /* TODO : get rid of this and allow multithreaded rendering */
408
409 /* --------------- FUNCTIONS ------------- */
410
411 void drw_texture_set_parameters(GPUTexture *tex, DRWTextureFlag flags);
412 void drw_texture_get_format(
413         GPUTextureFormat format, bool is_framebuffer,
414         GPUTextureFormat *r_data_type, int *r_channels, bool *r_is_depth);
415
416 void *drw_viewport_engine_data_ensure(void *engine_type);
417
418 void drw_state_set(DRWState state);
419
420 void drw_debug_draw(void);
421 void drw_debug_init(void);
422
423 #endif /* __DRAW_MANAGER_H__ */