diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-09-11 17:15:34 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-09-11 17:15:43 +0300 |
commit | 5a7c3d5a0848a95ef0a4504dade459526f2d7d05 (patch) | |
tree | 5e073c57b22a7ce3a72746a7e75bf2df836363a8 /source/blender/draw/engines/eevee/eevee_effects.c | |
parent | aa5c543a7fe1fa1be95b6a09421a20617928d3b1 (diff) |
Eevee: Prepare for fullres tracing
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_effects.c')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_effects.c | 53 |
1 files changed, 40 insertions, 13 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c index f25a6cf68e8..25061e464c9 100644 --- a/source/blender/draw/engines/eevee/eevee_effects.c +++ b/source/blender/draw/engines/eevee/eevee_effects.c @@ -43,6 +43,7 @@ static struct { 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; @@ -109,6 +110,11 @@ static void eevee_create_shader_downsample(void) 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" @@ -194,9 +200,12 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object /** * MinMax Pyramid */ - int size[2]; - size[0] = max_ii(size_fs[0] / 2, 1); - size[1] = max_ii(size_fs[1] / 2, 1); + const bool half_res_hiz = true; + int size[2], div; + common_data->hiz_mip_offset = (half_res_hiz) ? 1 : 0; + div = (half_res_hiz) ? 2 : 1; + size[0] = max_ii(size_fs[0] / div, 1); + size[1] = max_ii(size_fs[1] / div, 1); if (GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_ANY, GPU_DRIVER_ANY)) { /* Intel gpu seems to have problem rendering to only depth format */ @@ -214,16 +223,12 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object * Compute Mipmap texel alignement. */ for (int i = 0; i < 10; ++i) { - float mip_size[2] = {viewport_size[0], viewport_size[1]}; - for (int j = 0; j < i; ++j) { - mip_size[0] = floorf(fmaxf(1.0f, mip_size[0] / 2.0f)); - mip_size[1] = floorf(fmaxf(1.0f, mip_size[1] / 2.0f)); - } - common_data->mip_ratio[i][0] = viewport_size[0] / (mip_size[0] * powf(2.0f, floorf(log2f(floorf(viewport_size[0] / mip_size[0]))))); - common_data->mip_ratio[i][1] = viewport_size[1] / (mip_size[1] * powf(2.0f, floorf(log2f(floorf(viewport_size[1] / mip_size[1]))))); + int mip_size[2]; + GPU_texture_get_mipmap_size(txl->color, i, mip_size); + common_data->mip_ratio[i][0] = viewport_size[0] / (mip_size[0] * powf(2.0f, i)); + common_data->mip_ratio[i][1] = viewport_size[1] / (mip_size[1] * powf(2.0f, i)); } - /** * Normal buffer for deferred passes. */ @@ -357,6 +362,13 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) grp = DRW_shgroup_create(e_data.maxz_copydepth_sh, psl->maxz_copydepth_ps); DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &e_data.depth_src); DRW_shgroup_call_add(grp, quad, NULL); + + psl->maxz_copydepth_layer_ps = DRW_pass_create( + "HiZ Max Copy DepthLayer Halfres", downsample_write | DRW_STATE_DEPTH_ALWAYS); + grp = DRW_shgroup_create(e_data.maxz_copydepth_layer_sh, 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_add(grp, quad, NULL); } if ((effects->enabled_effects & EFFECT_VELOCITY_BUFFER) != 0) { @@ -425,16 +437,30 @@ void EEVEE_create_minmax_buffer(EEVEE_Data *vedata, GPUTexture *depth_src, int l GPU_framebuffer_recursive_downsample(fbl->downsample_fb, stl->g_data->minzbuffer, 8, &min_downsample_cb, vedata); DRW_stats_group_end(); #endif + int minmax_size[2], depth_size[2]; + GPU_texture_get_mipmap_size(depth_src, 0, depth_size); + GPU_texture_get_mipmap_size(txl->maxzbuffer, 0, minmax_size); + bool is_full_res_minmaxz = (minmax_size[0] == depth_size[0] && minmax_size[1] == depth_size[1]); DRW_stats_group_start("Max buffer"); /* Copy depth buffer to max texture top level */ GPU_framebuffer_texture_attach(fbl->downsample_fb, txl->maxzbuffer, 0, 0); GPU_framebuffer_bind(fbl->downsample_fb); if (layer >= 0) { - DRW_draw_pass(psl->maxz_downdepth_layer_ps); + if (is_full_res_minmaxz) { + DRW_draw_pass(psl->maxz_copydepth_layer_ps); + } + else { + DRW_draw_pass(psl->maxz_downdepth_layer_ps); + } } else { - DRW_draw_pass(psl->maxz_downdepth_ps); + if (is_full_res_minmaxz) { + DRW_draw_pass(psl->maxz_copydepth_ps); + } + else { + DRW_draw_pass(psl->maxz_downdepth_ps); + } } /* Create lower levels */ @@ -552,6 +578,7 @@ void EEVEE_effects_free(void) 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); } |