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