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