Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <jeroen@blender.org>2020-09-07 09:19:09 +0300
committerJeroen Bakker <jeroen@blender.org>2020-09-07 09:21:41 +0300
commit7170f7a0414ecded72fba3ef69e28be2be148291 (patch)
treed98075a0c6695f8ddb9f85fc5f728a5e837c2d1c /source/blender/draw/engines/eevee
parent267b8e1a5c322c87d9684638cc29c984c6d33e58 (diff)
EEVEE: Shaders tests
This will add the remaining static shaders to the eevee shader test suite. - Downsampling - GGX LUT generation - Mist - Motion Blur - Ambient Occlusion - Render Passes - Screen Raytracing - Shadows - Subsurface - Volumes Reviewed By: Clément Foucault Differential Revision: https://developer.blender.org/D8779
Diffstat (limited to 'source/blender/draw/engines/eevee')
-rw-r--r--source/blender/draw/engines/eevee/eevee_effects.c96
-rw-r--r--source/blender/draw/engines/eevee/eevee_engine.c7
-rw-r--r--source/blender/draw/engines/eevee/eevee_lut_gen.c24
-rw-r--r--source/blender/draw/engines/eevee/eevee_mist.c25
-rw-r--r--source/blender/draw/engines/eevee/eevee_motion_blur.c67
-rw-r--r--source/blender/draw/engines/eevee/eevee_occlusion.c43
-rw-r--r--source/blender/draw/engines/eevee/eevee_private.h55
-rw-r--r--source/blender/draw/engines/eevee/eevee_renderpasses.c24
-rw-r--r--source/blender/draw/engines/eevee/eevee_screen_raytrace.c62
-rw-r--r--source/blender/draw/engines/eevee/eevee_shaders.c527
-rw-r--r--source/blender/draw/engines/eevee/eevee_shadows.c31
-rw-r--r--source/blender/draw/engines/eevee/eevee_subsurface.c39
-rw-r--r--source/blender/draw/engines/eevee/eevee_temporal_sampling.c4
-rw-r--r--source/blender/draw/engines/eevee/eevee_volumes.c100
-rw-r--r--source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl2
15 files changed, 634 insertions, 472 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index a7b067c99d6..2bd1a875371 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -33,21 +33,6 @@
#include "eevee_private.h"
static struct {
- /* Downsample Depth */
- struct GPUShader *minz_downlevel_sh;
- struct GPUShader *maxz_downlevel_sh;
- struct GPUShader *minz_downdepth_sh;
- struct GPUShader *maxz_downdepth_sh;
- struct GPUShader *minz_downdepth_layer_sh;
- struct GPUShader *maxz_downdepth_layer_sh;
- struct GPUShader *maxz_copydepth_layer_sh;
- struct GPUShader *minz_copydepth_sh;
- struct GPUShader *maxz_copydepth_sh;
-
- /* Simple Downsample */
- struct GPUShader *downsample_sh;
- struct GPUShader *downsample_cube_sh;
-
/* These are just references, not actually allocated */
struct GPUTexture *depth_src;
struct GPUTexture *color_src;
@@ -56,49 +41,6 @@ static struct {
float cube_texel_size;
} e_data = {NULL}; /* Engine data */
-extern char datatoc_common_uniforms_lib_glsl[];
-extern char datatoc_common_view_lib_glsl[];
-extern char datatoc_bsdf_common_lib_glsl[];
-extern char datatoc_effect_minmaxz_frag_glsl[];
-extern char datatoc_effect_downsample_frag_glsl[];
-extern char datatoc_effect_downsample_cube_frag_glsl[];
-extern char datatoc_lightprobe_vert_glsl[];
-extern char datatoc_lightprobe_geom_glsl[];
-
-static void eevee_create_shader_downsample(void)
-{
- e_data.downsample_sh = DRW_shader_create_fullscreen(datatoc_effect_downsample_frag_glsl, NULL);
- e_data.downsample_cube_sh = DRW_shader_create(datatoc_lightprobe_vert_glsl,
- datatoc_lightprobe_geom_glsl,
- datatoc_effect_downsample_cube_frag_glsl,
- NULL);
-
- e_data.minz_downlevel_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
- "#define MIN_PASS\n");
- e_data.maxz_downlevel_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
- "#define MAX_PASS\n");
- e_data.minz_downdepth_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
- "#define MIN_PASS\n");
- e_data.maxz_downdepth_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
- "#define MAX_PASS\n");
- e_data.minz_downdepth_layer_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
- "#define MIN_PASS\n"
- "#define LAYERED\n");
- e_data.maxz_downdepth_layer_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
- "#define MAX_PASS\n"
- "#define LAYERED\n");
- e_data.maxz_copydepth_layer_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
- "#define MAX_PASS\n"
- "#define COPY_DEPTH\n"
- "#define LAYERED\n");
- e_data.minz_copydepth_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
- "#define MIN_PASS\n"
- "#define COPY_DEPTH\n");
- e_data.maxz_copydepth_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
- "#define MAX_PASS\n"
- "#define COPY_DEPTH\n");
-}
-
#define SETUP_BUFFER(tex, fb, fb_color) \
{ \
eGPUTextureFormat format = (DRW_state_is_scene_render()) ? GPU_RGBA32F : GPU_RGBA16F; \
@@ -140,11 +82,6 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata,
const float *viewport_size = DRW_viewport_size_get();
const int size_fs[2] = {(int)viewport_size[0], (int)viewport_size[1]};
- /* Shaders */
- if (!e_data.downsample_sh) {
- eevee_create_shader_downsample();
- }
-
if (!stl->effects) {
stl->effects = MEM_callocN(sizeof(EEVEE_EffectsInfo), "EEVEE_EffectsInfo");
stl->effects->taa_render_sample = 1;
@@ -284,7 +221,7 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
{
DRW_PASS_CREATE(psl->color_downsample_ps, DRW_STATE_WRITE_COLOR);
- grp = DRW_shgroup_create(e_data.downsample_sh, psl->color_downsample_ps);
+ grp = DRW_shgroup_create(EEVEE_shaders_effect_downsample_sh_get(), psl->color_downsample_ps);
DRW_shgroup_uniform_texture_ref(grp, "source", &e_data.color_src);
DRW_shgroup_uniform_float(grp, "fireflyFactor", &sldata->common_data.ssr_firefly_fac, 1);
DRW_shgroup_call(grp, quad, NULL);
@@ -292,7 +229,8 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
{
DRW_PASS_CREATE(psl->color_downsample_cube_ps, DRW_STATE_WRITE_COLOR);
- grp = DRW_shgroup_create(e_data.downsample_cube_sh, psl->color_downsample_cube_ps);
+ grp = DRW_shgroup_create(EEVEE_shaders_effect_downsample_cube_sh_get(),
+ psl->color_downsample_cube_ps);
DRW_shgroup_uniform_texture_ref(grp, "source", &e_data.color_src);
DRW_shgroup_uniform_float(grp, "texelSize", &e_data.cube_texel_size, 1);
DRW_shgroup_uniform_int_copy(grp, "Layer", 0);
@@ -302,30 +240,32 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
{
/* Perform min/max downsample */
DRW_PASS_CREATE(psl->maxz_downlevel_ps, downsample_write | DRW_STATE_DEPTH_ALWAYS);
- grp = DRW_shgroup_create(e_data.maxz_downlevel_sh, psl->maxz_downlevel_ps);
+ grp = DRW_shgroup_create(EEVEE_shaders_effect_maxz_downlevel_sh_get(), psl->maxz_downlevel_ps);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &txl->maxzbuffer);
DRW_shgroup_call(grp, quad, NULL);
/* Copy depth buffer to halfres top level of HiZ */
DRW_PASS_CREATE(psl->maxz_downdepth_ps, downsample_write | DRW_STATE_DEPTH_ALWAYS);
- grp = DRW_shgroup_create(e_data.maxz_downdepth_sh, psl->maxz_downdepth_ps);
+ grp = DRW_shgroup_create(EEVEE_shaders_effect_maxz_downdepth_sh_get(), psl->maxz_downdepth_ps);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &e_data.depth_src);
DRW_shgroup_call(grp, quad, NULL);
DRW_PASS_CREATE(psl->maxz_downdepth_layer_ps, downsample_write | DRW_STATE_DEPTH_ALWAYS);
- grp = DRW_shgroup_create(e_data.maxz_downdepth_layer_sh, psl->maxz_downdepth_layer_ps);
+ grp = DRW_shgroup_create(EEVEE_shaders_effect_maxz_downdepth_layer_sh_get(),
+ psl->maxz_downdepth_layer_ps);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &e_data.depth_src);
DRW_shgroup_uniform_int(grp, "depthLayer", &e_data.depth_src_layer, 1);
DRW_shgroup_call(grp, quad, NULL);
DRW_PASS_CREATE(psl->maxz_copydepth_ps, downsample_write | DRW_STATE_DEPTH_ALWAYS);
- grp = DRW_shgroup_create(e_data.maxz_copydepth_sh, psl->maxz_copydepth_ps);
+ grp = DRW_shgroup_create(EEVEE_shaders_effect_maxz_copydepth_sh_get(), psl->maxz_copydepth_ps);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &e_data.depth_src);
DRW_shgroup_call(grp, quad, NULL);
DRW_PASS_CREATE(psl->maxz_copydepth_layer_ps, downsample_write | DRW_STATE_DEPTH_ALWAYS);
- grp = DRW_shgroup_create(e_data.maxz_copydepth_layer_sh, psl->maxz_copydepth_layer_ps);
+ grp = DRW_shgroup_create(EEVEE_shaders_effect_maxz_copydepth_layer_sh_get(),
+ psl->maxz_copydepth_layer_ps);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &e_data.depth_src);
DRW_shgroup_uniform_int(grp, "depthLayer", &e_data.depth_src_layer, 1);
DRW_shgroup_call(grp, quad, NULL);
@@ -584,19 +524,3 @@ void EEVEE_draw_effects(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
stl->g_data->valid_taa_history = (txl->taa_history != NULL);
}
}
-
-void EEVEE_effects_free(void)
-{
- DRW_SHADER_FREE_SAFE(e_data.downsample_sh);
- DRW_SHADER_FREE_SAFE(e_data.downsample_cube_sh);
-
- DRW_SHADER_FREE_SAFE(e_data.minz_downlevel_sh);
- DRW_SHADER_FREE_SAFE(e_data.maxz_downlevel_sh);
- DRW_SHADER_FREE_SAFE(e_data.minz_downdepth_sh);
- DRW_SHADER_FREE_SAFE(e_data.maxz_downdepth_sh);
- DRW_SHADER_FREE_SAFE(e_data.minz_downdepth_layer_sh);
- DRW_SHADER_FREE_SAFE(e_data.maxz_downdepth_layer_sh);
- DRW_SHADER_FREE_SAFE(e_data.maxz_copydepth_layer_sh);
- DRW_SHADER_FREE_SAFE(e_data.minz_copydepth_sh);
- DRW_SHADER_FREE_SAFE(e_data.maxz_copydepth_sh);
-}
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 0f9f2c184bb..5d5bd7ea9ba 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -571,17 +571,10 @@ static void eevee_render_to_image(void *vedata,
static void eevee_engine_free(void)
{
EEVEE_shaders_free();
- EEVEE_effects_free();
EEVEE_lightprobes_free();
- EEVEE_shadows_free();
EEVEE_materials_free();
- EEVEE_mist_free();
- EEVEE_motion_blur_free();
EEVEE_occlusion_free();
- EEVEE_screen_raytrace_free();
- EEVEE_subsurface_free();
EEVEE_volumes_free();
- EEVEE_renderpasses_free();
}
static const DrawEngineDataSize eevee_data_size = DRW_VIEWPORT_DATA_SIZE(EEVEE_Data);
diff --git a/source/blender/draw/engines/eevee/eevee_lut_gen.c b/source/blender/draw/engines/eevee/eevee_lut_gen.c
index 9b07a6908c3..b74cb6c7687 100644
--- a/source/blender/draw/engines/eevee/eevee_lut_gen.c
+++ b/source/blender/draw/engines/eevee/eevee_lut_gen.c
@@ -33,13 +33,6 @@
#include "eevee_private.h"
-extern char datatoc_bsdf_lut_frag_glsl[];
-extern char datatoc_btdf_lut_frag_glsl[];
-extern char datatoc_bsdf_common_lib_glsl[];
-extern char datatoc_bsdf_sampling_lib_glsl[];
-extern char datatoc_lightprobe_geom_glsl[];
-extern char datatoc_lightprobe_vert_glsl[];
-
static struct GPUTexture *create_ggx_lut_texture(int UNUSED(w), int UNUSED(h))
{
struct GPUTexture *tex;
@@ -47,16 +40,8 @@ static struct GPUTexture *create_ggx_lut_texture(int UNUSED(w), int UNUSED(h))
static float samples_len = 8192.0f;
static float inv_samples_len = 1.0f / 8192.0f;
- DRWShaderLibrary *lib = EEVEE_shader_lib_get();
-
- struct GPUShader *sh = DRW_shader_create_with_shaderlib(datatoc_lightprobe_vert_glsl,
- datatoc_lightprobe_geom_glsl,
- datatoc_bsdf_lut_frag_glsl,
- lib,
- "#define HAMMERSLEY_SIZE 8192\n");
-
DRWPass *pass = DRW_pass_create("LightProbe Filtering", DRW_STATE_WRITE_COLOR);
- DRWShadingGroup *grp = DRW_shgroup_create(sh, pass);
+ DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_ggx_lut_sh_get(), pass);
DRW_shgroup_uniform_float(grp, "sampleCount", &samples_len, 1);
DRW_shgroup_uniform_float(grp, "invSampleCount", &inv_samples_len, 1);
DRW_shgroup_uniform_texture(grp, "texHammersley", e_data.hammersley);
@@ -105,13 +90,8 @@ static struct GPUTexture *create_ggx_refraction_lut_texture(int w, int h)
static float a2 = 0.0f;
static float inv_samples_len = 1.0f / 8192.0f;
- DRWShaderLibrary *lib = EEVEE_shader_lib_get();
-
- struct GPUShader *sh = DRW_shader_create_fullscreen_with_shaderlib(
- datatoc_btdf_lut_frag_glsl, lib, "#define HAMMERSLEY_SIZE 8192\n");
-
DRWPass *pass = DRW_pass_create("LightProbe Filtering", DRW_STATE_WRITE_COLOR);
- DRWShadingGroup *grp = DRW_shgroup_create(sh, pass);
+ DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_ggx_refraction_lut_sh_get(), pass);
DRW_shgroup_uniform_float(grp, "a2", &a2, 1);
DRW_shgroup_uniform_float(grp, "sampleCount", &samples_len, 1);
DRW_shgroup_uniform_float(grp, "invSampleCount", &inv_samples_len, 1);
diff --git a/source/blender/draw/engines/eevee/eevee_mist.c b/source/blender/draw/engines/eevee/eevee_mist.c
index cfac6cc4d62..2b448695528 100644
--- a/source/blender/draw/engines/eevee/eevee_mist.c
+++ b/source/blender/draw/engines/eevee/eevee_mist.c
@@ -32,15 +32,6 @@
#include "eevee_private.h"
-extern char datatoc_common_view_lib_glsl[];
-extern char datatoc_common_uniforms_lib_glsl[];
-extern char datatoc_bsdf_common_lib_glsl[];
-extern char datatoc_effect_mist_frag_glsl[];
-
-static struct {
- struct GPUShader *mist_sh;
-} e_data = {NULL}; /* Engine data */
-
void EEVEE_mist_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
{
const DRWContextState *draw_ctx = DRW_context_state_get();
@@ -55,15 +46,7 @@ void EEVEE_mist_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
const float clear[4] = {0.0f, 0.0f, 0.0f, 0.0f};
- if (e_data.mist_sh == NULL) {
- DRWShaderLibrary *lib = EEVEE_shader_lib_get();
-
- e_data.mist_sh = DRW_shader_create_fullscreen_with_shaderlib(
- datatoc_effect_mist_frag_glsl, lib, "#define FIRST_PASS\n");
- }
-
/* Create FrameBuffer. */
-
/* Should be enough precision for many samples. */
DRW_texture_ensure_fullscreen_2d(&txl->mist_accum, GPU_R32F, 0);
@@ -107,7 +90,8 @@ void EEVEE_mist_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
/* Create Pass and shgroup. */
DRW_PASS_CREATE(psl->mist_accum_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD);
- DRWShadingGroup *grp = DRW_shgroup_create(e_data.mist_sh, psl->mist_accum_ps);
+ DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_effect_mist_sh_get(),
+ psl->mist_accum_ps);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
DRW_shgroup_uniform_block(grp, "renderpass_block", sldata->renderpass_ubo.combined);
@@ -128,8 +112,3 @@ void EEVEE_mist_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Dat
GPU_framebuffer_bind(fbl->main_fb);
}
}
-
-void EEVEE_mist_free(void)
-{
- DRW_SHADER_FREE_SAFE(e_data.mist_sh);
-}
diff --git a/source/blender/draw/engines/eevee/eevee_motion_blur.c b/source/blender/draw/engines/eevee/eevee_motion_blur.c
index c84d1ba33ea..5d3001c561b 100644
--- a/source/blender/draw/engines/eevee/eevee_motion_blur.c
+++ b/source/blender/draw/engines/eevee/eevee_motion_blur.c
@@ -49,45 +49,6 @@
#include "GPU_texture.h"
#include "eevee_private.h"
-static struct {
- /* Motion Blur */
- struct GPUShader *motion_blur_sh;
- struct GPUShader *motion_blur_object_sh;
- struct GPUShader *motion_blur_hair_sh;
- struct GPUShader *velocity_tiles_sh;
- struct GPUShader *velocity_tiles_expand_sh;
-} e_data = {NULL}; /* Engine data */
-
-extern char datatoc_effect_velocity_tile_frag_glsl[];
-extern char datatoc_effect_motion_blur_frag_glsl[];
-extern char datatoc_object_motion_frag_glsl[];
-extern char datatoc_object_motion_vert_glsl[];
-extern char datatoc_common_hair_lib_glsl[];
-extern char datatoc_common_view_lib_glsl[];
-
-#define EEVEE_VELOCITY_TILE_SIZE 32
-
-static void eevee_create_shader_motion_blur(void)
-{
-#define TILE_SIZE_STR "#define EEVEE_VELOCITY_TILE_SIZE " STRINGIFY(EEVEE_VELOCITY_TILE_SIZE) "\n"
- DRWShaderLibrary *lib = EEVEE_shader_lib_get();
- e_data.motion_blur_sh = DRW_shader_create_fullscreen_with_shaderlib(
- datatoc_effect_motion_blur_frag_glsl, lib, TILE_SIZE_STR);
- e_data.motion_blur_object_sh = DRW_shader_create_with_shaderlib(
- datatoc_object_motion_vert_glsl, NULL, datatoc_object_motion_frag_glsl, lib, NULL);
-
- e_data.motion_blur_hair_sh = DRW_shader_create_with_shaderlib(datatoc_object_motion_vert_glsl,
- NULL,
- datatoc_object_motion_frag_glsl,
- lib,
- "#define HAIR\n");
-
- e_data.velocity_tiles_sh = DRW_shader_create_fullscreen(datatoc_effect_velocity_tile_frag_glsl,
- "#define TILE_GATHER\n" TILE_SIZE_STR);
- e_data.velocity_tiles_expand_sh = DRW_shader_create_fullscreen(
- datatoc_effect_velocity_tile_frag_glsl, "#define TILE_EXPANSION\n" TILE_SIZE_STR);
-}
-
int EEVEE_motion_blur_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
{
EEVEE_StorageList *stl = vedata->stl;
@@ -105,10 +66,6 @@ int EEVEE_motion_blur_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *veda
effects->motion_blur_max = max_ii(0, scene->eevee.motion_blur_max);
if ((effects->motion_blur_max > 0) && (scene->eevee.flag & SCE_EEVEE_MOTION_BLUR_ENABLED)) {
- if (!e_data.motion_blur_sh) {
- eevee_create_shader_motion_blur();
- }
-
if (DRW_state_is_scene_render()) {
int mb_step = effects->motion_blur_step;
DRW_view_viewmat_get(NULL, effects->motion_blur.camera[mb_step].viewmat, false);
@@ -188,7 +145,7 @@ void EEVEE_motion_blur_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Dat
DRW_PASS_CREATE(psl->velocity_tiles, DRW_STATE_WRITE_COLOR);
/* Create max velocity tiles in 2 passes. One for X and one for Y */
- GPUShader *sh = e_data.velocity_tiles_sh;
+ GPUShader *sh = EEVEE_shaders_effect_motion_blur_velocity_tiles_sh_get();
grp = DRW_shgroup_create(sh, psl->velocity_tiles_x);
DRW_shgroup_uniform_texture(grp, "velocityBuffer", effects->velocity_tx);
DRW_shgroup_uniform_ivec2_copy(grp, "velocityBufferSize", (int[2]){fs_size[0], fs_size[1]});
@@ -208,7 +165,7 @@ void EEVEE_motion_blur_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Dat
DRW_PASS_CREATE(psl->velocity_tiles_expand[1], DRW_STATE_WRITE_COLOR);
for (int i = 0; i < 2; i++) {
GPUTexture *tile_tx = (i == 0) ? effects->velocity_tiles_tx : effects->velocity_tiles_x_tx;
- GPUShader *sh_expand = e_data.velocity_tiles_expand_sh;
+ GPUShader *sh_expand = EEVEE_shaders_effect_motion_blur_velocity_tiles_expand_sh_get();
grp = DRW_shgroup_create(sh_expand, psl->velocity_tiles_expand[i]);
DRW_shgroup_uniform_ivec2_copy(grp, "velocityBufferSize", tx_size);
DRW_shgroup_uniform_texture(grp, "velocityBuffer", tile_tx);
@@ -224,7 +181,7 @@ void EEVEE_motion_blur_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Dat
GPUTexture *tile_tx = (expand_steps & 1) ? effects->velocity_tiles_x_tx :
effects->velocity_tiles_tx;
- grp = DRW_shgroup_create(e_data.motion_blur_sh, psl->motion_blur);
+ grp = DRW_shgroup_create(EEVEE_shaders_effect_motion_blur_sh_get(), psl->motion_blur);
DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
DRW_shgroup_uniform_texture_ref_ex(grp, "colorBuffer", &effects->source_buffer, state);
DRW_shgroup_uniform_texture_ref_ex(grp, "depthBuffer", &dtxl->depth, state);
@@ -241,14 +198,16 @@ void EEVEE_motion_blur_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Dat
{
DRW_PASS_CREATE(psl->velocity_object, DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL);
- grp = DRW_shgroup_create(e_data.motion_blur_object_sh, psl->velocity_object);
+ grp = DRW_shgroup_create(EEVEE_shaders_effect_motion_blur_object_sh_get(),
+ psl->velocity_object);
DRW_shgroup_uniform_mat4(grp, "prevViewProjMatrix", mb_data->camera[MB_PREV].persmat);
DRW_shgroup_uniform_mat4(grp, "currViewProjMatrix", mb_data->camera[MB_CURR].persmat);
DRW_shgroup_uniform_mat4(grp, "nextViewProjMatrix", mb_data->camera[MB_NEXT].persmat);
DRW_PASS_CREATE(psl->velocity_hair, DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL);
- mb_data->hair_grp = grp = DRW_shgroup_create(e_data.motion_blur_hair_sh, psl->velocity_hair);
+ mb_data->hair_grp = grp = DRW_shgroup_create(EEVEE_shaders_effect_motion_blur_hair_sh_get(),
+ psl->velocity_hair);
DRW_shgroup_uniform_mat4(grp, "prevViewProjMatrix", mb_data->camera[MB_PREV].persmat);
DRW_shgroup_uniform_mat4(grp, "currViewProjMatrix", mb_data->camera[MB_CURR].persmat);
DRW_shgroup_uniform_mat4(grp, "nextViewProjMatrix", mb_data->camera[MB_NEXT].persmat);
@@ -396,7 +355,8 @@ void EEVEE_motion_blur_cache_populate(EEVEE_ViewLayerData *UNUSED(sldata),
return;
}
- grp = DRW_shgroup_create(e_data.motion_blur_object_sh, psl->velocity_object);
+ grp = DRW_shgroup_create(EEVEE_shaders_effect_motion_blur_object_sh_get(),
+ psl->velocity_object);
DRW_shgroup_uniform_mat4(grp, "prevModelMatrix", mb_data->obmat[MB_PREV]);
DRW_shgroup_uniform_mat4(grp, "currModelMatrix", mb_data->obmat[MB_CURR]);
DRW_shgroup_uniform_mat4(grp, "nextModelMatrix", mb_data->obmat[MB_NEXT]);
@@ -627,12 +587,3 @@ void EEVEE_motion_blur_draw(EEVEE_Data *vedata)
SWAP_BUFFERS();
}
}
-
-void EEVEE_motion_blur_free(void)
-{
- DRW_SHADER_FREE_SAFE(e_data.motion_blur_sh);
- DRW_SHADER_FREE_SAFE(e_data.motion_blur_object_sh);
- DRW_SHADER_FREE_SAFE(e_data.motion_blur_hair_sh);
- DRW_SHADER_FREE_SAFE(e_data.velocity_tiles_sh);
- DRW_SHADER_FREE_SAFE(e_data.velocity_tiles_expand_sh);
-}
diff --git a/source/blender/draw/engines/eevee/eevee_occlusion.c b/source/blender/draw/engines/eevee/eevee_occlusion.c
index 052fb485b19..b7b765d9c00 100644
--- a/source/blender/draw/engines/eevee/eevee_occlusion.c
+++ b/source/blender/draw/engines/eevee/eevee_occlusion.c
@@ -37,32 +37,9 @@
#include "GPU_state.h"
static struct {
- /* Ground Truth Ambient Occlusion */
- struct GPUShader *gtao_sh;
- struct GPUShader *gtao_layer_sh;
- struct GPUShader *gtao_debug_sh;
-
struct GPUTexture *dummy_horizon_tx;
} e_data = {NULL}; /* Engine data */
-extern char datatoc_ambient_occlusion_lib_glsl[];
-extern char datatoc_common_view_lib_glsl[];
-extern char datatoc_common_uniforms_lib_glsl[];
-extern char datatoc_bsdf_common_lib_glsl[];
-extern char datatoc_effect_gtao_frag_glsl[];
-
-static void eevee_create_shader_occlusion(void)
-{
- DRWShaderLibrary *lib = EEVEE_shader_lib_get();
-
- e_data.gtao_sh = DRW_shader_create_fullscreen_with_shaderlib(
- datatoc_effect_gtao_frag_glsl, lib, NULL);
- e_data.gtao_layer_sh = DRW_shader_create_fullscreen_with_shaderlib(
- datatoc_effect_gtao_frag_glsl, lib, "#define LAYERED_DEPTH\n");
- e_data.gtao_debug_sh = DRW_shader_create_fullscreen_with_shaderlib(
- datatoc_effect_gtao_frag_glsl, lib, "#define DEBUG_AO\n");
-}
-
int EEVEE_occlusion_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
{
EEVEE_CommonUniformBuffer *common_data = &sldata->common_data;
@@ -83,11 +60,6 @@ int EEVEE_occlusion_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
const float *viewport_size = DRW_viewport_size_get();
const int fs_size[2] = {(int)viewport_size[0], (int)viewport_size[1]};
- /* Shaders */
- if (!e_data.gtao_sh) {
- eevee_create_shader_occlusion();
- }
-
common_data->ao_dist = scene_eval->eevee.gtao_distance;
common_data->ao_factor = scene_eval->eevee.gtao_factor;
common_data->ao_quality = 1.0f - scene_eval->eevee.gtao_quality;
@@ -169,7 +141,8 @@ void EEVEE_occlusion_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata
/* Accumulation pass */
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD;
DRW_PASS_CREATE(psl->ao_accum_ps, state);
- DRWShadingGroup *grp = DRW_shgroup_create(e_data.gtao_debug_sh, psl->ao_accum_ps);
+ DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_effect_ambient_occlusion_debug_sh_get(),
+ psl->ao_accum_ps);
DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
DRW_shgroup_uniform_texture_ref(grp, "maxzBuffer", &txl->maxzbuffer);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
@@ -203,7 +176,8 @@ void EEVEE_occlusion_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
* lobe present in the shader using the correct normal.
*/
DRW_PASS_CREATE(psl->ao_horizon_search, DRW_STATE_WRITE_COLOR);
- DRWShadingGroup *grp = DRW_shgroup_create(e_data.gtao_sh, psl->ao_horizon_search);
+ DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_effect_ambient_occlusion_sh_get(),
+ psl->ao_horizon_search);
DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
DRW_shgroup_uniform_texture_ref(grp, "maxzBuffer", &txl->maxzbuffer);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &effects->ao_src_depth);
@@ -212,7 +186,8 @@ void EEVEE_occlusion_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
DRW_shgroup_call(grp, quad, NULL);
DRW_PASS_CREATE(psl->ao_horizon_search_layer, DRW_STATE_WRITE_COLOR);
- grp = DRW_shgroup_create(e_data.gtao_layer_sh, psl->ao_horizon_search_layer);
+ grp = DRW_shgroup_create(EEVEE_shaders_effect_ambient_occlusion_layer_sh_get(),
+ psl->ao_horizon_search_layer);
DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
DRW_shgroup_uniform_texture_ref(grp, "maxzBuffer", &txl->maxzbuffer);
DRW_shgroup_uniform_texture_ref(grp, "depthBufferLayered", &effects->ao_src_depth);
@@ -223,7 +198,8 @@ void EEVEE_occlusion_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
if (G.debug_value == 6) {
DRW_PASS_CREATE(psl->ao_horizon_debug, DRW_STATE_WRITE_COLOR);
- grp = DRW_shgroup_create(e_data.gtao_debug_sh, psl->ao_horizon_debug);
+ grp = DRW_shgroup_create(EEVEE_shaders_effect_ambient_occlusion_debug_sh_get(),
+ psl->ao_horizon_debug);
DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
DRW_shgroup_uniform_texture_ref(grp, "maxzBuffer", &txl->maxzbuffer);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
@@ -315,8 +291,5 @@ void EEVEE_occlusion_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *
void EEVEE_occlusion_free(void)
{
- DRW_SHADER_FREE_SAFE(e_data.gtao_sh);
- DRW_SHADER_FREE_SAFE(e_data.gtao_layer_sh);
- DRW_SHADER_FREE_SAFE(e_data.gtao_debug_sh);
DRW_TEXTURE_FREE_SAFE(e_data.dummy_horizon_tx);
}
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 4aaf6741a1c..8216d2545ac 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -83,6 +83,10 @@ extern struct DrawEngineType draw_engine_eevee_type;
/* clang-format on */
#define EEVEE_PROBE_MAX min_ii(MAX_PROBE, GPU_max_texture_layers() / 6)
+#define EEVEE_VELOCITY_TILE_SIZE 32
+#define USE_VOLUME_OPTI \
+ (GLEW_ARB_shader_image_load_store && GLEW_ARB_shading_language_420pack && \
+ !GPU_crappy_amd_driver())
#define SWAP_DOUBLE_BUFFERS() \
{ \
@@ -192,6 +196,14 @@ enum {
KEY_SHADOW = (1 << 3),
};
+/* SSR shader variations */
+typedef enum EEVEE_SSRShaderOptions {
+ SSR_RESOLVE = (1 << 0),
+ SSR_FULL_TRACE = (1 << 1),
+ SSR_AO = (1 << 3),
+ SSR_MAX_SHADER = (1 << 4),
+} EEVEE_SSRShaderOptions;
+
/* ************ PROBE UBO ************* */
/* They are the same struct as their Cache siblings.
@@ -1050,7 +1062,6 @@ void EEVEE_shadows_draw_cascades(EEVEE_ViewLayerData *sldata,
int cascade_index);
void EEVEE_shadow_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, uint tot_samples);
void EEVEE_shadow_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
-void EEVEE_shadows_free(void);
/* eevee_sampling.c */
void EEVEE_sample_ball(int sample_ofs, float radius, float rsample[3]);
@@ -1079,6 +1090,41 @@ struct GPUShader *EEVEE_shaders_bloom_resolve_get(bool high_quality);
struct GPUShader *EEVEE_shaders_depth_of_field_downsample_get(bool use_alpha);
struct GPUShader *EEVEE_shaders_depth_of_field_scatter_get(bool use_alpha);
struct GPUShader *EEVEE_shaders_depth_of_field_resolve_get(bool use_alpha);
+struct GPUShader *EEVEE_shaders_effect_downsample_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_downsample_cube_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_minz_downlevel_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_maxz_downlevel_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_minz_downdepth_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_maxz_downdepth_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_minz_downdepth_layer_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_maxz_downdepth_layer_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_maxz_copydepth_layer_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_minz_copydepth_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_maxz_copydepth_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_mist_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_motion_blur_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_motion_blur_object_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_motion_blur_hair_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_motion_blur_velocity_tiles_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_motion_blur_velocity_tiles_expand_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_ambient_occlusion_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_ambient_occlusion_layer_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_ambient_occlusion_debug_sh_get(void);
+struct GPUShader *EEVEE_shaders_effect_screen_raytrace_sh_get(EEVEE_SSRShaderOptions options);
+struct GPUShader *EEVEE_shaders_renderpasses_post_process_sh_get(void);
+struct GPUShader *EEVEE_shaders_shadow_sh_get(void);
+struct GPUShader *EEVEE_shaders_shadow_accum_sh_get(void);
+struct GPUShader *EEVEE_shaders_subsurface_first_pass_sh_get(void);
+struct GPUShader *EEVEE_shaders_subsurface_second_pass_sh_get(void);
+struct GPUShader *EEVEE_shaders_subsurface_translucency_sh_get(void);
+struct GPUShader *EEVEE_shaders_volumes_clear_sh_get(void);
+struct GPUShader *EEVEE_shaders_volumes_scatter_sh_get(void);
+struct GPUShader *EEVEE_shaders_volumes_scatter_with_lights_sh_get(void);
+struct GPUShader *EEVEE_shaders_volumes_integration_sh_get(void);
+struct GPUShader *EEVEE_shaders_volumes_resolve_sh_get(void);
+struct GPUShader *EEVEE_shaders_volumes_accum_sh_get(void);
+struct GPUShader *EEVEE_shaders_ggx_lut_sh_get(void);
+struct GPUShader *EEVEE_shaders_ggx_refraction_lut_sh_get(void);
struct GPUShader *EEVEE_shaders_probe_filter_glossy_sh_get(void);
struct GPUShader *EEVEE_shaders_probe_filter_diffuse_sh_get(void);
struct GPUShader *EEVEE_shaders_probe_filter_visibility_sh_get(void);
@@ -1194,8 +1240,6 @@ void EEVEE_reflection_output_init(EEVEE_ViewLayerData *sldata,
uint tot_samples);
void EEVEE_reflection_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
-void EEVEE_screen_raytrace_free(void);
-
/* eevee_subsurface.c */
void EEVEE_subsurface_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
void EEVEE_subsurface_draw_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
@@ -1211,7 +1255,6 @@ void EEVEE_subsurface_add_pass(EEVEE_ViewLayerData *sldata,
void EEVEE_subsurface_data_render(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
void EEVEE_subsurface_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
void EEVEE_subsurface_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
-void EEVEE_subsurface_free(void);
/* eevee_motion_blur.c */
int EEVEE_motion_blur_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
@@ -1226,12 +1269,10 @@ void EEVEE_motion_blur_hair_cache_populate(EEVEE_ViewLayerData *sldata,
void EEVEE_motion_blur_swap_data(EEVEE_Data *vedata);
void EEVEE_motion_blur_cache_finish(EEVEE_Data *vedata);
void EEVEE_motion_blur_draw(EEVEE_Data *vedata);
-void EEVEE_motion_blur_free(void);
/* eevee_mist.c */
void EEVEE_mist_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
void EEVEE_mist_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
-void EEVEE_mist_free(void);
/* eevee_renderpasses.c */
void EEVEE_renderpasses_init(EEVEE_Data *vedata);
@@ -1247,7 +1288,6 @@ void EEVEE_renderpasses_postprocess(EEVEE_ViewLayerData *sldata,
eViewLayerEEVEEPassType renderpass_type);
void EEVEE_renderpasses_draw(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
void EEVEE_renderpasses_draw_debug(EEVEE_Data *vedata);
-void EEVEE_renderpasses_free(void);
bool EEVEE_renderpasses_only_first_sample_pass_active(EEVEE_Data *vedata);
/* eevee_temporal_sampling.c */
@@ -1290,7 +1330,6 @@ void EEVEE_create_minmax_buffer(EEVEE_Data *vedata, struct GPUTexture *depth_src
void EEVEE_downsample_buffer(EEVEE_Data *vedata, struct GPUTexture *texture_src, int level);
void EEVEE_downsample_cube_buffer(EEVEE_Data *vedata, struct GPUTexture *texture_src, int level);
void EEVEE_draw_effects(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
-void EEVEE_effects_free(void);
/* eevee_render.c */
bool EEVEE_render_init(EEVEE_Data *vedata,
diff --git a/source/blender/draw/engines/eevee/eevee_renderpasses.c b/source/blender/draw/engines/eevee/eevee_renderpasses.c
index 55fe5882211..8ec823879ad 100644
--- a/source/blender/draw/engines/eevee/eevee_renderpasses.c
+++ b/source/blender/draw/engines/eevee/eevee_renderpasses.c
@@ -33,15 +33,6 @@
#include "eevee_private.h"
-extern char datatoc_common_view_lib_glsl[];
-extern char datatoc_common_uniforms_lib_glsl[];
-extern char datatoc_bsdf_common_lib_glsl[];
-extern char datatoc_renderpass_postprocess_frag_glsl[];
-
-static struct {
- struct GPUShader *postprocess_sh;
-} e_data = {NULL}; /* Engine data */
-
typedef enum eRenderPassPostProcessType {
PASS_POST_UNDEFINED = 0,
PASS_POST_ACCUMULATED_COLOR = 1,
@@ -194,15 +185,9 @@ void EEVEE_renderpasses_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *ve
const bool needs_post_processing = (g_data->render_passes &
EEVEE_RENDERPASSES_WITH_POST_PROCESSING) > 0;
if (needs_post_processing) {
- if (e_data.postprocess_sh == NULL) {
- DRWShaderLibrary *lib = EEVEE_shader_lib_get();
-
- e_data.postprocess_sh = DRW_shader_create_fullscreen_with_shaderlib(
- datatoc_renderpass_postprocess_frag_glsl, lib, NULL);
- }
-
DRW_PASS_CREATE(psl->renderpass_pass, DRW_STATE_WRITE_COLOR);
- DRWShadingGroup *grp = DRW_shgroup_create(e_data.postprocess_sh, psl->renderpass_pass);
+ DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_renderpasses_post_process_sh_get(),
+ psl->renderpass_pass);
DRW_shgroup_uniform_texture_ref(grp, "inputBuffer", &g_data->renderpass_input);
DRW_shgroup_uniform_texture_ref(grp, "inputColorBuffer", &g_data->renderpass_col_input);
DRW_shgroup_uniform_texture_ref(
@@ -420,11 +405,6 @@ void EEVEE_renderpasses_draw(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
GPU_framebuffer_bind(fbl->main_fb);
}
-void EEVEE_renderpasses_free(void)
-{
- DRW_SHADER_FREE_SAFE(e_data.postprocess_sh);
-}
-
void EEVEE_renderpasses_draw_debug(EEVEE_Data *vedata)
{
EEVEE_TextureList *txl = vedata->txl;
diff --git a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
index 88029c2e940..ed7d53b51af 100644
--- a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
+++ b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
@@ -32,55 +32,10 @@
#include "GPU_texture.h"
#include "eevee_private.h"
-/* SSR shader variations */
-enum {
- SSR_RESOLVE = (1 << 0),
- SSR_FULL_TRACE = (1 << 1),
- SSR_AO = (1 << 3),
- SSR_MAX_SHADER = (1 << 4),
-};
-
static struct {
- /* Screen Space Reflection */
- struct GPUShader *ssr_sh[SSR_MAX_SHADER];
-
/* These are just references, not actually allocated */
struct GPUTexture *depth_src;
-} e_data = {{NULL}}; /* Engine data */
-
-extern char datatoc_effect_ssr_frag_glsl[];
-
-static struct GPUShader *eevee_effects_screen_raytrace_shader_get(int options)
-{
- if (e_data.ssr_sh[options] == NULL) {
- DRWShaderLibrary *lib = EEVEE_shader_lib_get();
-
- DynStr *ds_defines = BLI_dynstr_new();
- BLI_dynstr_append(ds_defines, SHADER_DEFINES);
- if (options & SSR_RESOLVE) {
- BLI_dynstr_append(ds_defines, "#define STEP_RESOLVE\n");
- }
- else {
- BLI_dynstr_append(ds_defines, "#define STEP_RAYTRACE\n");
- BLI_dynstr_append(ds_defines, "#define PLANAR_PROBE_RAYTRACE\n");
- }
- if (options & SSR_FULL_TRACE) {
- BLI_dynstr_append(ds_defines, "#define FULLRES\n");
- }
- if (options & SSR_AO) {
- BLI_dynstr_append(ds_defines, "#define SSR_AO\n");
- }
- char *ssr_define_str = BLI_dynstr_get_cstring(ds_defines);
- BLI_dynstr_free(ds_defines);
-
- e_data.ssr_sh[options] = DRW_shader_create_fullscreen_with_shaderlib(
- datatoc_effect_ssr_frag_glsl, lib, ssr_define_str);
-
- MEM_freeN(ssr_define_str);
- }
-
- return e_data.ssr_sh[options];
-}
+} e_data = {NULL}; /* Engine data */
int EEVEE_screen_raytrace_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
{
@@ -187,12 +142,12 @@ void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *v
struct GPUBatch *quad = DRW_cache_fullscreen_quad_get();
if ((effects->enabled_effects & EFFECT_SSR) != 0) {
- int options = (effects->reflection_trace_full) ? SSR_FULL_TRACE : 0;
+ EEVEE_SSRShaderOptions options = (effects->reflection_trace_full) ? SSR_FULL_TRACE : 0;
options |= ((effects->enabled_effects & EFFECT_GTAO) != 0) ? SSR_AO : 0;
- struct GPUShader *trace_shader = eevee_effects_screen_raytrace_shader_get(options);
- struct GPUShader *resolve_shader = eevee_effects_screen_raytrace_shader_get(SSR_RESOLVE |
- options);
+ struct GPUShader *trace_shader = EEVEE_shaders_effect_screen_raytrace_sh_get(options);
+ struct GPUShader *resolve_shader = EEVEE_shaders_effect_screen_raytrace_sh_get(SSR_RESOLVE |
+ options);
/** Screen space raytracing overview
*
@@ -357,10 +312,3 @@ void EEVEE_reflection_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEV
DRW_draw_pass(psl->ssr_resolve);
}
}
-
-void EEVEE_screen_raytrace_free(void)
-{
- for (int i = 0; i < SSR_MAX_SHADER; i++) {
- DRW_SHADER_FREE_SAFE(e_data.ssr_sh[i]);
- }
-}
diff --git a/source/blender/draw/engines/eevee/eevee_shaders.c b/source/blender/draw/engines/eevee/eevee_shaders.c
index 37c43f9f6ef..bbc5801b0f7 100644
--- a/source/blender/draw/engines/eevee/eevee_shaders.c
+++ b/source/blender/draw/engines/eevee/eevee_shaders.c
@@ -32,6 +32,7 @@
#include "MEM_guardedalloc.h"
+#include "GPU_extensions.h"
#include "GPU_material.h"
#include "GPU_shader.h"
@@ -84,6 +85,61 @@ static struct {
struct GPUShader *lookdev_background;
struct GPUShader *update_noise_sh;
+ /* Downsample Depth */
+ struct GPUShader *minz_downlevel_sh;
+ struct GPUShader *maxz_downlevel_sh;
+ struct GPUShader *minz_downdepth_sh;
+ struct GPUShader *maxz_downdepth_sh;
+ struct GPUShader *minz_downdepth_layer_sh;
+ struct GPUShader *maxz_downdepth_layer_sh;
+ struct GPUShader *maxz_copydepth_layer_sh;
+ struct GPUShader *minz_copydepth_sh;
+ struct GPUShader *maxz_copydepth_sh;
+
+ /* Simple Downsample */
+ struct GPUShader *downsample_sh;
+ struct GPUShader *downsample_cube_sh;
+
+ /* Mist */
+ struct GPUShader *mist_sh;
+
+ /* Motion Blur */
+ struct GPUShader *motion_blur_sh;
+ struct GPUShader *motion_blur_object_sh;
+ struct GPUShader *motion_blur_hair_sh;
+ struct GPUShader *velocity_tiles_sh;
+ struct GPUShader *velocity_tiles_expand_sh;
+
+ /* Ground Truth Ambient Occlusion */
+ struct GPUShader *gtao_sh;
+ struct GPUShader *gtao_layer_sh;
+ struct GPUShader *gtao_debug_sh;
+
+ /* GGX LUT */
+ struct GPUShader *ggx_lut_sh;
+ struct GPUShader *ggx_refraction_lut_sh;
+
+ /* Render Passes */
+ struct GPUShader *postprocess_sh;
+
+ /* Screen Space Reflection */
+ struct GPUShader *ssr_sh[SSR_MAX_SHADER];
+
+ /* Shadows */
+ struct GPUShader *shadow_sh;
+ struct GPUShader *shadow_accum_sh;
+
+ /* Subsurface */
+ struct GPUShader *sss_sh[3];
+
+ /* Volume */
+ struct GPUShader *volumetric_clear_sh;
+ struct GPUShader *scatter_sh;
+ struct GPUShader *scatter_with_lights_sh;
+ struct GPUShader *volumetric_integration_sh;
+ struct GPUShader *volumetric_resolve_sh;
+ struct GPUShader *volumetric_accum_sh;
+
/* Shader strings */
char *closure_lit_lib;
char *surface_lit_frag;
@@ -379,6 +435,439 @@ GPUShader *EEVEE_shaders_probe_planar_display_sh_get(void)
return e_data.probe_planar_display_sh;
}
+/* -------------------------------------------------------------------- */
+/** \name Downsampling
+ * \{ */
+
+GPUShader *EEVEE_shaders_effect_downsample_sh_get(void)
+{
+ if (e_data.downsample_sh == NULL) {
+ e_data.downsample_sh = DRW_shader_create_fullscreen(datatoc_effect_downsample_frag_glsl, NULL);
+ }
+ return e_data.downsample_sh;
+}
+
+GPUShader *EEVEE_shaders_effect_downsample_cube_sh_get(void)
+{
+ if (e_data.downsample_cube_sh == NULL) {
+ e_data.downsample_cube_sh = DRW_shader_create(datatoc_lightprobe_vert_glsl,
+ datatoc_lightprobe_geom_glsl,
+ datatoc_effect_downsample_cube_frag_glsl,
+ NULL);
+ }
+ return e_data.downsample_cube_sh;
+}
+
+GPUShader *EEVEE_shaders_effect_minz_downlevel_sh_get(void)
+{
+ if (e_data.minz_downlevel_sh == NULL) {
+ e_data.minz_downlevel_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
+ "#define MIN_PASS\n");
+ }
+ return e_data.minz_downlevel_sh;
+}
+
+GPUShader *EEVEE_shaders_effect_maxz_downlevel_sh_get(void)
+{
+ if (e_data.maxz_downlevel_sh == NULL) {
+ e_data.maxz_downlevel_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
+ "#define MAX_PASS\n");
+ }
+ return e_data.maxz_downlevel_sh;
+}
+
+GPUShader *EEVEE_shaders_effect_minz_downdepth_sh_get(void)
+{
+ if (e_data.minz_downdepth_sh == NULL) {
+ e_data.minz_downdepth_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
+ "#define MIN_PASS\n");
+ }
+ return e_data.minz_downdepth_sh;
+}
+
+GPUShader *EEVEE_shaders_effect_maxz_downdepth_sh_get(void)
+{
+ if (e_data.maxz_downdepth_sh == NULL) {
+ e_data.maxz_downdepth_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
+ "#define MAX_PASS\n");
+ }
+ return e_data.maxz_downdepth_sh;
+}
+
+GPUShader *EEVEE_shaders_effect_minz_downdepth_layer_sh_get(void)
+{
+ if (e_data.minz_downdepth_layer_sh == NULL) {
+ e_data.minz_downdepth_layer_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
+ "#define MIN_PASS\n"
+ "#define LAYERED\n");
+ }
+ return e_data.minz_downdepth_layer_sh;
+}
+
+GPUShader *EEVEE_shaders_effect_maxz_downdepth_layer_sh_get(void)
+{
+ if (e_data.maxz_downdepth_layer_sh == NULL) {
+ e_data.maxz_downdepth_layer_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
+ "#define MAX_PASS\n"
+ "#define LAYERED\n");
+ }
+ return e_data.maxz_downdepth_layer_sh;
+}
+
+GPUShader *EEVEE_shaders_effect_maxz_copydepth_layer_sh_get(void)
+{
+ if (e_data.maxz_copydepth_layer_sh == NULL) {
+ e_data.maxz_copydepth_layer_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
+ "#define MAX_PASS\n"
+ "#define COPY_DEPTH\n"
+ "#define LAYERED\n");
+ }
+ return e_data.maxz_copydepth_layer_sh;
+}
+
+GPUShader *EEVEE_shaders_effect_minz_copydepth_sh_get(void)
+{
+ if (e_data.minz_copydepth_sh == NULL) {
+ e_data.minz_copydepth_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
+ "#define MIN_PASS\n"
+ "#define COPY_DEPTH\n");
+ }
+ return e_data.minz_copydepth_sh;
+}
+
+GPUShader *EEVEE_shaders_effect_maxz_copydepth_sh_get(void)
+{
+ if (e_data.maxz_copydepth_sh == NULL) {
+ e_data.maxz_copydepth_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl,
+ "#define MAX_PASS\n"
+ "#define COPY_DEPTH\n");
+ }
+ return e_data.maxz_copydepth_sh;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name GGX LUT
+ * \{ */
+
+GPUShader *EEVEE_shaders_ggx_lut_sh_get(void)
+{
+ if (e_data.ggx_lut_sh == NULL) {
+ e_data.ggx_lut_sh = DRW_shader_create_with_shaderlib(datatoc_lightprobe_vert_glsl,
+ datatoc_lightprobe_geom_glsl,
+ datatoc_bsdf_lut_frag_glsl,
+ e_data.lib,
+ "#define HAMMERSLEY_SIZE 8192\n");
+ }
+ return e_data.ggx_lut_sh;
+}
+
+GPUShader *EEVEE_shaders_ggx_refraction_lut_sh_get(void)
+{
+ if (e_data.ggx_refraction_lut_sh == NULL) {
+ e_data.ggx_refraction_lut_sh = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_btdf_lut_frag_glsl, e_data.lib, "#define HAMMERSLEY_SIZE 8192\n");
+ }
+ return e_data.ggx_refraction_lut_sh;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Mist
+ * \{ */
+
+GPUShader *EEVEE_shaders_effect_mist_sh_get(void)
+{
+ if (e_data.mist_sh == NULL) {
+ e_data.mist_sh = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_mist_frag_glsl, e_data.lib, "#define FIRST_PASS\n");
+ }
+ return e_data.mist_sh;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Motion Blur
+ * \{ */
+
+#define TILE_SIZE_STR "#define EEVEE_VELOCITY_TILE_SIZE " STRINGIFY(EEVEE_VELOCITY_TILE_SIZE) "\n"
+GPUShader *EEVEE_shaders_effect_motion_blur_sh_get(void)
+{
+ if (e_data.motion_blur_sh == NULL) {
+ e_data.motion_blur_sh = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_motion_blur_frag_glsl, e_data.lib, TILE_SIZE_STR);
+ }
+ return e_data.motion_blur_sh;
+}
+
+GPUShader *EEVEE_shaders_effect_motion_blur_object_sh_get(void)
+{
+ if (e_data.motion_blur_object_sh == NULL) {
+ e_data.motion_blur_object_sh = DRW_shader_create_with_shaderlib(
+ datatoc_object_motion_vert_glsl, NULL, datatoc_object_motion_frag_glsl, e_data.lib, NULL);
+ }
+ return e_data.motion_blur_object_sh;
+}
+
+GPUShader *EEVEE_shaders_effect_motion_blur_hair_sh_get(void)
+{
+ if (e_data.motion_blur_hair_sh == NULL) {
+ e_data.motion_blur_hair_sh = DRW_shader_create_with_shaderlib(datatoc_object_motion_vert_glsl,
+ NULL,
+ datatoc_object_motion_frag_glsl,
+ e_data.lib,
+ "#define HAIR\n");
+ }
+ return e_data.motion_blur_hair_sh;
+}
+
+GPUShader *EEVEE_shaders_effect_motion_blur_velocity_tiles_sh_get(void)
+{
+ if (e_data.velocity_tiles_sh == NULL) {
+ e_data.velocity_tiles_sh = DRW_shader_create_fullscreen(datatoc_effect_velocity_tile_frag_glsl,
+ "#define TILE_GATHER\n" TILE_SIZE_STR);
+ }
+ return e_data.velocity_tiles_sh;
+}
+
+GPUShader *EEVEE_shaders_effect_motion_blur_velocity_tiles_expand_sh_get(void)
+{
+ if (e_data.velocity_tiles_expand_sh == NULL) {
+ e_data.velocity_tiles_expand_sh = DRW_shader_create_fullscreen(
+ datatoc_effect_velocity_tile_frag_glsl, "#define TILE_EXPANSION\n" TILE_SIZE_STR);
+ }
+ return e_data.velocity_tiles_expand_sh;
+}
+
+#undef TILE_SIZE_STR
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Ambient Occlusion */
+
+GPUShader *EEVEE_shaders_effect_ambient_occlusion_sh_get(void)
+{
+ if (e_data.gtao_sh == NULL) {
+ e_data.gtao_sh = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_gtao_frag_glsl, e_data.lib, NULL);
+ }
+ return e_data.gtao_sh;
+}
+
+GPUShader *EEVEE_shaders_effect_ambient_occlusion_layer_sh_get(void)
+{
+ if (e_data.gtao_layer_sh == NULL) {
+ e_data.gtao_layer_sh = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_gtao_frag_glsl, e_data.lib, "#define LAYERED_DEPTH\n");
+ }
+ return e_data.gtao_layer_sh;
+}
+
+GPUShader *EEVEE_shaders_effect_ambient_occlusion_debug_sh_get(void)
+{
+ if (e_data.gtao_debug_sh == NULL) {
+ e_data.gtao_debug_sh = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_gtao_frag_glsl, e_data.lib, "#define DEBUG_AO\n");
+ }
+ return e_data.gtao_debug_sh;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Render Passes */
+
+GPUShader *EEVEE_shaders_renderpasses_post_process_sh_get(void)
+{
+ if (e_data.postprocess_sh == NULL) {
+ e_data.postprocess_sh = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_renderpass_postprocess_frag_glsl, e_data.lib, NULL);
+ }
+ return e_data.postprocess_sh;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Screen Raytrace */
+
+struct GPUShader *EEVEE_shaders_effect_screen_raytrace_sh_get(EEVEE_SSRShaderOptions options)
+{
+ if (e_data.ssr_sh[options] == NULL) {
+ DRWShaderLibrary *lib = EEVEE_shader_lib_get();
+
+ DynStr *ds_defines = BLI_dynstr_new();
+ BLI_dynstr_append(ds_defines, SHADER_DEFINES);
+ if (options & SSR_RESOLVE) {
+ BLI_dynstr_append(ds_defines, "#define STEP_RESOLVE\n");
+ }
+ else {
+ BLI_dynstr_append(ds_defines, "#define STEP_RAYTRACE\n");
+ BLI_dynstr_append(ds_defines, "#define PLANAR_PROBE_RAYTRACE\n");
+ }
+ if (options & SSR_FULL_TRACE) {
+ BLI_dynstr_append(ds_defines, "#define FULLRES\n");
+ }
+ if (options & SSR_AO) {
+ BLI_dynstr_append(ds_defines, "#define SSR_AO\n");
+ }
+ char *ssr_define_str = BLI_dynstr_get_cstring(ds_defines);
+ BLI_dynstr_free(ds_defines);
+
+ e_data.ssr_sh[options] = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_ssr_frag_glsl, lib, ssr_define_str);
+
+ MEM_freeN(ssr_define_str);
+ }
+
+ return e_data.ssr_sh[options];
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Shadows */
+
+struct GPUShader *EEVEE_shaders_shadow_sh_get()
+{
+ if (e_data.shadow_sh == NULL) {
+ e_data.shadow_sh = DRW_shader_create_with_shaderlib(
+ datatoc_shadow_vert_glsl, NULL, datatoc_shadow_frag_glsl, e_data.lib, NULL);
+ }
+ return e_data.shadow_sh;
+}
+
+struct GPUShader *EEVEE_shaders_shadow_accum_sh_get()
+{
+ if (e_data.shadow_accum_sh == NULL) {
+ e_data.shadow_accum_sh = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_shadow_accum_frag_glsl, e_data.lib, SHADER_DEFINES);
+ }
+ return e_data.shadow_accum_sh;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Subsurface */
+
+struct GPUShader *EEVEE_shaders_subsurface_first_pass_sh_get()
+{
+ if (e_data.sss_sh[0] == NULL) {
+ e_data.sss_sh[0] = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_subsurface_frag_glsl, e_data.lib, "#define FIRST_PASS\n");
+ }
+ return e_data.sss_sh[0];
+}
+
+struct GPUShader *EEVEE_shaders_subsurface_second_pass_sh_get()
+{
+ if (e_data.sss_sh[1] == NULL) {
+ e_data.sss_sh[1] = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_subsurface_frag_glsl, e_data.lib, "#define SECOND_PASS\n");
+ }
+ return e_data.sss_sh[1];
+}
+
+struct GPUShader *EEVEE_shaders_subsurface_translucency_sh_get()
+{
+ if (e_data.sss_sh[2] == NULL) {
+ e_data.sss_sh[2] = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_effect_translucency_frag_glsl,
+ e_data.lib,
+ "#define EEVEE_TRANSLUCENCY\n" SHADER_DEFINES);
+ }
+ return e_data.sss_sh[2];
+}
+
+/** \} */
+/* -------------------------------------------------------------------- */
+/** \name Volumes */
+
+struct GPUShader *EEVEE_shaders_volumes_clear_sh_get()
+{
+ if (e_data.volumetric_clear_sh == NULL) {
+ e_data.volumetric_clear_sh = DRW_shader_create_with_shaderlib(datatoc_volumetric_vert_glsl,
+ datatoc_volumetric_geom_glsl,
+ datatoc_volumetric_frag_glsl,
+ e_data.lib,
+ SHADER_DEFINES
+ "#define VOLUMETRICS\n"
+ "#define CLEAR\n");
+ }
+ return e_data.volumetric_clear_sh;
+}
+
+struct GPUShader *EEVEE_shaders_volumes_scatter_sh_get()
+{
+ if (e_data.scatter_sh == NULL) {
+ e_data.scatter_sh = DRW_shader_create_with_shaderlib(datatoc_volumetric_vert_glsl,
+ datatoc_volumetric_geom_glsl,
+ datatoc_volumetric_scatter_frag_glsl,
+ e_data.lib,
+ SHADER_DEFINES
+ "#define VOLUMETRICS\n"
+ "#define VOLUME_SHADOW\n");
+ }
+ return e_data.scatter_sh;
+}
+
+struct GPUShader *EEVEE_shaders_volumes_scatter_with_lights_sh_get()
+{
+ if (e_data.scatter_with_lights_sh == NULL) {
+ e_data.scatter_with_lights_sh = DRW_shader_create_with_shaderlib(
+ datatoc_volumetric_vert_glsl,
+ datatoc_volumetric_geom_glsl,
+ datatoc_volumetric_scatter_frag_glsl,
+ e_data.lib,
+ SHADER_DEFINES
+ "#define VOLUMETRICS\n"
+ "#define VOLUME_LIGHTING\n"
+ "#define VOLUME_SHADOW\n");
+ }
+ return e_data.scatter_with_lights_sh;
+}
+
+struct GPUShader *EEVEE_shaders_volumes_integration_sh_get()
+{
+ if (e_data.volumetric_integration_sh == NULL) {
+ e_data.volumetric_integration_sh = DRW_shader_create_with_shaderlib(
+ datatoc_volumetric_vert_glsl,
+ datatoc_volumetric_geom_glsl,
+ datatoc_volumetric_integration_frag_glsl,
+ e_data.lib,
+ USE_VOLUME_OPTI ? "#extension GL_ARB_shader_image_load_store: enable\n"
+ "#extension GL_ARB_shading_language_420pack: enable\n"
+ "#define USE_VOLUME_OPTI\n" SHADER_DEFINES :
+ SHADER_DEFINES);
+ }
+ return e_data.volumetric_integration_sh;
+}
+
+struct GPUShader *EEVEE_shaders_volumes_resolve_sh_get()
+{
+ if (e_data.volumetric_resolve_sh == NULL) {
+ e_data.volumetric_resolve_sh = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_volumetric_resolve_frag_glsl, e_data.lib, SHADER_DEFINES);
+ }
+ return e_data.volumetric_resolve_sh;
+}
+
+struct GPUShader *EEVEE_shaders_volumes_accum_sh_get()
+{
+ if (e_data.volumetric_accum_sh == NULL) {
+ e_data.volumetric_accum_sh = DRW_shader_create_fullscreen_with_shaderlib(
+ datatoc_volumetric_accum_frag_glsl, e_data.lib, SHADER_DEFINES);
+ }
+ return e_data.volumetric_accum_sh;
+}
+
+/** \} */
+
GPUShader *EEVEE_shaders_velocity_resolve_sh_get(void)
{
if (e_data.velocity_resolve_sh == NULL) {
@@ -881,6 +1370,41 @@ void EEVEE_shaders_free(void)
MEM_SAFE_FREE(e_data.surface_geom_barycentric);
DRW_SHADER_FREE_SAFE(e_data.lookdev_background);
DRW_SHADER_FREE_SAFE(e_data.update_noise_sh);
+ DRW_SHADER_FREE_SAFE(e_data.downsample_sh);
+ DRW_SHADER_FREE_SAFE(e_data.downsample_cube_sh);
+ DRW_SHADER_FREE_SAFE(e_data.minz_downlevel_sh);
+ DRW_SHADER_FREE_SAFE(e_data.maxz_downlevel_sh);
+ DRW_SHADER_FREE_SAFE(e_data.minz_downdepth_sh);
+ DRW_SHADER_FREE_SAFE(e_data.maxz_downdepth_sh);
+ DRW_SHADER_FREE_SAFE(e_data.minz_downdepth_layer_sh);
+ DRW_SHADER_FREE_SAFE(e_data.maxz_downdepth_layer_sh);
+ DRW_SHADER_FREE_SAFE(e_data.maxz_copydepth_layer_sh);
+ DRW_SHADER_FREE_SAFE(e_data.minz_copydepth_sh);
+ DRW_SHADER_FREE_SAFE(e_data.maxz_copydepth_sh);
+ DRW_SHADER_FREE_SAFE(e_data.ggx_lut_sh);
+ DRW_SHADER_FREE_SAFE(e_data.ggx_refraction_lut_sh);
+ DRW_SHADER_FREE_SAFE(e_data.mist_sh);
+ DRW_SHADER_FREE_SAFE(e_data.motion_blur_sh);
+ DRW_SHADER_FREE_SAFE(e_data.motion_blur_object_sh);
+ DRW_SHADER_FREE_SAFE(e_data.motion_blur_hair_sh);
+ DRW_SHADER_FREE_SAFE(e_data.velocity_tiles_sh);
+ DRW_SHADER_FREE_SAFE(e_data.velocity_tiles_expand_sh);
+ DRW_SHADER_FREE_SAFE(e_data.gtao_sh);
+ DRW_SHADER_FREE_SAFE(e_data.gtao_layer_sh);
+ DRW_SHADER_FREE_SAFE(e_data.gtao_debug_sh);
+ DRW_SHADER_FREE_SAFE(e_data.velocity_resolve_sh);
+ DRW_SHADER_FREE_SAFE(e_data.postprocess_sh);
+ DRW_SHADER_FREE_SAFE(e_data.shadow_sh);
+ DRW_SHADER_FREE_SAFE(e_data.shadow_accum_sh);
+ DRW_SHADER_FREE_SAFE(e_data.sss_sh[0]);
+ DRW_SHADER_FREE_SAFE(e_data.sss_sh[1]);
+ DRW_SHADER_FREE_SAFE(e_data.sss_sh[2]);
+ DRW_SHADER_FREE_SAFE(e_data.volumetric_clear_sh);
+ DRW_SHADER_FREE_SAFE(e_data.scatter_sh);
+ DRW_SHADER_FREE_SAFE(e_data.scatter_with_lights_sh);
+ DRW_SHADER_FREE_SAFE(e_data.volumetric_integration_sh);
+ DRW_SHADER_FREE_SAFE(e_data.volumetric_resolve_sh);
+ DRW_SHADER_FREE_SAFE(e_data.volumetric_accum_sh);
DRW_SHADER_FREE_SAFE(e_data.probe_filter_glossy_sh);
DRW_SHADER_FREE_SAFE(e_data.probe_filter_diffuse_sh);
DRW_SHADER_FREE_SAFE(e_data.probe_filter_visibility_sh);
@@ -903,6 +1427,9 @@ void EEVEE_shaders_free(void)
DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[i]);
DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[i]);
}
+ for (int i = 0; i < SSR_MAX_SHADER; i++) {
+ DRW_SHADER_FREE_SAFE(e_data.ssr_sh[i]);
+ }
DRW_SHADER_LIB_FREE_SAFE(e_data.lib);
if (e_data.default_world) {
diff --git a/source/blender/draw/engines/eevee/eevee_shadows.c b/source/blender/draw/engines/eevee/eevee_shadows.c
index 26bf477763e..df7a7ac3a84 100644
--- a/source/blender/draw/engines/eevee/eevee_shadows.c
+++ b/source/blender/draw/engines/eevee/eevee_shadows.c
@@ -34,15 +34,6 @@
#define SH_CASTER_ALLOC_CHUNK 32
-static struct {
- struct GPUShader *shadow_sh;
- struct GPUShader *shadow_accum_sh;
-} e_data = {NULL}; /* Engine data */
-
-extern char datatoc_shadow_vert_glsl[];
-extern char datatoc_shadow_frag_glsl[];
-extern char datatoc_shadow_accum_frag_glsl[];
-
void eevee_contact_shadow_setup(const Light *la, EEVEE_Shadow *evsh)
{
evsh->contact_dist = (la->mode & LA_SHAD_CONTACT) ? la->contact_dist : 0.0f;
@@ -59,16 +50,6 @@ void EEVEE_shadows_init(EEVEE_ViewLayerData *sldata)
const DRWContextState *draw_ctx = DRW_context_state_get();
const Scene *scene_eval = DEG_get_evaluated_scene(draw_ctx->depsgraph);
- if (!e_data.shadow_sh) {
- DRWShaderLibrary *lib = EEVEE_shader_lib_get();
-
- e_data.shadow_sh = DRW_shader_create_with_shaderlib(
- datatoc_shadow_vert_glsl, NULL, datatoc_shadow_frag_glsl, lib, NULL);
-
- e_data.shadow_accum_sh = DRW_shader_create_fullscreen_with_shaderlib(
- datatoc_shadow_accum_frag_glsl, lib, SHADER_DEFINES);
- }
-
if (!sldata->lights) {
sldata->lights = MEM_callocN(sizeof(EEVEE_LightsInfo), "EEVEE_LightsInfo");
sldata->light_ubo = GPU_uniformbuf_create_ex(sizeof(EEVEE_Light) * MAX_LIGHT, NULL, "evLight");
@@ -140,7 +121,8 @@ void EEVEE_shadows_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
DRWState state = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_SHADOW_OFFSET;
DRW_PASS_CREATE(psl->shadow_pass, state);
- stl->g_data->shadow_shgrp = DRW_shgroup_create(e_data.shadow_sh, psl->shadow_pass);
+ stl->g_data->shadow_shgrp = DRW_shgroup_create(EEVEE_shaders_shadow_sh_get(),
+ psl->shadow_pass);
}
}
@@ -403,7 +385,8 @@ void EEVEE_shadow_output_init(EEVEE_ViewLayerData *sldata,
/* Create Pass and shgroup. */
DRW_PASS_CREATE(psl->shadow_accum_pass,
DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_ALWAYS | DRW_STATE_BLEND_ADD_FULL);
- DRWShadingGroup *grp = DRW_shgroup_create(e_data.shadow_accum_sh, psl->shadow_accum_pass);
+ DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_shadow_accum_sh_get(),
+ psl->shadow_accum_pass);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo);
@@ -434,9 +417,3 @@ void EEVEE_shadow_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_D
}
/* \} */
-
-void EEVEE_shadows_free(void)
-{
- DRW_SHADER_FREE_SAFE(e_data.shadow_sh);
- DRW_SHADER_FREE_SAFE(e_data.shadow_accum_sh);
-}
diff --git a/source/blender/draw/engines/eevee/eevee_subsurface.c b/source/blender/draw/engines/eevee/eevee_subsurface.c
index 3d428bf3bd4..58b545be2f5 100644
--- a/source/blender/draw/engines/eevee/eevee_subsurface.c
+++ b/source/blender/draw/engines/eevee/eevee_subsurface.c
@@ -34,25 +34,6 @@
#include "eevee_private.h"
-static struct {
- struct GPUShader *sss_sh[3];
-} e_data = {{NULL}}; /* Engine data */
-
-extern char datatoc_effect_subsurface_frag_glsl[];
-extern char datatoc_effect_translucency_frag_glsl[];
-
-static void eevee_create_shader_subsurface(void)
-{
- DRWShaderLibrary *lib = EEVEE_shader_lib_get();
-
- e_data.sss_sh[0] = DRW_shader_create_fullscreen_with_shaderlib(
- datatoc_effect_subsurface_frag_glsl, lib, "#define FIRST_PASS\n");
- e_data.sss_sh[1] = DRW_shader_create_fullscreen_with_shaderlib(
- datatoc_effect_subsurface_frag_glsl, lib, "#define SECOND_PASS\n");
- e_data.sss_sh[2] = DRW_shader_create_fullscreen_with_shaderlib(
- datatoc_effect_translucency_frag_glsl, lib, "#define EEVEE_TRANSLUCENCY\n" SHADER_DEFINES);
-}
-
void EEVEE_subsurface_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *UNUSED(vedata))
{
}
@@ -181,11 +162,6 @@ void EEVEE_subsurface_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata
const DRWContextState *draw_ctx = DRW_context_state_get();
const Scene *scene_eval = DEG_get_evaluated_scene(draw_ctx->depsgraph);
- /* Shaders */
- if (!e_data.sss_sh[0]) {
- eevee_create_shader_subsurface();
- }
-
effects->sss_sample_count = 1 + scene_eval->eevee.sss_samples * 2;
effects->sss_surface_count = 0;
common_data->sss_jitter_threshold = scene_eval->eevee.sss_jitter_threshold;
@@ -232,7 +208,8 @@ void EEVEE_subsurface_add_pass(EEVEE_ViewLayerData *sldata,
DRW_shgroup_stencil_mask(shgrp, sss_id);
{
- DRWShadingGroup *grp = DRW_shgroup_create(e_data.sss_sh[0], psl->sss_blur_ps);
+ DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_subsurface_first_pass_sh_get(),
+ psl->sss_blur_ps);
DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", depth_src);
DRW_shgroup_uniform_texture_ref(grp, "sssIrradiance", &effects->sss_irradiance);
@@ -243,7 +220,7 @@ void EEVEE_subsurface_add_pass(EEVEE_ViewLayerData *sldata,
DRW_shgroup_stencil_mask(grp, sss_id);
DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
- grp = DRW_shgroup_create(e_data.sss_sh[1], psl->sss_resolve_ps);
+ grp = DRW_shgroup_create(EEVEE_shaders_subsurface_second_pass_sh_get(), psl->sss_resolve_ps);
DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", depth_src);
DRW_shgroup_uniform_texture_ref(grp, "sssIrradiance", &effects->sss_blur);
@@ -257,7 +234,8 @@ void EEVEE_subsurface_add_pass(EEVEE_ViewLayerData *sldata,
}
if (ma->blend_flag & MA_BL_TRANSLUCENCY) {
- DRWShadingGroup *grp = DRW_shgroup_create(e_data.sss_sh[2], psl->sss_translucency_ps);
+ DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_subsurface_translucency_sh_get(),
+ psl->sss_translucency_ps);
DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
DRW_shgroup_uniform_texture(grp, "sssTexProfile", sss_tex_profile);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", depth_src);
@@ -381,10 +359,3 @@ void EEVEE_subsurface_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEV
GPU_framebuffer_bind(fbl->main_fb);
}
}
-
-void EEVEE_subsurface_free(void)
-{
- DRW_SHADER_FREE_SAFE(e_data.sss_sh[0]);
- DRW_SHADER_FREE_SAFE(e_data.sss_sh[1]);
- DRW_SHADER_FREE_SAFE(e_data.sss_sh[2]);
-}
diff --git a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c
index 4f2cfe224c2..23bb07a33f7 100644
--- a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c
+++ b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c
@@ -41,10 +41,6 @@ static struct {
float inverted_cdf[FILTER_CDF_TABLE_SIZE];
} e_data = {false}; /* Engine data */
-extern char datatoc_common_uniforms_lib_glsl[];
-extern char datatoc_common_view_lib_glsl[];
-extern char datatoc_bsdf_common_lib_glsl[];
-
static float UNUSED_FUNCTION(filter_box)(float UNUSED(x))
{
return 1.0f;
diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c
index 3caca0275c3..85c7c89934c 100644
--- a/source/blender/draw/engines/eevee/eevee_volumes.c
+++ b/source/blender/draw/engines/eevee/eevee_volumes.c
@@ -50,13 +50,6 @@
#include "eevee_private.h"
static struct {
- struct GPUShader *volumetric_clear_sh;
- struct GPUShader *scatter_sh;
- struct GPUShader *scatter_with_lights_sh;
- struct GPUShader *volumetric_integration_sh;
- struct GPUShader *volumetric_resolve_sh;
- struct GPUShader *volumetric_accum_sh;
-
GPUTexture *depth_src;
GPUTexture *dummy_zero;
@@ -70,72 +63,8 @@ static struct {
ListBase smoke_domains;
} e_data = {NULL}; /* Engine data */
-extern char datatoc_bsdf_common_lib_glsl[];
-extern char datatoc_common_uniforms_lib_glsl[];
-extern char datatoc_common_view_lib_glsl[];
-extern char datatoc_octahedron_lib_glsl[];
-extern char datatoc_cubemap_lib_glsl[];
-extern char datatoc_irradiance_lib_glsl[];
-extern char datatoc_lights_lib_glsl[];
-extern char datatoc_volumetric_accum_frag_glsl[];
-extern char datatoc_volumetric_frag_glsl[];
-extern char datatoc_volumetric_geom_glsl[];
-extern char datatoc_volumetric_vert_glsl[];
-extern char datatoc_volumetric_resolve_frag_glsl[];
-extern char datatoc_volumetric_scatter_frag_glsl[];
-extern char datatoc_volumetric_integration_frag_glsl[];
-extern char datatoc_volumetric_lib_glsl[];
-extern char datatoc_common_fullscreen_vert_glsl[];
-
-#define USE_VOLUME_OPTI \
- (GLEW_ARB_shader_image_load_store && GLEW_ARB_shading_language_420pack && \
- !GPU_crappy_amd_driver())
-
-static void eevee_create_shader_volumes(void)
+static void eevee_create_textures_volumes(void)
{
- DRWShaderLibrary *lib = EEVEE_shader_lib_get();
-
- e_data.volumetric_clear_sh = DRW_shader_create_with_shaderlib(datatoc_volumetric_vert_glsl,
- datatoc_volumetric_geom_glsl,
- datatoc_volumetric_frag_glsl,
- lib,
- SHADER_DEFINES
- "#define VOLUMETRICS\n"
- "#define CLEAR\n");
-
- e_data.scatter_sh = DRW_shader_create_with_shaderlib(datatoc_volumetric_vert_glsl,
- datatoc_volumetric_geom_glsl,
- datatoc_volumetric_scatter_frag_glsl,
- lib,
- SHADER_DEFINES
- "#define VOLUMETRICS\n"
- "#define VOLUME_SHADOW\n");
-
- e_data.scatter_with_lights_sh = DRW_shader_create_with_shaderlib(
- datatoc_volumetric_vert_glsl,
- datatoc_volumetric_geom_glsl,
- datatoc_volumetric_scatter_frag_glsl,
- lib,
- SHADER_DEFINES
- "#define VOLUMETRICS\n"
- "#define VOLUME_LIGHTING\n"
- "#define VOLUME_SHADOW\n");
-
- e_data.volumetric_integration_sh = DRW_shader_create_with_shaderlib(
- datatoc_volumetric_vert_glsl,
- datatoc_volumetric_geom_glsl,
- datatoc_volumetric_integration_frag_glsl,
- lib,
- USE_VOLUME_OPTI ? "#extension GL_ARB_shader_image_load_store: enable\n"
- "#extension GL_ARB_shading_language_420pack: enable\n"
- "#define USE_VOLUME_OPTI\n" SHADER_DEFINES :
- SHADER_DEFINES);
-
- e_data.volumetric_resolve_sh = DRW_shader_create_fullscreen_with_shaderlib(
- datatoc_volumetric_resolve_frag_glsl, lib, SHADER_DEFINES);
- e_data.volumetric_accum_sh = DRW_shader_create_fullscreen_with_shaderlib(
- datatoc_volumetric_accum_frag_glsl, lib, SHADER_DEFINES);
-
const float zero[4] = {0.0f, 0.0f, 0.0f, 0.0f};
e_data.dummy_zero = DRW_texture_create_3d(1, 1, 1, GPU_RGBA8, DRW_TEX_WRAP, zero);
@@ -312,9 +241,9 @@ void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
Scene *scene = draw_ctx->scene;
DRWShadingGroup *grp = NULL;
- /* Shaders */
- if (!e_data.scatter_sh) {
- eevee_create_shader_volumes();
+ /* Textures */
+ if (!e_data.dummy_zero) {
+ eevee_create_textures_volumes();
}
/* Quick breakdown of the Volumetric rendering:
@@ -382,7 +311,7 @@ void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
if (grp == NULL) {
/* If no world or volume material is present just clear the buffer with this drawcall */
- grp = DRW_shgroup_create(e_data.volumetric_clear_sh, psl->volumetric_world_ps);
+ grp = DRW_shgroup_create(EEVEE_shaders_volumes_clear_sh_get(), psl->volumetric_world_ps);
DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo);
DRW_shgroup_uniform_block(grp, "light_block", sldata->light_ubo);
@@ -644,7 +573,8 @@ void EEVEE_volumes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
struct GPUShader *sh;
DRW_PASS_CREATE(psl->volumetric_scatter_ps, DRW_STATE_WRITE_COLOR);
- sh = (common_data->vol_use_lights) ? e_data.scatter_with_lights_sh : e_data.scatter_sh;
+ sh = (common_data->vol_use_lights) ? EEVEE_shaders_volumes_scatter_with_lights_sh_get() :
+ EEVEE_shaders_volumes_scatter_sh_get();
grp = DRW_shgroup_create(sh, psl->volumetric_scatter_ps);
DRW_shgroup_uniform_texture_ref(grp, "irradianceGrid", &lcache->grid_tx.tex);
DRW_shgroup_uniform_texture_ref(grp, "shadowCubeTexture", &sldata->shadow_cube_pool);
@@ -664,7 +594,8 @@ void EEVEE_volumes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
DRW_shgroup_call_procedural_triangles(grp, NULL, common_data->vol_tex_size[2]);
DRW_PASS_CREATE(psl->volumetric_integration_ps, DRW_STATE_WRITE_COLOR);
- grp = DRW_shgroup_create(e_data.volumetric_integration_sh, psl->volumetric_integration_ps);
+ grp = DRW_shgroup_create(EEVEE_shaders_volumes_integration_sh_get(),
+ psl->volumetric_integration_ps);
DRW_shgroup_uniform_texture_ref(grp, "volumeScattering", &txl->volume_scatter);
DRW_shgroup_uniform_texture_ref(grp, "volumeExtinction", &txl->volume_transmit);
DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
@@ -675,7 +606,7 @@ void EEVEE_volumes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
grp, NULL, USE_VOLUME_OPTI ? 1 : common_data->vol_tex_size[2]);
DRW_PASS_CREATE(psl->volumetric_resolve_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_CUSTOM);
- grp = DRW_shgroup_create(e_data.volumetric_resolve_sh, psl->volumetric_resolve_ps);
+ grp = DRW_shgroup_create(EEVEE_shaders_volumes_resolve_sh_get(), psl->volumetric_resolve_ps);
DRW_shgroup_uniform_texture_ref(grp, "inScattering", &txl->volume_scatter);
DRW_shgroup_uniform_texture_ref(grp, "inTransmittance", &txl->volume_transmit);
DRW_shgroup_uniform_texture_ref(grp, "inSceneDepth", &e_data.depth_src);
@@ -859,13 +790,6 @@ void EEVEE_volumes_free(void)
DRW_TEXTURE_FREE_SAFE(e_data.dummy_zero);
DRW_TEXTURE_FREE_SAFE(e_data.dummy_one);
DRW_TEXTURE_FREE_SAFE(e_data.dummy_flame);
-
- DRW_SHADER_FREE_SAFE(e_data.volumetric_clear_sh);
- DRW_SHADER_FREE_SAFE(e_data.scatter_sh);
- DRW_SHADER_FREE_SAFE(e_data.scatter_with_lights_sh);
- DRW_SHADER_FREE_SAFE(e_data.volumetric_integration_sh);
- DRW_SHADER_FREE_SAFE(e_data.volumetric_resolve_sh);
- DRW_SHADER_FREE_SAFE(e_data.volumetric_accum_sh);
}
/* -------------------------------------------------------------------- */
@@ -905,7 +829,7 @@ void EEVEE_volumes_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata,
DRW_PASS_CREATE(psl->volumetric_accum_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL);
DRWShadingGroup *grp = NULL;
if ((effects->enabled_effects & EFFECT_VOLUMETRIC) != 0) {
- grp = DRW_shgroup_create(e_data.volumetric_resolve_sh, psl->volumetric_accum_ps);
+ grp = DRW_shgroup_create(EEVEE_shaders_volumes_resolve_sh_get(), psl->volumetric_accum_ps);
DRW_shgroup_uniform_texture_ref(grp, "inScattering", &txl->volume_scatter);
DRW_shgroup_uniform_texture_ref(grp, "inTransmittance", &txl->volume_transmit);
DRW_shgroup_uniform_texture_ref(grp, "inSceneDepth", &e_data.depth_src);
@@ -915,7 +839,7 @@ void EEVEE_volumes_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata,
else {
/* There is no volumetrics in the scene. Use a shader to fill the accum textures with a default
* value. */
- grp = DRW_shgroup_create(e_data.volumetric_accum_sh, psl->volumetric_accum_ps);
+ grp = DRW_shgroup_create(EEVEE_shaders_volumes_accum_sh_get(), psl->volumetric_accum_ps);
}
DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL);
}
diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl
index 2b2da884fde..1e051994693 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl
@@ -6,7 +6,7 @@ void main()
{
vec3 N, T, B, V;
- float NV = (1.0 - (clamp(gl_FragCoord.y / b, 1e-4, 0.9999)));
+ float NV = (1.0 - (clamp(gl_FragCoord.y / LUT_SIZE, 1e-4, 0.9999)));
float sqrtRoughness = clamp(gl_FragCoord.x / LUT_SIZE, 1e-4, 0.9999);
float a = sqrtRoughness * sqrtRoughness;
float a2 = a * a;