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:
authorClément Foucault <foucault.clem@gmail.com>2018-09-11 17:15:34 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-09-11 17:15:43 +0300
commit5a7c3d5a0848a95ef0a4504dade459526f2d7d05 (patch)
tree5e073c57b22a7ce3a72746a7e75bf2df836363a8 /source/blender/draw
parentaa5c543a7fe1fa1be95b6a09421a20617928d3b1 (diff)
Eevee: Prepare for fullres tracing
Diffstat (limited to 'source/blender/draw')
-rw-r--r--source/blender/draw/engines/eevee/eevee_effects.c53
-rw-r--r--source/blender/draw/engines/eevee/eevee_private.h3
-rw-r--r--source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl5
-rw-r--r--source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl2
-rw-r--r--source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl5
5 files changed, 49 insertions, 19 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);
}
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index d5af5a3d8fe..14b3e8a5540 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -243,6 +243,7 @@ typedef struct EEVEE_PassList {
struct DRWPass *maxz_downdepth_layer_ps;
struct DRWPass *minz_copydepth_ps;
struct DRWPass *maxz_copydepth_ps;
+ struct DRWPass *maxz_copydepth_layer_ps;
struct DRWPass *depth_pass;
struct DRWPass *depth_pass_cull;
@@ -651,6 +652,8 @@ typedef struct EEVEE_CommonUniformBuffer {
int prb_irradiance_vis_size; /* int */
float prb_lod_cube_max; /* float */
float prb_lod_planar_max; /* float */
+ /* Misc */
+ int hiz_mip_offset; /* int */
} EEVEE_CommonUniformBuffer;
/* ***************** CLIP PLANES DATA **************** */
diff --git a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
index fae310be90b..bda3c648bb6 100644
--- a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
@@ -60,8 +60,9 @@ vec2 get_ao_dir(float jitter)
void get_max_horizon_grouped(vec4 co1, vec4 co2, vec3 x, float lod, inout float h)
{
- co1 *= mipRatio[int(lod + 1.0)].xyxy; /* +1 because we are using half res top level */
- co2 *= mipRatio[int(lod + 1.0)].xyxy; /* +1 because we are using half res top level */
+ int mip = int(lod) + hizMipOffset;
+ co1 *= mipRatio[mip].xyxy;
+ co2 *= mipRatio[mip].xyxy;
float depth1 = textureLod(maxzBuffer, co1.xy, floor(lod)).r;
float depth2 = textureLod(maxzBuffer, co1.zw, floor(lod)).r;
diff --git a/source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl b/source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl
index d6abb7dc175..1666d766225 100644
--- a/source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl
@@ -36,6 +36,8 @@ layout(std140) uniform common_block {
int prbIrradianceVisSize;
float prbLodCubeMax;
float prbLodPlanarMax;
+ /* Misc*/
+ int hizMipOffset;
};
/* aoParameters */
diff --git a/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl b/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl
index d035a4329b1..7dd460004ae 100644
--- a/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl
@@ -9,10 +9,7 @@ float sample_depth(vec2 uv, int index, float lod)
else {
#endif
/* Correct UVs for mipmaping mis-alignment */
- /* + 1.0 because we are using half res maxzBuffer
- * and mipRatio starts at on mip 0. */
- int mip = int(lod + 1.0);
- uv *= mipRatio[mip];
+ uv *= mipRatio[int(lod) + hizMipOffset];
return textureLod(maxzBuffer, uv, lod).r;
#ifdef PLANAR_PROBE_RAYTRACE
}