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