doxygen: add newline after \file
[blender.git] / source / blender / draw / engines / eevee / eevee_private.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 DNA
21  */
22
23 #ifndef __EEVEE_PRIVATE_H__
24 #define __EEVEE_PRIVATE_H__
25
26 #include "DNA_lightprobe_types.h"
27
28 struct EEVEE_BoundSphere;
29 struct EEVEE_ShadowCasterBuffer;
30 struct GPUFrameBuffer;
31 struct Object;
32 struct RenderLayer;
33 struct RenderResult;
34
35 extern struct DrawEngineType draw_engine_eevee_type;
36
37 /* Minimum UBO is 16384 bytes */
38 #define MAX_PROBE 128 /* TODO : find size by dividing UBO max size by probe data size */
39 #define MAX_GRID 64 /* TODO : find size by dividing UBO max size by grid data size */
40 #define MAX_PLANAR 16 /* TODO : find size by dividing UBO max size by grid data size */
41 #define MAX_LIGHT 128 /* TODO : find size by dividing UBO max size by light data size */
42 #define MAX_CASCADE_NUM 4
43 #define MAX_SHADOW 256 /* TODO : Make this depends on GL_MAX_ARRAY_TEXTURE_LAYERS */
44 #define MAX_SHADOW_CASCADE 8
45 #define MAX_SHADOW_CUBE (MAX_SHADOW - MAX_CASCADE_NUM * MAX_SHADOW_CASCADE)
46 #define MAX_BLOOM_STEP 16
47
48 /* Only define one of these. */
49 // #define IRRADIANCE_SH_L2
50 // #define IRRADIANCE_CUBEMAP
51 #define IRRADIANCE_HL2
52 #define HAMMERSLEY_SIZE 1024
53
54 #if defined(IRRADIANCE_SH_L2)
55 #  define SHADER_IRRADIANCE "#define IRRADIANCE_SH_L2\n"
56 #elif defined(IRRADIANCE_CUBEMAP)
57 #  define SHADER_IRRADIANCE "#define IRRADIANCE_CUBEMAP\n"
58 #elif defined(IRRADIANCE_HL2)
59 #  define SHADER_IRRADIANCE "#define IRRADIANCE_HL2\n"
60 #endif
61
62 #define SHADER_DEFINES \
63         "#define EEVEE_ENGINE\n" \
64         "#define MAX_PROBE " STRINGIFY(MAX_PROBE) "\n" \
65         "#define MAX_GRID " STRINGIFY(MAX_GRID) "\n" \
66         "#define MAX_PLANAR " STRINGIFY(MAX_PLANAR) "\n" \
67         "#define MAX_LIGHT " STRINGIFY(MAX_LIGHT) "\n" \
68         "#define MAX_SHADOW " STRINGIFY(MAX_SHADOW) "\n" \
69         "#define MAX_SHADOW_CUBE " STRINGIFY(MAX_SHADOW_CUBE) "\n" \
70         "#define MAX_SHADOW_CASCADE " STRINGIFY(MAX_SHADOW_CASCADE) "\n" \
71         "#define MAX_CASCADE_NUM " STRINGIFY(MAX_CASCADE_NUM) "\n" \
72         SHADER_IRRADIANCE
73
74 #define SWAP_DOUBLE_BUFFERS() {                                       \
75         if (effects->swap_double_buffer) {                                \
76                 SWAP(struct GPUFrameBuffer *, fbl->main_fb, fbl->double_buffer_fb); \
77                 SWAP(struct GPUFrameBuffer *, fbl->main_color_fb, fbl->double_buffer_color_fb); \
78                 SWAP(GPUTexture *, txl->color, txl->color_double_buffer);     \
79                 effects->swap_double_buffer = false;                          \
80         }                                                                 \
81 } ((void)0)
82
83 #define SWAP_BUFFERS() {                           \
84         if (effects->target_buffer == fbl->effect_color_fb) { \
85                 SWAP_DOUBLE_BUFFERS();                     \
86                 effects->source_buffer = txl->color_post;  \
87                 effects->target_buffer = fbl->main_color_fb;  \
88         }                                              \
89         else {                                         \
90                 SWAP_DOUBLE_BUFFERS();                     \
91                 effects->source_buffer = txl->color;       \
92                 effects->target_buffer = fbl->effect_color_fb; \
93         }                                              \
94 } ((void)0)
95
96 #define SWAP_BUFFERS_TAA() {                           \
97         if (effects->target_buffer == fbl->effect_color_fb) { \
98                 SWAP(struct GPUFrameBuffer *, fbl->effect_fb, fbl->taa_history_fb); \
99                 SWAP(struct GPUFrameBuffer *, fbl->effect_color_fb, fbl->taa_history_color_fb); \
100                 SWAP(GPUTexture *, txl->color_post, txl->taa_history);     \
101                 effects->source_buffer = txl->taa_history;  \
102                 effects->target_buffer = fbl->effect_color_fb;  \
103         }                                              \
104         else {                                         \
105                 SWAP(struct GPUFrameBuffer *, fbl->main_fb, fbl->taa_history_fb); \
106                 SWAP(struct GPUFrameBuffer *, fbl->main_color_fb, fbl->taa_history_color_fb); \
107                 SWAP(GPUTexture *, txl->color, txl->taa_history);     \
108                 effects->source_buffer = txl->taa_history;  \
109                 effects->target_buffer = fbl->main_color_fb;  \
110         }                                              \
111 } ((void)0)
112
113 #define OVERLAY_ENABLED(v3d) ((v3d) && (v3d->flag2 & V3D_RENDER_OVERRIDE) == 0)
114 #define LOOK_DEV_MODE_ENABLED(v3d) ((v3d) && (v3d->shading.type == OB_MATERIAL))
115 #define LOOK_DEV_OVERLAY_ENABLED(v3d) (LOOK_DEV_MODE_ENABLED(v3d) && OVERLAY_ENABLED(v3d) && (v3d->overlay.flag & V3D_OVERLAY_LOOK_DEV))
116 #define USE_SCENE_LIGHT(v3d) ((!v3d) || (!LOOK_DEV_MODE_ENABLED(v3d)) || ((LOOK_DEV_MODE_ENABLED(v3d) && (v3d->shading.flag & V3D_SHADING_SCENE_LIGHTS))))
117 #define LOOK_DEV_STUDIO_LIGHT_ENABLED(v3d) (LOOK_DEV_MODE_ENABLED(v3d) && !(v3d->shading.flag & V3D_SHADING_SCENE_WORLD))
118
119 #define OCTAHEDRAL_SIZE_FROM_CUBESIZE(cube_size) ((int)ceilf(sqrtf((cube_size * cube_size) * 6.0f)))
120 #define MIN_CUBE_LOD_LEVEL 3
121 #define MAX_PLANAR_LOD_LEVEL 9
122
123 /* World shader variations */
124 enum {
125         VAR_WORLD_BACKGROUND    = 0,
126         VAR_WORLD_PROBE         = 1,
127         VAR_WORLD_VOLUME        = 2,
128 };
129
130 /* Material shader variations */
131 enum {
132         VAR_MAT_MESH        = (1 << 0),
133         VAR_MAT_PROBE       = (1 << 1),
134         VAR_MAT_HAIR        = (1 << 2),
135         VAR_MAT_FLAT        = (1 << 3),
136         VAR_MAT_BLEND       = (1 << 4),
137         VAR_MAT_VSM         = (1 << 5),
138         VAR_MAT_ESM         = (1 << 6),
139         VAR_MAT_VOLUME      = (1 << 7),
140         VAR_MAT_LOOKDEV = (1 << 8),
141         /* Max number of variation */
142         /* IMPORTANT : Leave it last and set
143          * it's value accordingly. */
144         VAR_MAT_MAX         = (1 << 9),
145         /* These are options that are not counted in VAR_MAT_MAX
146          * because they are not cumulative with the others above. */
147         VAR_MAT_CLIP        = (1 << 10),
148         VAR_MAT_HASH        = (1 << 11),
149         VAR_MAT_MULT        = (1 << 12),
150         VAR_MAT_SHADOW      = (1 << 13),
151         VAR_MAT_REFRACT     = (1 << 14),
152         VAR_MAT_SSS         = (1 << 15),
153         VAR_MAT_TRANSLUC    = (1 << 16),
154         VAR_MAT_SSSALBED    = (1 << 17),
155 };
156
157 /* ************ PROBE UBO ************* */
158
159 /* They are the same struct as their Cache siblings.
160  * typedef'ing just to keep the naming consistent with
161  * other eevee types. */
162 typedef LightProbeCache EEVEE_LightProbe;
163 typedef LightGridCache EEVEE_LightGrid;
164
165 typedef struct EEVEE_PlanarReflection {
166         float plane_equation[4];
167         float clip_vec_x[3], attenuation_scale;
168         float clip_vec_y[3], attenuation_bias;
169         float clip_edge_x_pos, clip_edge_x_neg;
170         float clip_edge_y_pos, clip_edge_y_neg;
171         float facing_scale, facing_bias, clipsta, pad;
172         float reflectionmat[4][4]; /* Used for sampling the texture. */
173         float mtx[4][4]; /* Not used in shader. TODO move elsewhere. */
174 } EEVEE_PlanarReflection;
175
176 /* --------------------------------------- */
177
178 typedef struct EEVEE_BoundSphere {
179         float center[3], radius;
180 } EEVEE_BoundSphere;
181
182 typedef struct EEVEE_BoundBox {
183         float center[3], halfdim[3];
184 } EEVEE_BoundBox;
185
186 typedef struct EEVEE_PassList {
187         /* Shadows */
188         struct DRWPass *shadow_pass;
189         struct DRWPass *shadow_cube_copy_pass;
190         struct DRWPass *shadow_cube_store_pass;
191         struct DRWPass *shadow_cube_store_high_pass;
192         struct DRWPass *shadow_cascade_copy_pass;
193         struct DRWPass *shadow_cascade_store_pass;
194         struct DRWPass *shadow_cascade_store_high_pass;
195
196         /* Probes */
197         struct DRWPass *probe_background;
198         struct DRWPass *probe_glossy_compute;
199         struct DRWPass *probe_diffuse_compute;
200         struct DRWPass *probe_visibility_compute;
201         struct DRWPass *probe_grid_fill;
202         struct DRWPass *probe_display;
203         struct DRWPass *probe_planar_downsample_ps;
204
205         /* Effects */
206         struct DRWPass *ao_horizon_search;
207         struct DRWPass *ao_horizon_search_layer;
208         struct DRWPass *ao_horizon_debug;
209         struct DRWPass *ao_accum_ps;
210         struct DRWPass *mist_accum_ps;
211         struct DRWPass *motion_blur;
212         struct DRWPass *bloom_blit;
213         struct DRWPass *bloom_downsample_first;
214         struct DRWPass *bloom_downsample;
215         struct DRWPass *bloom_upsample;
216         struct DRWPass *bloom_resolve;
217         struct DRWPass *dof_down;
218         struct DRWPass *dof_scatter;
219         struct DRWPass *dof_resolve;
220         struct DRWPass *volumetric_world_ps;
221         struct DRWPass *volumetric_objects_ps;
222         struct DRWPass *volumetric_scatter_ps;
223         struct DRWPass *volumetric_integration_ps;
224         struct DRWPass *volumetric_resolve_ps;
225         struct DRWPass *ssr_raytrace;
226         struct DRWPass *ssr_resolve;
227         struct DRWPass *sss_blur_ps;
228         struct DRWPass *sss_resolve_ps;
229         struct DRWPass *sss_accum_ps;
230         struct DRWPass *color_downsample_ps;
231         struct DRWPass *color_downsample_cube_ps;
232         struct DRWPass *velocity_resolve;
233         struct DRWPass *taa_resolve;
234
235         /* HiZ */
236         struct DRWPass *minz_downlevel_ps;
237         struct DRWPass *maxz_downlevel_ps;
238         struct DRWPass *minz_downdepth_ps;
239         struct DRWPass *maxz_downdepth_ps;
240         struct DRWPass *minz_downdepth_layer_ps;
241         struct DRWPass *maxz_downdepth_layer_ps;
242         struct DRWPass *minz_copydepth_ps;
243         struct DRWPass *maxz_copydepth_ps;
244         struct DRWPass *maxz_copydepth_layer_ps;
245
246         struct DRWPass *depth_pass;
247         struct DRWPass *depth_pass_cull;
248         struct DRWPass *depth_pass_clip;
249         struct DRWPass *depth_pass_clip_cull;
250         struct DRWPass *refract_depth_pass;
251         struct DRWPass *refract_depth_pass_cull;
252         struct DRWPass *refract_depth_pass_clip;
253         struct DRWPass *refract_depth_pass_clip_cull;
254         struct DRWPass *default_pass[VAR_MAT_MAX];
255         struct DRWPass *sss_pass;
256         struct DRWPass *material_pass;
257         struct DRWPass *refract_pass;
258         struct DRWPass *transparent_pass;
259         struct DRWPass *background_pass;
260         struct DRWPass *update_noise_pass;
261         struct DRWPass *lookdev_pass;
262 } EEVEE_PassList;
263
264 typedef struct EEVEE_FramebufferList {
265         /* Effects */
266         struct GPUFrameBuffer *gtao_fb;
267         struct GPUFrameBuffer *gtao_debug_fb;
268         struct GPUFrameBuffer *downsample_fb;
269         struct GPUFrameBuffer *bloom_blit_fb;
270         struct GPUFrameBuffer *bloom_down_fb[MAX_BLOOM_STEP];
271         struct GPUFrameBuffer *bloom_accum_fb[MAX_BLOOM_STEP - 1];
272         struct GPUFrameBuffer *sss_blur_fb;
273         struct GPUFrameBuffer *sss_blit_fb;
274         struct GPUFrameBuffer *sss_resolve_fb;
275         struct GPUFrameBuffer *sss_clear_fb;
276         struct GPUFrameBuffer *sss_accum_fb;
277         struct GPUFrameBuffer *dof_down_fb;
278         struct GPUFrameBuffer *dof_scatter_fb;
279         struct GPUFrameBuffer *volumetric_fb;
280         struct GPUFrameBuffer *volumetric_scat_fb;
281         struct GPUFrameBuffer *volumetric_integ_fb;
282         struct GPUFrameBuffer *screen_tracing_fb;
283         struct GPUFrameBuffer *refract_fb;
284         struct GPUFrameBuffer *mist_accum_fb;
285         struct GPUFrameBuffer *ao_accum_fb;
286         struct GPUFrameBuffer *velocity_resolve_fb;
287
288         struct GPUFrameBuffer *update_noise_fb;
289
290         struct GPUFrameBuffer *planarref_fb;
291         struct GPUFrameBuffer *planar_downsample_fb;
292
293         struct GPUFrameBuffer *main_fb;
294         struct GPUFrameBuffer *main_color_fb;
295         struct GPUFrameBuffer *effect_fb;
296         struct GPUFrameBuffer *effect_color_fb;
297         struct GPUFrameBuffer *double_buffer_fb;
298         struct GPUFrameBuffer *double_buffer_color_fb;
299         struct GPUFrameBuffer *double_buffer_depth_fb;
300         struct GPUFrameBuffer *taa_history_fb;
301         struct GPUFrameBuffer *taa_history_color_fb;
302 } EEVEE_FramebufferList;
303
304 typedef struct EEVEE_TextureList {
305         /* Effects */
306         struct GPUTexture *color_post; /* R16_G16_B16 */
307         struct GPUTexture *mist_accum;
308         struct GPUTexture *ao_accum;
309         struct GPUTexture *sss_dir_accum;
310         struct GPUTexture *sss_col_accum;
311         struct GPUTexture *refract_color;
312         struct GPUTexture *taa_history;
313
314         struct GPUTexture *volume_prop_scattering;
315         struct GPUTexture *volume_prop_extinction;
316         struct GPUTexture *volume_prop_emission;
317         struct GPUTexture *volume_prop_phase;
318         struct GPUTexture *volume_scatter;
319         struct GPUTexture *volume_transmittance;
320         struct GPUTexture *volume_scatter_history;
321         struct GPUTexture *volume_transmittance_history;
322
323         struct GPUTexture *lookdev_grid_tx;
324         struct GPUTexture *lookdev_cube_tx;
325
326         struct GPUTexture *planar_pool;
327         struct GPUTexture *planar_depth;
328
329         struct GPUTexture *maxzbuffer;
330
331         struct GPUTexture *color; /* R16_G16_B16 */
332         struct GPUTexture *color_double_buffer;
333         struct GPUTexture *depth_double_buffer;
334 } EEVEE_TextureList;
335
336 typedef struct EEVEE_StorageList {
337         /* Effects */
338         struct EEVEE_EffectsInfo *effects;
339
340         struct EEVEE_PrivateData *g_data;
341
342         struct LightCache *lookdev_lightcache;
343         EEVEE_LightProbe *lookdev_cube_data;
344         EEVEE_LightGrid  *lookdev_grid_data;
345         LightCacheTexture *lookdev_cube_mips;
346 } EEVEE_StorageList;
347
348 /* ************ LIGHT UBO ************* */
349 typedef struct EEVEE_Light {
350         float position[3], invsqrdist;
351         float color[3], spec;
352         float spotsize, spotblend, radius, shadowid;
353         float rightvec[3], sizex;
354         float upvec[3], sizey;
355         float forwardvec[3], lamptype;
356 } EEVEE_Light;
357
358 /* Special type for elliptic area lamps, matches lamps_lib.glsl */
359 #define LAMPTYPE_AREA_ELLIPSE 100.0f
360
361 typedef struct EEVEE_Shadow {
362         float near, far, bias, exp;
363         float shadow_start, data_start, multi_shadow_count, shadow_blur;
364         float contact_dist, contact_bias, contact_spread, contact_thickness;
365 } EEVEE_Shadow;
366
367 typedef struct EEVEE_ShadowCube {
368         float position[3], pad;
369 } EEVEE_ShadowCube;
370
371 typedef struct EEVEE_ShadowCascade {
372         /* World->Lamp->NDC->Tex : used for sampling the shadow map. */
373         float shadowmat[MAX_CASCADE_NUM][4][4];
374         float split_start[4];
375         float split_end[4];
376 } EEVEE_ShadowCascade;
377
378 typedef struct EEVEE_ShadowRender {
379         float position[3], pad;
380         float cube_texel_size;
381         float stored_texel_size;
382         float clip_near;
383         float clip_far;
384         int shadow_samples_len;
385         float shadow_samples_len_inv;
386         float exponent;
387 } EEVEE_ShadowRender;
388
389 /* This is just a really long bitflag with special function to access it. */
390 #define MAX_LIGHTBITS_FIELDS (MAX_LIGHT / 8)
391 typedef struct EEVEE_LightBits {
392         uchar fields[MAX_LIGHTBITS_FIELDS];
393 } EEVEE_LightBits;
394
395 typedef struct EEVEE_ShadowCaster {
396         struct EEVEE_LightBits bits;
397         struct EEVEE_BoundBox bbox;
398 } EEVEE_ShadowCaster;
399
400 typedef struct EEVEE_ShadowCasterBuffer {
401         struct EEVEE_ShadowCaster *shadow_casters;
402         char *flags;
403         uint alloc_count;
404         uint count;
405 } EEVEE_ShadowCasterBuffer;
406
407 /* ************ LIGHT DATA ************* */
408 typedef struct EEVEE_LampsInfo {
409         int num_light, cache_num_light;
410         int num_cube_layer, cache_num_cube_layer;
411         int num_cascade_layer, cache_num_cascade_layer;
412         int gpu_cube_len, gpu_cascade_len, gpu_shadow_len;
413         int cpu_cube_len, cpu_cascade_len;
414         int update_flag;
415         int shadow_cube_size, shadow_cascade_size, shadow_method;
416         bool shadow_high_bitdepth, soft_shadows;
417         int shadow_cube_store_size;
418         int current_shadow_cascade;
419         int current_shadow_face;
420         uint shadow_instance_count;
421         float filter_size;
422         /* List of lights in the scene. */
423         /* XXX This is fragile, can get out of sync quickly. */
424         struct Object *light_ref[MAX_LIGHT];
425         struct Object *shadow_cube_ref[MAX_SHADOW_CUBE];
426         struct Object *shadow_cascade_ref[MAX_SHADOW_CASCADE];
427         /* UBO Storage : data used by UBO */
428         struct EEVEE_Light         light_data[MAX_LIGHT];
429         struct EEVEE_ShadowRender  shadow_render_data;
430         struct EEVEE_Shadow        shadow_data[MAX_SHADOW];
431         struct EEVEE_ShadowCube    shadow_cube_data[MAX_SHADOW_CUBE];
432         struct EEVEE_ShadowCascade shadow_cascade_data[MAX_SHADOW_CASCADE];
433         /* Lights tracking */
434         int new_shadow_id[MAX_LIGHT]; /* To be able to convert old bitfield to new bitfield */
435         struct EEVEE_BoundSphere shadow_bounds[MAX_LIGHT]; /* Tightly packed light bounds  */
436         /* Pointers only. */
437         struct EEVEE_ShadowCasterBuffer *shcaster_frontbuffer;
438         struct EEVEE_ShadowCasterBuffer *shcaster_backbuffer;
439 } EEVEE_LampsInfo;
440
441 /* EEVEE_LampsInfo->shadow_casters_flag */
442 enum {
443         SHADOW_CASTER_PRUNED = (1 << 0),
444         SHADOW_CASTER_UPDATED = (1 << 1),
445 };
446
447 /* EEVEE_LampsInfo->update_flag */
448 enum {
449         LIGHT_UPDATE_SHADOW_CUBE = (1 << 0),
450 };
451
452 /* ************ PROBE DATA ************* */
453 typedef struct EEVEE_LightProbeVisTest {
454         struct Collection *collection; /* Skip test if NULL */
455         bool invert;
456         bool cached; /* Reuse last test results */
457 } EEVEE_LightProbeVisTest;
458
459 typedef struct EEVEE_LightProbesInfo {
460         int num_cube, cache_num_cube;
461         int num_grid, cache_num_grid;
462         int num_planar, cache_num_planar;
463         int total_irradiance_samples; /* Total for all grids */
464         int cache_irradiance_size[3];
465         int update_flag;
466         int updated_bounce;
467         int num_bounce;
468         int cubemap_res;
469         /* Update */
470         bool do_cube_update;
471         bool do_grid_update;
472         /* For rendering probes */
473         float probemat[6][4][4];
474         int layer;
475         float texel_size;
476         float padding_size;
477         float samples_len;
478         float samples_len_inv;
479         float near_clip;
480         float far_clip;
481         float roughness;
482         float firefly_fac;
483         float lodfactor;
484         float lod_rt_max, lod_cube_max, lod_planar_max;
485         float visibility_range;
486         float visibility_blur;
487         float intensity_fac;
488         int shres;
489         int studiolight_index;
490         float studiolight_rot_z;
491         EEVEE_LightProbeVisTest planar_vis_tests[MAX_PLANAR];
492         /* UBO Storage : data used by UBO */
493         EEVEE_LightProbe probe_data[MAX_PROBE];
494         EEVEE_LightGrid grid_data[MAX_GRID];
495         EEVEE_PlanarReflection planar_data[MAX_PLANAR];
496         /* Probe Visibility Collection */
497         EEVEE_LightProbeVisTest vis_data;
498 } EEVEE_LightProbesInfo;
499
500 /* EEVEE_LightProbesInfo->update_flag */
501 enum {
502         PROBE_UPDATE_CUBE = (1 << 0),
503         PROBE_UPDATE_GRID = (1 << 1),
504         PROBE_UPDATE_ALL  = 0xFFFFFF,
505 };
506
507 /* ************ EFFECTS DATA ************* */
508
509 typedef enum EEVEE_EffectsFlag {
510         EFFECT_MOTION_BLUR         = (1 << 0),
511         EFFECT_BLOOM               = (1 << 1),
512         EFFECT_DOF                 = (1 << 2),
513         EFFECT_VOLUMETRIC          = (1 << 3),
514         EFFECT_SSR                 = (1 << 4),
515         EFFECT_DOUBLE_BUFFER       = (1 << 5), /* Not really an effect but a feature */
516         EFFECT_REFRACT             = (1 << 6),
517         EFFECT_GTAO                = (1 << 7),
518         EFFECT_TAA                 = (1 << 8),
519         EFFECT_POST_BUFFER         = (1 << 9), /* Not really an effect but a feature */
520         EFFECT_NORMAL_BUFFER       = (1 << 10), /* Not really an effect but a feature */
521         EFFECT_SSS                 = (1 << 11),
522         EFFECT_VELOCITY_BUFFER     = (1 << 12), /* Not really an effect but a feature */
523         EFFECT_TAA_REPROJECT       = (1 << 13), /* should be mutually exclusive with EFFECT_TAA */
524         EFFECT_DEPTH_DOUBLE_BUFFER = (1 << 14), /* Not really an effect but a feature */
525 } EEVEE_EffectsFlag;
526
527 typedef struct EEVEE_EffectsInfo {
528         EEVEE_EffectsFlag enabled_effects;
529         bool swap_double_buffer;
530         /* SSSS */
531         int sss_sample_count;
532         bool sss_separate_albedo;
533         struct GPUTexture *sss_data; /* Textures from pool */
534         struct GPUTexture *sss_albedo;
535         struct GPUTexture *sss_blur;
536         struct GPUTexture *sss_stencil;
537         /* Volumetrics */
538         int volume_current_sample;
539         /* SSR */
540         bool reflection_trace_full;
541         bool ssr_was_persp;
542         int ssr_neighbor_ofs;
543         int ssr_halfres_ofs[2];
544         struct GPUTexture *ssr_normal_input; /* Textures from pool */
545         struct GPUTexture *ssr_specrough_input;
546         struct GPUTexture *ssr_hit_output;
547         struct GPUTexture *ssr_pdf_output;
548         /* Temporal Anti Aliasing */
549         int taa_reproject_sample;
550         int taa_current_sample;
551         int taa_render_sample;
552         int taa_total_sample;
553         float taa_alpha;
554         bool prev_drw_support;
555         float prev_drw_persmat[4][4];
556         float overide_persmat[4][4];
557         float overide_persinv[4][4];
558         float overide_winmat[4][4];
559         float overide_wininv[4][4];
560         /* Ambient Occlusion */
561         int ao_depth_layer;
562         struct GPUTexture *ao_src_depth; /* pointer copy */
563         struct GPUTexture *gtao_horizons; /* Textures from pool */
564         struct GPUTexture *gtao_horizons_debug;
565         /* Motion Blur */
566         float current_ndc_to_world[4][4];
567         float past_world_to_ndc[4][4];
568         int motion_blur_samples;
569         /* Velocity Pass */
570         float velocity_curr_persinv[4][4];
571         float velocity_past_persmat[4][4];
572         struct GPUTexture *velocity_tx; /* Texture from pool */
573         /* Depth Of Field */
574         float dof_near_far[2];
575         float dof_params[3];
576         float dof_bokeh[4];
577         float dof_bokeh_sides[4];
578         int dof_target_size[2];
579         struct GPUTexture *dof_down_near; /* Textures from pool */
580         struct GPUTexture *dof_down_far;
581         struct GPUTexture *dof_coc;
582         struct GPUTexture *dof_blur;
583         struct GPUTexture *dof_blur_alpha;
584         /* Other */
585         float prev_persmat[4][4];
586         /* Bloom */
587         int bloom_iteration_len;
588         float source_texel_size[2];
589         float blit_texel_size[2];
590         float downsamp_texel_size[MAX_BLOOM_STEP][2];
591         float bloom_color[3];
592         float bloom_clamp;
593         float bloom_sample_scale;
594         float bloom_curve_threshold[4];
595         float unf_source_texel_size[2];
596         struct GPUTexture *bloom_blit; /* Textures from pool */
597         struct GPUTexture *bloom_downsample[MAX_BLOOM_STEP];
598         struct GPUTexture *bloom_upsample[MAX_BLOOM_STEP - 1];
599         struct GPUTexture *unf_source_buffer; /* pointer copy */
600         struct GPUTexture *unf_base_buffer; /* pointer copy */
601         /* Not alloced, just a copy of a *GPUtexture in EEVEE_TextureList. */
602         struct GPUTexture *source_buffer;       /* latest updated texture */
603         struct GPUFrameBuffer *target_buffer;   /* next target to render to */
604         struct GPUTexture *final_tx;            /* Final color to transform to display color space. */
605         struct GPUFrameBuffer *final_fb;        /* Framebuffer with final_tx as attachement. */
606 } EEVEE_EffectsInfo;
607
608 /* ***************** COMMON DATA **************** */
609
610 /* Common uniform buffer containing all "constant" data over the whole drawing pipeline. */
611 /* !! CAUTION !!
612  * - [i]vec3 need to be padded to [i]vec4 (even in ubo declaration).
613  * - Make sure that [i]vec4 start at a multiple of 16 bytes.
614  * - Arrays of vec2/vec3 are padded as arrays of vec4.
615  * - sizeof(bool) == sizeof(int) in GLSL so use int in C */
616 typedef struct EEVEE_CommonUniformBuffer {
617         float prev_persmat[4][4]; /* mat4 */
618         float view_vecs[2][4]; /* vec4[2] */
619         float mip_ratio[10][4]; /* vec2[10] */
620         /* Ambient Occlusion */
621         /* -- 16 byte aligned -- */
622         float ao_dist, pad1, ao_factor, pad2; /* vec4 */
623         float ao_offset, ao_bounce_fac, ao_quality, ao_settings; /* vec4 */
624         /* Volumetric */
625         /* -- 16 byte aligned -- */
626         int vol_tex_size[3], pad3; /* ivec3 */
627         float vol_depth_param[3], pad4; /* vec3 */
628         float vol_inv_tex_size[3], pad5; /* vec3 */
629         float vol_jitter[3], pad6; /* vec3 */
630         float vol_coord_scale[2], pad7[2]; /* vec2 */
631         /* -- 16 byte aligned -- */
632         float vol_history_alpha; /* float */
633         float vol_light_clamp; /* float */
634         float vol_shadow_steps; /* float */
635         int vol_use_lights; /* bool */
636         /* Screen Space Reflections */
637         /* -- 16 byte aligned -- */
638         float ssr_quality, ssr_thickness, ssr_pixelsize[2]; /* vec4 */
639         float ssr_border_fac; /* float */
640         float ssr_max_roughness; /* float */
641         float ssr_firefly_fac; /* float */
642         float ssr_brdf_bias; /* float */
643         int ssr_toggle; /* bool */
644         /* SubSurface Scattering */
645         float sss_jitter_threshold; /* float */
646         int sss_toggle; /* bool */
647         /* Specular */
648         int spec_toggle; /* bool */
649         /* Lamps */
650         int la_num_light; /* int */
651         /* Probes */
652         int prb_num_planar; /* int */
653         int prb_num_render_cube; /* int */
654         int prb_num_render_grid; /* int */
655         int prb_irradiance_vis_size; /* int */
656         float prb_irradiance_smooth; /* float */
657         float prb_lod_cube_max; /* float */
658         float prb_lod_planar_max; /* float */
659         /* Misc */
660         int hiz_mip_offset; /* int */
661         int ray_type; /* int */
662         float ray_depth; /* float */
663 } EEVEE_CommonUniformBuffer;
664
665 /* ray_type (keep in sync with rayType) */
666 #define EEVEE_RAY_CAMERA    0
667 #define EEVEE_RAY_SHADOW    1
668 #define EEVEE_RAY_DIFFUSE   2
669 #define EEVEE_RAY_GLOSSY    3
670
671 /* ***************** CLIP PLANES DATA **************** */
672
673 typedef struct EEVEE_ClipPlanesUniformBuffer {
674         float clip_planes[1][4]; /* must be less than MAX_CLIP_PLANES */
675 } EEVEE_ClipPlanesUniformBuffer;
676
677 /* ************** SCENE LAYER DATA ************** */
678 typedef struct EEVEE_ViewLayerData {
679         /* Lamps */
680         struct EEVEE_LampsInfo *lamps;
681
682         struct GPUUniformBuffer *light_ubo;
683         struct GPUUniformBuffer *shadow_ubo;
684         struct GPUUniformBuffer *shadow_render_ubo;
685         struct GPUUniformBuffer *shadow_samples_ubo;
686
687         struct GPUFrameBuffer *shadow_cube_target_fb;
688         struct GPUFrameBuffer *shadow_cube_store_fb;
689         struct GPUFrameBuffer *shadow_cascade_target_fb;
690         struct GPUFrameBuffer *shadow_cascade_store_fb;
691
692         struct GPUTexture *shadow_cube_target;
693         struct GPUTexture *shadow_cube_blur;
694         struct GPUTexture *shadow_cascade_target;
695         struct GPUTexture *shadow_cascade_blur;
696         struct GPUTexture *shadow_cube_pool;
697         struct GPUTexture *shadow_cascade_pool;
698
699         struct EEVEE_ShadowCasterBuffer shcasters_buffers[2];
700
701         /* Probes */
702         struct EEVEE_LightProbesInfo *probes;
703
704         struct GPUUniformBuffer *probe_ubo;
705         struct GPUUniformBuffer *grid_ubo;
706         struct GPUUniformBuffer *planar_ubo;
707
708         /* Common Uniform Buffer */
709         struct EEVEE_CommonUniformBuffer common_data;
710         struct GPUUniformBuffer *common_ubo;
711
712         struct EEVEE_ClipPlanesUniformBuffer clip_data;
713         struct GPUUniformBuffer *clip_ubo;
714
715         struct LightCache *fallback_lightcache;
716 } EEVEE_ViewLayerData;
717
718 /* ************ OBJECT DATA ************ */
719
720 typedef struct EEVEE_LightData {
721         short light_id, shadow_id;
722 } EEVEE_LightData;
723
724 typedef struct EEVEE_ShadowCubeData {
725         short light_id, shadow_id, cube_id, layer_id;
726 } EEVEE_ShadowCubeData;
727
728 typedef struct EEVEE_ShadowCascadeData {
729         short light_id, shadow_id, cascade_id, layer_id;
730         /* World->Lamp->NDC : used for rendering the shadow map. */
731         float viewprojmat[MAX_CASCADE_NUM][4][4];
732         float projmat[MAX_CASCADE_NUM][4][4];
733         float viewmat[4][4], viewinv[4][4];
734         float radius[MAX_CASCADE_NUM];
735 } EEVEE_ShadowCascadeData;
736
737 /* Theses are the structs stored inside Objects.
738  * It works with even if the object is in multiple layers
739  * because we don't get the same "Object *" for each layer. */
740 typedef struct EEVEE_LampEngineData {
741         DrawData dd;
742
743         bool need_update;
744         /* This needs to be out of the union to avoid undefined behavior. */
745         short prev_cube_shadow_id;
746         union {
747                 struct EEVEE_LightData ld;
748                 struct EEVEE_ShadowCubeData scd;
749                 struct EEVEE_ShadowCascadeData scad;
750         } data;
751 } EEVEE_LampEngineData;
752
753 typedef struct EEVEE_LightProbeEngineData {
754         DrawData dd;
755
756         bool need_update;
757 } EEVEE_LightProbeEngineData;
758
759 typedef struct EEVEE_ObjectEngineData {
760         DrawData dd;
761
762         Object *ob; /* self reference */
763         EEVEE_LightProbeVisTest *test_data;
764         bool ob_vis, ob_vis_dirty;
765
766         bool need_update;
767         uint shadow_caster_id;
768 } EEVEE_ObjectEngineData;
769
770 typedef struct EEVEE_WorldEngineData {
771         DrawData dd;
772 } EEVEE_WorldEngineData;
773
774 /* *********************************** */
775
776 typedef struct EEVEE_Data {
777         void *engine_type;
778         EEVEE_FramebufferList *fbl;
779         EEVEE_TextureList *txl;
780         EEVEE_PassList *psl;
781         EEVEE_StorageList *stl;
782 } EEVEE_Data;
783
784 typedef struct EEVEE_PrivateData {
785         struct DRWShadingGroup *shadow_shgrp;
786         struct DRWShadingGroup *depth_shgrp;
787         struct DRWShadingGroup *depth_shgrp_cull;
788         struct DRWShadingGroup *depth_shgrp_clip;
789         struct DRWShadingGroup *depth_shgrp_clip_cull;
790         struct DRWShadingGroup *refract_depth_shgrp;
791         struct DRWShadingGroup *refract_depth_shgrp_cull;
792         struct DRWShadingGroup *refract_depth_shgrp_clip;
793         struct DRWShadingGroup *refract_depth_shgrp_clip_cull;
794         struct DRWShadingGroup *cube_display_shgrp;
795         struct DRWShadingGroup *planar_display_shgrp;
796         struct GHash *material_hash;
797         float background_alpha; /* TODO find a better place for this. */
798         /* Chosen lightcache: can come from Lookdev or the viewlayer. */
799         struct LightCache *light_cache;
800         /* For planar probes */
801         float planar_texel_size[2];
802         /* For double buffering */
803         bool view_updated;
804         bool valid_double_buffer;
805         bool valid_taa_history;
806         /* Render Matrices */
807         float persmat[4][4], persinv[4][4];
808         float viewmat[4][4], viewinv[4][4];
809         float winmat[4][4], wininv[4][4];
810         float studiolight_matrix[3][3];
811         float overscan, overscan_pixels;
812         float size_orig[2];
813
814         /* Mist Settings */
815         float mist_start, mist_inv_dist, mist_falloff;
816
817         /* Color Management */
818         bool use_color_render_settings;
819 } EEVEE_PrivateData; /* Transient data */
820
821 /* eevee_data.c */
822 void EEVEE_view_layer_data_free(void *sldata);
823 EEVEE_ViewLayerData *EEVEE_view_layer_data_get(void);
824 EEVEE_ViewLayerData *EEVEE_view_layer_data_ensure_ex(struct ViewLayer *view_layer);
825 EEVEE_ViewLayerData *EEVEE_view_layer_data_ensure(void);
826 EEVEE_ObjectEngineData *EEVEE_object_data_get(Object *ob);
827 EEVEE_ObjectEngineData *EEVEE_object_data_ensure(Object *ob);
828 EEVEE_LightProbeEngineData *EEVEE_lightprobe_data_get(Object *ob);
829 EEVEE_LightProbeEngineData *EEVEE_lightprobe_data_ensure(Object *ob);
830 EEVEE_LampEngineData *EEVEE_lamp_data_get(Object *ob);
831 EEVEE_LampEngineData *EEVEE_lamp_data_ensure(Object *ob);
832 EEVEE_WorldEngineData *EEVEE_world_data_get(World *wo);
833 EEVEE_WorldEngineData *EEVEE_world_data_ensure(World *wo);
834
835 /* eevee_materials.c */
836 struct GPUTexture *EEVEE_materials_get_util_tex(void); /* XXX */
837 void EEVEE_materials_init(EEVEE_ViewLayerData *sldata, EEVEE_StorageList *stl, EEVEE_FramebufferList *fbl);
838 void EEVEE_materials_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
839 void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob, bool *cast_shadow);
840 void EEVEE_hair_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob, bool *cast_shadow);
841 void EEVEE_materials_cache_finish(EEVEE_Data *vedata);
842 struct GPUMaterial *EEVEE_material_world_lightprobe_get(struct Scene *scene, struct World *wo);
843 struct GPUMaterial *EEVEE_material_world_background_get(struct Scene *scene, struct World *wo);
844 struct GPUMaterial *EEVEE_material_world_volume_get(struct Scene *scene, struct World *wo);
845 struct GPUMaterial *EEVEE_material_mesh_get(
846         struct Scene *scene, Material *ma, EEVEE_Data *vedata,
847         bool use_blend, bool use_multiply, bool use_refract, bool use_sss, bool use_translucency, int shadow_method);
848 struct GPUMaterial *EEVEE_material_mesh_volume_get(
849         struct Scene *scene, Material *ma);
850 struct GPUMaterial *EEVEE_material_mesh_depth_get(
851         struct Scene *scene, Material *ma, bool use_hashed_alpha, bool is_shadow);
852 struct GPUMaterial *EEVEE_material_hair_get(struct Scene *scene, Material *ma, int shadow_method);
853 void EEVEE_materials_free(void);
854 void EEVEE_draw_default_passes(EEVEE_PassList *psl);
855 void EEVEE_update_noise(EEVEE_PassList *psl, EEVEE_FramebufferList *fbl, const double offsets[3]);
856
857 /* eevee_lights.c */
858 void EEVEE_lights_init(EEVEE_ViewLayerData *sldata);
859 void EEVEE_lights_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
860 void EEVEE_lights_cache_add(EEVEE_ViewLayerData *sldata, struct Object *ob);
861 void EEVEE_lights_cache_shcaster_add(
862         EEVEE_ViewLayerData *sldata, EEVEE_StorageList *stl, struct GPUBatch *geom, Object *ob);
863 void EEVEE_lights_cache_shcaster_material_add(
864         EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl,
865         struct GPUMaterial *gpumat, struct GPUBatch *geom, struct Object *ob,
866         float *alpha_threshold);
867 void EEVEE_lights_cache_shcaster_object_add(EEVEE_ViewLayerData *sldata, struct Object *ob);
868 void EEVEE_lights_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
869 void EEVEE_lights_update(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
870 void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
871 void EEVEE_lights_free(void);
872
873
874 /* eevee_shaders.c */
875 void EEVEE_shaders_lightprobe_shaders_init(void);
876 struct GPUShader *EEVEE_shaders_probe_filter_glossy_sh_get(void);
877 struct GPUShader *EEVEE_shaders_probe_default_sh_get(void);
878 struct GPUShader *EEVEE_shaders_probe_filter_diffuse_sh_get(void);
879 struct GPUShader *EEVEE_shaders_probe_filter_visibility_sh_get(void);
880 struct GPUShader *EEVEE_shaders_probe_grid_fill_sh_get(void);
881 struct GPUShader *EEVEE_shaders_probe_planar_downsample_sh_get(void);
882 struct GPUShader *EEVEE_shaders_default_studiolight_sh_get(void);
883 struct GPUShader *EEVEE_shaders_probe_cube_display_sh_get(void);
884 struct GPUShader *EEVEE_shaders_probe_grid_display_sh_get(void);
885 struct GPUShader *EEVEE_shaders_probe_planar_display_sh_get(void);
886 struct GPUShader *EEVEE_shaders_velocity_resolve_sh_get(void);
887 struct GPUShader *EEVEE_shaders_taa_resolve_sh_get(EEVEE_EffectsFlag enabled_effects);
888 void EEVEE_shaders_free(void);
889
890 /* eevee_lightprobes.c */
891 bool EEVEE_lightprobes_obj_visibility_cb(bool vis_in, void *user_data);
892 void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
893 void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
894 void EEVEE_lightprobes_cache_add(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *ob);
895 void EEVEE_lightprobes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
896 void EEVEE_lightprobes_refresh(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
897 void EEVEE_lightprobes_refresh_planar(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
898 void EEVEE_lightprobes_free(void);
899
900 void EEVEE_lightbake_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, GPUTexture *rt_color, GPUTexture *rt_depth);
901 void EEVEE_lightbake_render_world(
902         EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUFrameBuffer *face_fb[6]);
903 void EEVEE_lightbake_render_scene(
904         EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUFrameBuffer *face_fb[6],
905         const float pos[3], float near_clip, float far_clip);
906 void EEVEE_lightbake_filter_glossy(
907         EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *rt_color, struct GPUFrameBuffer *fb,
908         int probe_idx, float intensity, int maxlevel, float filter_quality, float firefly_fac);
909 void EEVEE_lightbake_filter_diffuse(
910         EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *rt_color, struct GPUFrameBuffer *fb,
911         int grid_offset, float intensity);
912 void EEVEE_lightbake_filter_visibility(
913         EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *rt_depth, struct GPUFrameBuffer *fb,
914         int grid_offset, float clipsta, float clipend, float vis_range, float vis_blur, int vis_size);
915
916 void EEVEE_lightprobes_grid_data_from_object(Object *ob, EEVEE_LightGrid *prb_data, int *offset);
917 void EEVEE_lightprobes_cube_data_from_object(Object *ob, EEVEE_LightProbe *prb_data);
918 void EEVEE_lightprobes_planar_data_from_object(Object *ob, EEVEE_PlanarReflection *eplanar, EEVEE_LightProbeVisTest *vis_test);
919
920 /* eevee_depth_of_field.c */
921 int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera);
922 void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
923 void EEVEE_depth_of_field_draw(EEVEE_Data *vedata);
924 void EEVEE_depth_of_field_free(void);
925
926 /* eevee_bloom.c */
927 int EEVEE_bloom_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
928 void EEVEE_bloom_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
929 void EEVEE_bloom_draw(EEVEE_Data *vedata);
930 void EEVEE_bloom_free(void);
931
932 /* eevee_occlusion.c */
933 int EEVEE_occlusion_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
934 void EEVEE_occlusion_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
935 void EEVEE_occlusion_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
936 void EEVEE_occlusion_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
937 void EEVEE_occlusion_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *depth_src, int layer);
938 void EEVEE_occlusion_draw_debug(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
939 void EEVEE_occlusion_free(void);
940
941 /* eevee_screen_raytrace.c */
942 int EEVEE_screen_raytrace_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
943 void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
944 void EEVEE_refraction_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
945 void EEVEE_reflection_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
946 void EEVEE_screen_raytrace_free(void);
947
948 /* eevee_subsurface.c */
949 int EEVEE_subsurface_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
950 void EEVEE_subsurface_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
951 void EEVEE_subsurface_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
952 void EEVEE_subsurface_add_pass(
953         EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, uint sss_id, struct GPUUniformBuffer *sss_profile);
954 void EEVEE_subsurface_data_render(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
955 void EEVEE_subsurface_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
956 void EEVEE_subsurface_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
957 void EEVEE_subsurface_free(void);
958
959 /* eevee_motion_blur.c */
960 int EEVEE_motion_blur_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera);
961 void EEVEE_motion_blur_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
962 void EEVEE_motion_blur_draw(EEVEE_Data *vedata);
963 void EEVEE_motion_blur_free(void);
964
965 /* eevee_mist.c */
966 void EEVEE_mist_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
967 void EEVEE_mist_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
968 void EEVEE_mist_free(void);
969
970 /* eevee_temporal_sampling.c */
971 void EEVEE_temporal_sampling_reset(EEVEE_Data *vedata);
972 int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
973 void EEVEE_temporal_sampling_matrices_calc(
974         EEVEE_EffectsInfo *effects, float viewmat[4][4], float persmat[4][4], const double ht_point[2]);
975 void EEVEE_temporal_sampling_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
976 void EEVEE_temporal_sampling_draw(EEVEE_Data *vedata);
977
978 /* eevee_volumes.c */
979 int EEVEE_volumes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
980 void EEVEE_volumes_set_jitter(EEVEE_ViewLayerData *sldata, uint current_sample);
981 void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
982 void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct Scene *scene, Object *ob);
983 void EEVEE_volumes_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
984 void EEVEE_volumes_resolve(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
985 void EEVEE_volumes_free_smoke_textures(void);
986 void EEVEE_volumes_free(void);
987
988 /* eevee_effects.c */
989 void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera, const bool minimal);
990 void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
991 void EEVEE_create_minmax_buffer(EEVEE_Data *vedata, struct GPUTexture *depth_src, int layer);
992 void EEVEE_downsample_buffer(EEVEE_Data *vedata, struct GPUTexture *texture_src, int level);
993 void EEVEE_downsample_cube_buffer(EEVEE_Data *vedata, struct GPUTexture *texture_src, int level);
994 void EEVEE_draw_effects(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
995 void EEVEE_effects_free(void);
996
997 /* eevee_render.c */
998 void EEVEE_render_init(EEVEE_Data *vedata, struct RenderEngine *engine, struct Depsgraph *depsgraph);
999 void EEVEE_render_cache(void *vedata, struct Object *ob, struct RenderEngine *engine, struct Depsgraph *depsgraph);
1000 void EEVEE_render_draw(EEVEE_Data *vedata, struct RenderEngine *engine, struct RenderLayer *render_layer, const struct rcti *rect);
1001 void EEVEE_render_update_passes(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer);
1002
1003 /** eevee_lookdev.c */
1004 void EEVEE_lookdev_cache_init(EEVEE_Data *vedata, DRWShadingGroup **grp, DRWPass *pass, struct World *world, EEVEE_LightProbesInfo *pinfo);
1005 void EEVEE_lookdev_draw_background(EEVEE_Data *vedata);
1006
1007 /** eevee_engine.c */
1008 void EEVEE_cache_populate(void *vedata, Object *ob);
1009
1010 /* Shadow Matrix */
1011 static const float texcomat[4][4] = { /* From NDC to TexCo */
1012         {0.5f, 0.0f, 0.0f, 0.0f},
1013         {0.0f, 0.5f, 0.0f, 0.0f},
1014         {0.0f, 0.0f, 0.5f, 0.0f},
1015         {0.5f, 0.5f, 0.5f, 1.0f},
1016 };
1017
1018 /* Cubemap Matrices */
1019 static const float cubefacemat[6][4][4] = {
1020         /* Pos X */
1021         {{0.0f, 0.0f, -1.0f, 0.0f},
1022          {0.0f, -1.0f, 0.0f, 0.0f},
1023          {-1.0f, 0.0f, 0.0f, 0.0f},
1024          {0.0f, 0.0f, 0.0f, 1.0f}},
1025         /* Neg X */
1026         {{0.0f, 0.0f, 1.0f, 0.0f},
1027          {0.0f, -1.0f, 0.0f, 0.0f},
1028          {1.0f, 0.0f, 0.0f, 0.0f},
1029          {0.0f, 0.0f, 0.0f, 1.0f}},
1030         /* Pos Y */
1031         {{1.0f, 0.0f, 0.0f, 0.0f},
1032          {0.0f, 0.0f, -1.0f, 0.0f},
1033          {0.0f, 1.0f, 0.0f, 0.0f},
1034          {0.0f, 0.0f, 0.0f, 1.0f}},
1035         /* Neg Y */
1036         {{1.0f, 0.0f, 0.0f, 0.0f},
1037          {0.0f, 0.0f, 1.0f, 0.0f},
1038          {0.0f, -1.0f, 0.0f, 0.0f},
1039          {0.0f, 0.0f, 0.0f, 1.0f}},
1040         /* Pos Z */
1041         {{1.0f, 0.0f, 0.0f, 0.0f},
1042          {0.0f, -1.0f, 0.0f, 0.0f},
1043          {0.0f, 0.0f, -1.0f, 0.0f},
1044          {0.0f, 0.0f, 0.0f, 1.0f}},
1045         /* Neg Z */
1046         {{-1.0f, 0.0f, 0.0f, 0.0f},
1047          {0.0f, -1.0f, 0.0f, 0.0f},
1048          {0.0f, 0.0f, 1.0f, 0.0f},
1049          {0.0f, 0.0f, 0.0f, 1.0f}},
1050 };
1051
1052 #endif /* __EEVEE_PRIVATE_H__ */