Eevee: Stop depsgraph update callback form allocating unneeded memory
[blender.git] / source / blender / draw / engines / eevee / eevee_private.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 eevee_private.h
23  *  \ingroup DNA
24  */
25
26 #ifndef __EEVEE_PRIVATE_H__
27 #define __EEVEE_PRIVATE_H__
28
29 struct Object;
30
31 extern struct DrawEngineType draw_engine_eevee_type;
32
33 /* Minimum UBO is 16384 bytes */
34 #define MAX_PROBE 128 /* TODO : find size by dividing UBO max size by probe data size */
35 #define MAX_GRID 64 /* TODO : find size by dividing UBO max size by grid data size */
36 #define MAX_PLANAR 16 /* TODO : find size by dividing UBO max size by grid data size */
37 #define MAX_LIGHT 128 /* TODO : find size by dividing UBO max size by light data size */
38 #define MAX_CASCADE_NUM 4
39 #define MAX_SHADOW 256 /* TODO : Make this depends on GL_MAX_ARRAY_TEXTURE_LAYERS */
40 #define MAX_SHADOW_CASCADE 8
41 #define MAX_SHADOW_CUBE (MAX_SHADOW - MAX_CASCADE_NUM * MAX_SHADOW_CASCADE)
42 #define MAX_BLOOM_STEP 16
43
44 /* Only define one of these. */
45 // #define IRRADIANCE_SH_L2
46 // #define IRRADIANCE_CUBEMAP
47 #define IRRADIANCE_HL2
48
49 #if defined(IRRADIANCE_SH_L2)
50 #  define SHADER_IRRADIANCE "#define IRRADIANCE_SH_L2\n"
51 #elif defined(IRRADIANCE_CUBEMAP)
52 #  define SHADER_IRRADIANCE "#define IRRADIANCE_CUBEMAP\n"
53 #elif defined(IRRADIANCE_HL2)
54 #  define SHADER_IRRADIANCE "#define IRRADIANCE_HL2\n"
55 #endif
56
57 #define SHADER_DEFINES \
58         "#define EEVEE_ENGINE\n" \
59         "#define MAX_PROBE " STRINGIFY(MAX_PROBE) "\n" \
60         "#define MAX_GRID " STRINGIFY(MAX_GRID) "\n" \
61         "#define MAX_PLANAR " STRINGIFY(MAX_PLANAR) "\n" \
62         "#define MAX_LIGHT " STRINGIFY(MAX_LIGHT) "\n" \
63         "#define MAX_SHADOW " STRINGIFY(MAX_SHADOW) "\n" \
64         "#define MAX_SHADOW_CUBE " STRINGIFY(MAX_SHADOW_CUBE) "\n" \
65         "#define MAX_SHADOW_CASCADE " STRINGIFY(MAX_SHADOW_CASCADE) "\n" \
66         "#define MAX_CASCADE_NUM " STRINGIFY(MAX_CASCADE_NUM) "\n" \
67         SHADER_IRRADIANCE
68
69 #define SWAP_DOUBLE_BUFFERS() {                                       \
70         if (effects->swap_double_buffer) {                                \
71                 SWAP(struct GPUFrameBuffer *, fbl->main, fbl->double_buffer); \
72                 SWAP(GPUTexture *, txl->color, txl->color_double_buffer);     \
73                 effects->swap_double_buffer = false;                          \
74         }                                                                 \
75 } ((void)0)
76
77 #define SWAP_BUFFERS() {                           \
78         if (effects->target_buffer != fbl->main) {     \
79                 SWAP_DOUBLE_BUFFERS();                     \
80                 effects->source_buffer = txl->color_post;  \
81                 effects->target_buffer = fbl->main;        \
82         }                                              \
83         else {                                         \
84                 SWAP_DOUBLE_BUFFERS();                     \
85                 effects->source_buffer = txl->color;       \
86                 effects->target_buffer = fbl->effect_fb;   \
87         }                                              \
88 } ((void)0)
89
90 /* World shader variations */
91 enum {
92         VAR_WORLD_BACKGROUND    = 0,
93         VAR_WORLD_PROBE         = 1,
94         VAR_WORLD_VOLUME        = 2,
95 };
96
97 /* Material shader variations */
98 enum {
99         VAR_MAT_MESH     = (1 << 0),
100         VAR_MAT_PROBE    = (1 << 1),
101         VAR_MAT_HAIR     = (1 << 2),
102         VAR_MAT_FLAT     = (1 << 3),
103         VAR_MAT_BLEND    = (1 << 4),
104         VAR_MAT_VSM      = (1 << 5),
105         VAR_MAT_ESM      = (1 << 6),
106         /* Max number of variation */
107         /* IMPORTANT : Leave it last and set
108          * it's value accordingly. */
109         VAR_MAT_MAX      = (1 << 7),
110         /* These are options that are not counted in VAR_MAT_MAX
111          * because they are not cumulative with the others above. */
112         VAR_MAT_CLIP     = (1 << 8),
113         VAR_MAT_HASH     = (1 << 9),
114         VAR_MAT_MULT     = (1 << 10),
115         VAR_MAT_SHADOW   = (1 << 11),
116         VAR_MAT_REFRACT  = (1 << 12),
117         VAR_MAT_VOLUME   = (1 << 13),
118         VAR_MAT_SSS      = (1 << 14),
119         VAR_MAT_TRANSLUC = (1 << 15),
120         VAR_MAT_SSSALBED = (1 << 16),
121 };
122
123 /* Shadow Technique */
124 enum {
125         SHADOW_ESM = 1,
126         SHADOW_VSM = 2,
127         SHADOW_METHOD_MAX = 3,
128 };
129
130 typedef struct EEVEE_PassList {
131         /* Shadows */
132         struct DRWPass *shadow_pass;
133         struct DRWPass *shadow_cube_pass;
134         struct DRWPass *shadow_cube_copy_pass;
135         struct DRWPass *shadow_cube_store_pass;
136         struct DRWPass *shadow_cascade_pass;
137         struct DRWPass *shadow_cascade_copy_pass;
138         struct DRWPass *shadow_cascade_store_pass;
139
140         /* Probes */
141         struct DRWPass *probe_background;
142         struct DRWPass *probe_glossy_compute;
143         struct DRWPass *probe_diffuse_compute;
144         struct DRWPass *probe_grid_fill;
145         struct DRWPass *probe_display;
146         struct DRWPass *probe_planar_downsample_ps;
147
148         /* Effects */
149         struct DRWPass *ao_horizon_search;
150         struct DRWPass *ao_horizon_debug;
151         struct DRWPass *motion_blur;
152         struct DRWPass *bloom_blit;
153         struct DRWPass *bloom_downsample_first;
154         struct DRWPass *bloom_downsample;
155         struct DRWPass *bloom_upsample;
156         struct DRWPass *bloom_resolve;
157         struct DRWPass *dof_down;
158         struct DRWPass *dof_scatter;
159         struct DRWPass *dof_resolve;
160         struct DRWPass *volumetric_world_ps;
161         struct DRWPass *volumetric_objects_ps;
162         struct DRWPass *volumetric_scatter_ps;
163         struct DRWPass *volumetric_integration_ps;
164         struct DRWPass *volumetric_resolve_ps;
165         struct DRWPass *ssr_raytrace;
166         struct DRWPass *ssr_resolve;
167         struct DRWPass *sss_blur_ps;
168         struct DRWPass *sss_resolve_ps;
169         struct DRWPass *color_downsample_ps;
170         struct DRWPass *color_downsample_cube_ps;
171         struct DRWPass *taa_resolve;
172
173         /* HiZ */
174         struct DRWPass *minz_downlevel_ps;
175         struct DRWPass *maxz_downlevel_ps;
176         struct DRWPass *minz_downdepth_ps;
177         struct DRWPass *maxz_downdepth_ps;
178         struct DRWPass *minz_downdepth_layer_ps;
179         struct DRWPass *maxz_downdepth_layer_ps;
180         struct DRWPass *minz_copydepth_ps;
181         struct DRWPass *maxz_copydepth_ps;
182
183         struct DRWPass *depth_pass;
184         struct DRWPass *depth_pass_cull;
185         struct DRWPass *depth_pass_clip;
186         struct DRWPass *depth_pass_clip_cull;
187         struct DRWPass *refract_depth_pass;
188         struct DRWPass *refract_depth_pass_cull;
189         struct DRWPass *refract_depth_pass_clip;
190         struct DRWPass *refract_depth_pass_clip_cull;
191         struct DRWPass *default_pass[VAR_MAT_MAX];
192         struct DRWPass *sss_pass;
193         struct DRWPass *material_pass;
194         struct DRWPass *refract_pass;
195         struct DRWPass *transparent_pass;
196         struct DRWPass *background_pass;
197 } EEVEE_PassList;
198
199 typedef struct EEVEE_FramebufferList {
200         /* Effects */
201         struct GPUFrameBuffer *gtao_fb;
202         struct GPUFrameBuffer *gtao_debug_fb;
203         struct GPUFrameBuffer *downsample_fb;
204         struct GPUFrameBuffer *effect_fb;
205         struct GPUFrameBuffer *bloom_blit_fb;
206         struct GPUFrameBuffer *bloom_down_fb[MAX_BLOOM_STEP];
207         struct GPUFrameBuffer *bloom_accum_fb[MAX_BLOOM_STEP - 1];
208         struct GPUFrameBuffer *sss_blur_fb;
209         struct GPUFrameBuffer *sss_clear_fb;
210         struct GPUFrameBuffer *dof_down_fb;
211         struct GPUFrameBuffer *dof_scatter_far_fb;
212         struct GPUFrameBuffer *dof_scatter_near_fb;
213         struct GPUFrameBuffer *volumetric_fb;
214         struct GPUFrameBuffer *volumetric_scat_fb;
215         struct GPUFrameBuffer *volumetric_integ_fb;
216         struct GPUFrameBuffer *screen_tracing_fb;
217         struct GPUFrameBuffer *refract_fb;
218
219         struct GPUFrameBuffer *planarref_fb;
220
221         struct GPUFrameBuffer *main;
222         struct GPUFrameBuffer *double_buffer;
223         struct GPUFrameBuffer *depth_double_buffer_fb;
224 } EEVEE_FramebufferList;
225
226 typedef struct EEVEE_TextureList {
227         /* Effects */
228         struct GPUTexture *color_post; /* R16_G16_B16 */
229         struct GPUTexture *dof_down_near; /* R16_G16_B16_A16 */
230         struct GPUTexture *dof_down_far; /* R16_G16_B16_A16 */
231         struct GPUTexture *dof_coc; /* R16_G16 */
232         struct GPUTexture *dof_near_blur; /* R16_G16_B16_A16 */
233         struct GPUTexture *dof_far_blur; /* R16_G16_B16_A16 */
234         struct GPUTexture *bloom_blit; /* R16_G16_B16 */
235         struct GPUTexture *bloom_downsample[MAX_BLOOM_STEP]; /* R16_G16_B16 */
236         struct GPUTexture *bloom_upsample[MAX_BLOOM_STEP - 1]; /* R16_G16_B16 */
237         struct GPUTexture *ssr_normal_input;
238         struct GPUTexture *ssr_specrough_input;
239         struct GPUTexture *refract_color;
240
241         struct GPUTexture *volume_prop_scattering;
242         struct GPUTexture *volume_prop_extinction;
243         struct GPUTexture *volume_prop_emission;
244         struct GPUTexture *volume_prop_phase;
245         struct GPUTexture *volume_scatter;
246         struct GPUTexture *volume_transmittance;
247         struct GPUTexture *volume_scatter_history;
248         struct GPUTexture *volume_transmittance_history;
249
250         struct GPUTexture *planar_pool;
251         struct GPUTexture *planar_depth;
252
253         struct GPUTexture *gtao_horizons;
254
255         struct GPUTexture *sss_data;
256         struct GPUTexture *sss_albedo;
257         struct GPUTexture *sss_blur;
258         struct GPUTexture *sss_stencil;
259
260         struct GPUTexture *maxzbuffer;
261
262         struct GPUTexture *color; /* R16_G16_B16 */
263         struct GPUTexture *color_double_buffer;
264         struct GPUTexture *depth_double_buffer;
265 } EEVEE_TextureList;
266
267 typedef struct EEVEE_StorageList {
268         /* Effects */
269         struct EEVEE_EffectsInfo *effects;
270
271         struct EEVEE_PrivateData *g_data;
272 } EEVEE_StorageList;
273
274 /* ************ LIGHT UBO ************* */
275 typedef struct EEVEE_Light {
276         float position[3], dist;
277         float color[3], spec;
278         float spotsize, spotblend, radius, shadowid;
279         float rightvec[3], sizex;
280         float upvec[3], sizey;
281         float forwardvec[3], lamptype;
282 } EEVEE_Light;
283
284 typedef struct EEVEE_Shadow {
285         float near, far, bias, exp;
286         float shadow_start, data_start, multi_shadow_count, shadow_blur;
287         float contact_dist, contact_bias, contact_spread, contact_thickness;
288 } EEVEE_Shadow;
289
290 typedef struct EEVEE_ShadowCube {
291         float position[3], pad;
292 } EEVEE_ShadowCube;
293
294 typedef struct EEVEE_ShadowCascade {
295         float shadowmat[MAX_CASCADE_NUM][4][4]; /* World->Lamp->NDC->Tex : used for sampling the shadow map. */
296         float split_start[4];
297         float split_end[4];
298 } EEVEE_ShadowCascade;
299
300 typedef struct EEVEE_ShadowRender {
301         float shadowmat[6][4][4]; /* World->Lamp->NDC : used to render the shadow map. 6 frustum for cubemap shadow */
302         float viewmat[6][4][4]; /* World->Lamp : used to render the shadow map. 6 viewmat for cubemap shadow */
303         float position[3], pad;
304         float cube_texel_size;
305         float stored_texel_size;
306         float clip_near;
307         float clip_far;
308         int shadow_samples_ct;
309         float shadow_inv_samples_ct;
310 } EEVEE_ShadowRender;
311
312 /* ************ VOLUME DATA ************ */
313 typedef struct EEVEE_VolumetricsInfo {
314         float integration_step_count, shadow_step_count, sample_distribution, light_clamp;
315         float integration_start, integration_end;
316         float depth_param[3], history_alpha;
317         bool use_lights, use_volume_shadows;
318         int froxel_tex_size[3];
319         float inv_tex_size[3];
320         float volume_coord_scale[2];
321         float jitter[3];
322 } EEVEE_VolumetricsInfo;
323
324 /* ************ LIGHT DATA ************* */
325 typedef struct EEVEE_LampsInfo {
326         int num_light, cache_num_light;
327         int num_layer, cache_num_layer;
328         int gpu_cube_ct, gpu_cascade_ct, gpu_shadow_ct;
329         int cpu_cube_ct, cpu_cascade_ct;
330         int update_flag;
331         int shadow_size, shadow_method;
332         bool shadow_high_bitdepth;
333         int shadow_cube_target_size;
334         int current_shadow_cascade;
335         int current_shadow_face;
336         float filter_size;
337         /* List of lights in the scene. */
338         /* XXX This is fragile, can get out of sync quickly. */
339         struct Object *light_ref[MAX_LIGHT];
340         struct Object *shadow_cube_ref[MAX_SHADOW_CUBE];
341         struct Object *shadow_cascade_ref[MAX_SHADOW_CASCADE];
342         /* UBO Storage : data used by UBO */
343         struct EEVEE_Light         light_data[MAX_LIGHT];
344         struct EEVEE_ShadowRender  shadow_render_data;
345         struct EEVEE_Shadow        shadow_data[MAX_SHADOW];
346         struct EEVEE_ShadowCube    shadow_cube_data[MAX_SHADOW_CUBE];
347         struct EEVEE_ShadowCascade shadow_cascade_data[MAX_SHADOW_CASCADE];
348 } EEVEE_LampsInfo;
349
350 /* EEVEE_LampsInfo->update_flag */
351 enum {
352         LIGHT_UPDATE_SHADOW_CUBE = (1 << 0),
353 };
354
355 /* ************ PROBE UBO ************* */
356 typedef struct EEVEE_LightProbe {
357         float position[3], parallax_type;
358         float attenuation_fac;
359         float attenuation_type;
360         float pad3[2];
361         float attenuationmat[4][4];
362         float parallaxmat[4][4];
363 } EEVEE_LightProbe;
364
365 typedef struct EEVEE_LightGrid {
366         float mat[4][4];
367         int resolution[3], offset;
368         float corner[3], attenuation_scale;
369         float increment_x[3], attenuation_bias; /* world space vector between 2 opposite cells */
370         float increment_y[3], level_bias;
371         float increment_z[3], pad4;
372 } EEVEE_LightGrid;
373
374 typedef struct EEVEE_PlanarReflection {
375         float plane_equation[4];
376         float clip_vec_x[3], attenuation_scale;
377         float clip_vec_y[3], attenuation_bias;
378         float clip_edge_x_pos, clip_edge_x_neg;
379         float clip_edge_y_pos, clip_edge_y_neg;
380         float facing_scale, facing_bias, pad[2];
381         float reflectionmat[4][4];
382 } EEVEE_PlanarReflection;
383
384 /* ************ PROBE DATA ************* */
385 typedef struct EEVEE_LightProbesInfo {
386         int num_cube, cache_num_cube;
387         int num_grid, cache_num_grid;
388         int num_planar, cache_num_planar;
389         int update_flag;
390         int updated_bounce;
391         int num_bounce;
392         int cubemap_res;
393         int target_size;
394         int grid_initialized;
395         /* Actual number of probes that have datas. */
396         int num_render_cube;
397         int num_render_grid;
398         /* For rendering probes */
399         float probemat[6][4][4];
400         int layer;
401         float texel_size;
402         float padding_size;
403         float samples_ct;
404         float invsamples_ct;
405         float roughness;
406         float lodfactor;
407         float lod_rt_max, lod_cube_max, lod_planar_max;
408         int shres;
409         int shnbr;
410         bool specular_toggle;
411         bool ssr_toggle;
412         bool sss_toggle;
413         /* List of probes in the scene. */
414         /* XXX This is fragile, can get out of sync quickly. */
415         struct Object *probes_cube_ref[MAX_PROBE];
416         struct Object *probes_grid_ref[MAX_GRID];
417         struct Object *probes_planar_ref[MAX_PLANAR];
418         /* UBO Storage : data used by UBO */
419         struct EEVEE_LightProbe probe_data[MAX_PROBE];
420         struct EEVEE_LightGrid grid_data[MAX_GRID];
421         struct EEVEE_PlanarReflection planar_data[MAX_PLANAR];
422 } EEVEE_LightProbesInfo;
423
424 /* EEVEE_LightProbesInfo->update_flag */
425 enum {
426         PROBE_UPDATE_CUBE = (1 << 0),
427         PROBE_UPDATE_GRID = (1 << 1),
428         PROBE_UPDATE_ALL  = 0xFFFFFF,
429 };
430
431 /* ************ EFFECTS DATA ************* */
432 typedef struct EEVEE_EffectsInfo {
433         int enabled_effects;
434         bool swap_double_buffer;
435
436         /* SSSS */
437         int sss_sample_count;
438         float sss_jitter_threshold;
439         bool sss_separate_albedo;
440
441         /* Volumetrics */
442         bool use_volumetrics;
443         int volume_current_sample;
444
445         /* SSR */
446         bool use_ssr;
447         bool reflection_trace_full;
448         bool ssr_use_normalization;
449         int ssr_ray_count;
450         float ssr_firefly_fac;
451         float ssr_border_fac;
452         float ssr_max_roughness;
453         float ssr_quality;
454         float ssr_thickness;
455         float ssr_pixelsize[2];
456
457         /* Temporal Anti Aliasing */
458         int taa_current_sample;
459         int taa_total_sample;
460         float taa_alpha;
461         bool prev_drw_support;
462         float prev_drw_persmat[4][4];
463         float overide_persmat[4][4];
464         float overide_persinv[4][4];
465         float overide_winmat[4][4];
466         float overide_wininv[4][4];
467
468         /* Ambient Occlusion */
469         bool use_ao, use_bent_normals;
470         float ao_dist, ao_samples, ao_factor, ao_samples_inv;
471         float ao_offset, ao_bounce_fac, ao_quality, ao_settings;
472         float ao_sample_nbr;
473         int ao_texsize[2], hori_tex_layers;
474
475         /* Motion Blur */
476         float current_ndc_to_world[4][4];
477         float past_world_to_ndc[4][4];
478         float tmp_mat[4][4];
479         int motion_blur_samples;
480
481         /* Depth Of Field */
482         float dof_near_far[2];
483         float dof_params[3];
484         float dof_bokeh[4];
485         float dof_layer_select[2];
486         int dof_target_size[2];
487
488         /* Bloom */
489         int bloom_iteration_ct;
490         float source_texel_size[2];
491         float blit_texel_size[2];
492         float downsamp_texel_size[MAX_BLOOM_STEP][2];
493         float bloom_color[3];
494         float bloom_clamp;
495         float bloom_sample_scale;
496         float bloom_curve_threshold[4];
497         float unf_source_texel_size[2];
498         struct GPUTexture *unf_source_buffer; /* pointer copy */
499         struct GPUTexture *unf_base_buffer; /* pointer copy */
500
501         /* Not alloced, just a copy of a *GPUtexture in EEVEE_TextureList. */
502         struct GPUTexture *source_buffer;       /* latest updated texture */
503         struct GPUFrameBuffer *target_buffer;   /* next target to render to */
504 } EEVEE_EffectsInfo;
505
506 enum {
507         EFFECT_MOTION_BLUR         = (1 << 0),
508         EFFECT_BLOOM               = (1 << 1),
509         EFFECT_DOF                 = (1 << 2),
510         EFFECT_VOLUMETRIC          = (1 << 3),
511         EFFECT_SSR                 = (1 << 4),
512         EFFECT_DOUBLE_BUFFER       = (1 << 5), /* Not really an effect but a feature */
513         EFFECT_REFRACT             = (1 << 6),
514         EFFECT_GTAO                = (1 << 7),
515         EFFECT_TAA                 = (1 << 8),
516         EFFECT_POST_BUFFER         = (1 << 9), /* Not really an effect but a feature */
517         EFFECT_NORMAL_BUFFER       = (1 << 10), /* Not really an effect but a feature */
518         EFFECT_SSS                 = (1 << 11),
519 };
520
521 /* ************** SCENE LAYER DATA ************** */
522 typedef struct EEVEE_ViewLayerData {
523         /* Lamps */
524         struct EEVEE_LampsInfo *lamps;
525
526         struct GPUUniformBuffer *light_ubo;
527         struct GPUUniformBuffer *shadow_ubo;
528         struct GPUUniformBuffer *shadow_render_ubo;
529         struct GPUUniformBuffer *shadow_samples_ubo;
530
531         struct GPUFrameBuffer *shadow_target_fb;
532         struct GPUFrameBuffer *shadow_store_fb;
533
534         struct GPUTexture *shadow_cube_target;
535         struct GPUTexture *shadow_cube_blur;
536         struct GPUTexture *shadow_cascade_target;
537         struct GPUTexture *shadow_cascade_blur;
538         struct GPUTexture *shadow_pool;
539
540         struct ListBase shadow_casters; /* Shadow casters gathered during cache iteration */
541
542         /* Probes */
543         struct EEVEE_LightProbesInfo *probes;
544
545         struct GPUUniformBuffer *probe_ubo;
546         struct GPUUniformBuffer *grid_ubo;
547         struct GPUUniformBuffer *planar_ubo;
548
549         struct GPUFrameBuffer *probe_fb;
550         struct GPUFrameBuffer *probe_filter_fb;
551
552         struct GPUTexture *probe_rt;
553         struct GPUTexture *probe_pool;
554         struct GPUTexture *irradiance_pool;
555         struct GPUTexture *irradiance_rt;
556
557         struct ListBase probe_queue; /* List of probes to update */
558
559         /* Volumetrics */
560         struct EEVEE_VolumetricsInfo *volumetrics;
561 } EEVEE_ViewLayerData;
562
563 /* ************ OBJECT DATA ************ */
564 typedef struct EEVEE_LampEngineData {
565         bool need_update;
566         struct ListBase shadow_caster_list;
567         void *storage; /* either EEVEE_LightData, EEVEE_ShadowCubeData, EEVEE_ShadowCascadeData */
568 } EEVEE_LampEngineData;
569
570 typedef struct EEVEE_LightProbeEngineData {
571         /* NOTE: need_full_update is set by dependency graph when the probe or it's
572          * object is updated. This triggers full probe update, including it's
573          * "progressive" GI refresh.
574          *
575          * need_update is always set to truth when need_full_update is tagged, but
576          * might also be forced to be kept truth during GI refresh stages.
577          *
578          * TODO(sergey): Is there a way to avoid two flags here, or at least make
579          * it more clear what's going on here?
580          */
581         bool need_full_update;
582         bool need_update;
583
584         bool ready_to_shade;
585         int updated_cells;
586         int updated_lvl;
587         int num_cell;
588         int max_lvl;
589         int probe_id; /* Only used for display data */
590         float probe_size; /* Only used for display data */
591         /* For planar reflection rendering */
592         float viewmat[4][4];
593         float persmat[4][4];
594         float planer_eq_offset[4];
595         struct ListBase captured_object_list;
596 } EEVEE_LightProbeEngineData;
597
598 typedef struct EEVEE_ObjectEngineData {
599         bool need_update;
600 } EEVEE_ObjectEngineData;
601
602 /* *********************************** */
603
604 typedef struct EEVEE_Data {
605         void *engine_type;
606         EEVEE_FramebufferList *fbl;
607         EEVEE_TextureList *txl;
608         EEVEE_PassList *psl;
609         EEVEE_StorageList *stl;
610 } EEVEE_Data;
611
612 typedef struct EEVEE_PrivateData {
613         struct DRWShadingGroup *shadow_shgrp;
614         struct DRWShadingGroup *depth_shgrp;
615         struct DRWShadingGroup *depth_shgrp_cull;
616         struct DRWShadingGroup *depth_shgrp_clip;
617         struct DRWShadingGroup *depth_shgrp_clip_cull;
618         struct DRWShadingGroup *refract_depth_shgrp;
619         struct DRWShadingGroup *refract_depth_shgrp_cull;
620         struct DRWShadingGroup *refract_depth_shgrp_clip;
621         struct DRWShadingGroup *refract_depth_shgrp_clip_cull;
622         struct DRWShadingGroup *cube_display_shgrp;
623         struct DRWShadingGroup *planar_display_shgrp;
624         struct DRWShadingGroup *planar_downsample;
625         struct GHash *material_hash;
626         struct GHash *hair_material_hash;
627         struct GPUTexture *minzbuffer;
628         struct GPUTexture *ssr_hit_output[4];
629         struct GPUTexture *gtao_horizons_debug;
630         float background_alpha; /* TODO find a better place for this. */
631         float viewvecs[2][4];
632         /* For planar probes */
633         float texel_size[2];
634         /* To correct mip level texel mis-alignement */
635         float mip_ratio[10][2]; /* TODO put in a UBO */
636         /* For double buffering */
637         bool view_updated;
638         bool valid_double_buffer;
639         float prev_persmat[4][4];
640 } EEVEE_PrivateData; /* Transient data */
641
642 /* eevee_data.c */
643 EEVEE_ViewLayerData *EEVEE_view_layer_data_get(void);
644 EEVEE_ViewLayerData *EEVEE_view_layer_data_ensure(void);
645 EEVEE_ObjectEngineData *EEVEE_object_data_get(Object *ob);
646 EEVEE_ObjectEngineData *EEVEE_object_data_ensure(Object *ob);
647 EEVEE_LightProbeEngineData *EEVEE_lightprobe_data_get(Object *ob);
648 EEVEE_LightProbeEngineData *EEVEE_lightprobe_data_ensure(Object *ob);
649 EEVEE_LampEngineData *EEVEE_lamp_data_get(Object *ob);
650 EEVEE_LampEngineData *EEVEE_lamp_data_ensure(Object *ob);
651
652 /* eevee_materials.c */
653 struct GPUTexture *EEVEE_materials_get_util_tex(void); /* XXX */
654 void EEVEE_materials_init(EEVEE_StorageList *stl);
655 void EEVEE_materials_cache_init(EEVEE_Data *vedata);
656 void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob);
657 void EEVEE_materials_cache_finish(EEVEE_Data *vedata);
658 struct GPUMaterial *EEVEE_material_world_lightprobe_get(struct Scene *scene, struct World *wo);
659 struct GPUMaterial *EEVEE_material_world_background_get(struct Scene *scene, struct World *wo);
660 struct GPUMaterial *EEVEE_material_world_volume_get(struct Scene *scene, struct World *wo);
661 struct GPUMaterial *EEVEE_material_mesh_get(
662         struct Scene *scene, Material *ma, EEVEE_Data *vedata,
663         bool use_blend, bool use_multiply, bool use_refract, bool use_sss, bool use_translucency, int shadow_method);
664 struct GPUMaterial *EEVEE_material_mesh_volume_get(struct Scene *scene, Material *ma);
665 struct GPUMaterial *EEVEE_material_mesh_depth_get(struct Scene *scene, Material *ma, bool use_hashed_alpha, bool is_shadow);
666 struct GPUMaterial *EEVEE_material_hair_get(struct Scene *scene, Material *ma, int shadow_method);
667 void EEVEE_materials_free(void);
668 void EEVEE_draw_default_passes(EEVEE_PassList *psl);
669 void EEVEE_update_util_texture(float offset);
670
671 /* eevee_lights.c */
672 void EEVEE_lights_init(EEVEE_ViewLayerData *sldata);
673 void EEVEE_lights_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl);
674 void EEVEE_lights_cache_add(EEVEE_ViewLayerData *sldata, struct Object *ob);
675 void EEVEE_lights_cache_shcaster_add(
676         EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl, struct Gwn_Batch *geom, float (*obmat)[4]);
677 void EEVEE_lights_cache_shcaster_material_add(
678         EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl,
679         struct GPUMaterial *gpumat, struct Gwn_Batch *geom, struct Object *ob,
680         float (*obmat)[4], float *alpha_threshold);
681 void EEVEE_lights_cache_finish(EEVEE_ViewLayerData *sldata);
682 void EEVEE_lights_update(EEVEE_ViewLayerData *sldata);
683 void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl);
684 void EEVEE_lights_free(void);
685
686 /* eevee_lightprobes.c */
687 void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
688 void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
689 void EEVEE_lightprobes_cache_add(EEVEE_ViewLayerData *sldata, Object *ob);
690 void EEVEE_lightprobes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
691 void EEVEE_lightprobes_refresh(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
692 void EEVEE_lightprobes_free(void);
693
694 /* eevee_depth_of_field.c */
695 int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
696 void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
697 void EEVEE_depth_of_field_draw(EEVEE_Data *vedata);
698 void EEVEE_depth_of_field_free(void);
699
700 /* eevee_bloom.c */
701 int EEVEE_bloom_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
702 void EEVEE_bloom_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
703 void EEVEE_bloom_draw(EEVEE_Data *vedata);
704 void EEVEE_bloom_free(void);
705
706 /* eevee_occlusion.c */
707 int EEVEE_occlusion_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
708 void EEVEE_occlusion_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
709 void EEVEE_occlusion_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
710 void EEVEE_occlusion_draw_debug(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
711 void EEVEE_occlusion_free(void);
712
713 /* eevee_screen_raytrace.c */
714 int EEVEE_screen_raytrace_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
715 void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
716 void EEVEE_refraction_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
717 void EEVEE_reflection_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
718 void EEVEE_screen_raytrace_free(void);
719
720 /* eevee_subsurface.c */
721 int EEVEE_subsurface_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
722 void EEVEE_subsurface_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
723 void EEVEE_subsurface_add_pass(EEVEE_Data *vedata, unsigned int sss_id, struct GPUUniformBuffer *sss_profile);
724 void EEVEE_subsurface_data_render(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
725 void EEVEE_subsurface_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
726 void EEVEE_subsurface_free(void);
727
728 /* eevee_motion_blur.c */
729 int EEVEE_motion_blur_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
730 void EEVEE_motion_blur_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
731 void EEVEE_motion_blur_draw(EEVEE_Data *vedata);
732 void EEVEE_motion_blur_free(void);
733
734 /* eevee_temporal_sampling.c */
735 int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
736 void EEVEE_temporal_sampling_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
737 void EEVEE_temporal_sampling_draw(EEVEE_Data *vedata);
738 void EEVEE_temporal_sampling_free(void);
739
740 /* eevee_volumes.c */
741 int EEVEE_volumes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
742 void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
743 void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct Scene *scene, Object *ob);
744 void EEVEE_volumes_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
745 void EEVEE_volumes_resolve(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
746 void EEVEE_volumes_free_smoke_textures(void);
747 void EEVEE_volumes_free(void);
748
749 /* eevee_effects.c */
750 void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
751 void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
752 void EEVEE_create_minmax_buffer(EEVEE_Data *vedata, struct GPUTexture *depth_src, int layer);
753 void EEVEE_downsample_buffer(EEVEE_Data *vedata, struct GPUFrameBuffer *fb_src, struct GPUTexture *texture_src, int level);
754 void EEVEE_downsample_cube_buffer(EEVEE_Data *vedata, struct GPUFrameBuffer *fb_src, struct GPUTexture *texture_src, int level);
755 void EEVEE_effects_do_gtao(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
756 void EEVEE_draw_effects(EEVEE_Data *vedata);
757 void EEVEE_effects_free(void);
758
759 /* Shadow Matrix */
760 static const float texcomat[4][4] = { /* From NDC to TexCo */
761         {0.5f, 0.0f, 0.0f, 0.0f},
762         {0.0f, 0.5f, 0.0f, 0.0f},
763         {0.0f, 0.0f, 0.5f, 0.0f},
764         {0.5f, 0.5f, 0.5f, 1.0f}
765 };
766
767 /* Cubemap Matrices */
768 static const float cubefacemat[6][4][4] = {
769         /* Pos X */
770         {{0.0f, 0.0f, -1.0f, 0.0f},
771          {0.0f, -1.0f, 0.0f, 0.0f},
772          {-1.0f, 0.0f, 0.0f, 0.0f},
773          {0.0f, 0.0f, 0.0f, 1.0f}},
774         /* Neg X */
775         {{0.0f, 0.0f, 1.0f, 0.0f},
776          {0.0f, -1.0f, 0.0f, 0.0f},
777          {1.0f, 0.0f, 0.0f, 0.0f},
778          {0.0f, 0.0f, 0.0f, 1.0f}},
779         /* Pos Y */
780         {{1.0f, 0.0f, 0.0f, 0.0f},
781          {0.0f, 0.0f, -1.0f, 0.0f},
782          {0.0f, 1.0f, 0.0f, 0.0f},
783          {0.0f, 0.0f, 0.0f, 1.0f}},
784         /* Neg Y */
785         {{1.0f, 0.0f, 0.0f, 0.0f},
786          {0.0f, 0.0f, 1.0f, 0.0f},
787          {0.0f, -1.0f, 0.0f, 0.0f},
788          {0.0f, 0.0f, 0.0f, 1.0f}},
789         /* Pos Z */
790         {{1.0f, 0.0f, 0.0f, 0.0f},
791          {0.0f, -1.0f, 0.0f, 0.0f},
792          {0.0f, 0.0f, -1.0f, 0.0f},
793          {0.0f, 0.0f, 0.0f, 1.0f}},
794         /* Neg Z */
795         {{-1.0f, 0.0f, 0.0f, 0.0f},
796          {0.0f, -1.0f, 0.0f, 0.0f},
797          {0.0f, 0.0f, 1.0f, 0.0f},
798          {0.0f, 0.0f, 0.0f, 1.0f}},
799 };
800
801 #endif /* __EEVEE_PRIVATE_H__ */