[Bf-blender-cvs] [5a7c3d5a084] blender2.8: Eevee: Prepare for fullres tracing

Clément Foucault noreply at git.blender.org
Tue Sep 11 16:15:48 CEST 2018


Commit: 5a7c3d5a0848a95ef0a4504dade459526f2d7d05
Author: Clément Foucault
Date:   Tue Sep 11 16:15:34 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB5a7c3d5a0848a95ef0a4504dade459526f2d7d05

Eevee: Prepare for fullres tracing

===================================================================

M	source/blender/draw/engines/eevee/eevee_effects.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
M	source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl
M	source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl

===================================================================

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
 	}



More information about the Bf-blender-cvs mailing list