From 7170f7a0414ecded72fba3ef69e28be2be148291 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 7 Sep 2020 08:19:09 +0200 Subject: EEVEE: Shaders tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- source/blender/draw/engines/eevee/eevee_effects.c | 96 +--- source/blender/draw/engines/eevee/eevee_engine.c | 7 - source/blender/draw/engines/eevee/eevee_lut_gen.c | 24 +- source/blender/draw/engines/eevee/eevee_mist.c | 25 +- .../blender/draw/engines/eevee/eevee_motion_blur.c | 67 +-- .../blender/draw/engines/eevee/eevee_occlusion.c | 43 +- source/blender/draw/engines/eevee/eevee_private.h | 55 ++- .../draw/engines/eevee/eevee_renderpasses.c | 24 +- .../draw/engines/eevee/eevee_screen_raytrace.c | 62 +-- source/blender/draw/engines/eevee/eevee_shaders.c | 527 +++++++++++++++++++++ source/blender/draw/engines/eevee/eevee_shadows.c | 31 +- .../blender/draw/engines/eevee/eevee_subsurface.c | 39 +- .../draw/engines/eevee/eevee_temporal_sampling.c | 4 - source/blender/draw/engines/eevee/eevee_volumes.c | 100 +--- .../draw/engines/eevee/shaders/bsdf_lut_frag.glsl | 2 +- source/blender/draw/tests/shaders_test.cc | 39 +- 16 files changed, 672 insertions(+), 473 deletions(-) (limited to 'source') 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; diff --git a/source/blender/draw/tests/shaders_test.cc b/source/blender/draw/tests/shaders_test.cc index a9e2a175088..a3a0b792a24 100644 --- a/source/blender/draw/tests/shaders_test.cc +++ b/source/blender/draw/tests/shaders_test.cc @@ -266,11 +266,45 @@ TEST_F(DrawTest, eevee_glsl_shaders_static) EXPECT_NE(EEVEE_shaders_depth_of_field_scatter_get(true), nullptr); EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(false), nullptr); EXPECT_NE(EEVEE_shaders_depth_of_field_resolve_get(true), nullptr); + EXPECT_NE(EEVEE_shaders_effect_downsample_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_downsample_cube_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_minz_downlevel_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_maxz_downlevel_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_minz_downdepth_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_maxz_downdepth_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_minz_downdepth_layer_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_maxz_downdepth_layer_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_maxz_copydepth_layer_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_minz_copydepth_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_maxz_copydepth_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_mist_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_motion_blur_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_motion_blur_object_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_motion_blur_hair_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_motion_blur_velocity_tiles_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_motion_blur_velocity_tiles_expand_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_ambient_occlusion_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_ambient_occlusion_layer_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_effect_ambient_occlusion_debug_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_ggx_lut_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_ggx_refraction_lut_sh_get(), nullptr); EXPECT_NE(EEVEE_shaders_probe_filter_glossy_sh_get(), nullptr); EXPECT_NE(EEVEE_shaders_probe_filter_diffuse_sh_get(), nullptr); EXPECT_NE(EEVEE_shaders_probe_filter_visibility_sh_get(), nullptr); EXPECT_NE(EEVEE_shaders_probe_grid_fill_sh_get(), nullptr); EXPECT_NE(EEVEE_shaders_probe_planar_downsample_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_renderpasses_post_process_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_shadow_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_shadow_accum_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_subsurface_first_pass_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_subsurface_second_pass_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_volumes_clear_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_volumes_clear_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_volumes_scatter_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_volumes_scatter_with_lights_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_volumes_integration_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_volumes_resolve_sh_get(), nullptr); + EXPECT_NE(EEVEE_shaders_volumes_accum_sh_get(), nullptr); EXPECT_NE(EEVEE_shaders_studiolight_probe_sh_get(), nullptr); EXPECT_NE(EEVEE_shaders_studiolight_background_sh_get(), nullptr); EXPECT_NE(EEVEE_shaders_probe_cube_display_sh_get(), nullptr); @@ -280,6 +314,9 @@ TEST_F(DrawTest, eevee_glsl_shaders_static) EXPECT_NE(EEVEE_shaders_velocity_resolve_sh_get(), nullptr); EXPECT_NE(EEVEE_shaders_taa_resolve_sh_get(EFFECT_TAA), nullptr); EXPECT_NE(EEVEE_shaders_taa_resolve_sh_get(EFFECT_TAA_REPROJECT), nullptr); - + for (int index = 0; index < SSR_MAX_SHADER; index++) { + EEVEE_SSRShaderOptions ssr_option = (EEVEE_SSRShaderOptions)index; + EXPECT_NE(EEVEE_shaders_effect_screen_raytrace_sh_get(ssr_option), nullptr); + } EEVEE_shaders_free(); } \ No newline at end of file -- cgit v1.2.3