[Bf-blender-cvs] [a507c251b23] blender2.8: Eevee: Put all constant uniforms in a global UBO.

Clément Foucault noreply at git.blender.org
Mon Jan 22 00:14:41 CET 2018


Commit: a507c251b23f2fd6ef7758e443939ce0c5c09e61
Author: Clément Foucault
Date:   Sun Jan 21 17:25:10 2018 +0100
Branches: blender2.8
https://developer.blender.org/rBa507c251b23f2fd6ef7758e443939ce0c5c09e61

Eevee: Put all constant uniforms in a global UBO.

This is an optimization / cleanup commit.

The use of a global ubo remove lots of uniform lookups and only transfert data when needed.

Lots of renaming for more consistent codestyle.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/eevee/eevee_data.c
M	source/blender/draw/engines/eevee/eevee_effects.c
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_lightprobes.c
M	source/blender/draw/engines/eevee/eevee_lights.c
M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/engines/eevee/eevee_occlusion.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_screen_raytrace.c
M	source/blender/draw/engines/eevee/eevee_subsurface.c
M	source/blender/draw/engines/eevee/eevee_volumes.c
M	source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
M	source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
A	source/blender/draw/engines/eevee/shaders/common_uniforms_lib.glsl
M	source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
M	source/blender/draw/engines/eevee/shaders/effect_subsurface_frag.glsl
M	source/blender/draw/engines/eevee/shaders/irradiance_lib.glsl
M	source/blender/draw/engines/eevee/shaders/lightprobe_cube_display_frag.glsl
M	source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl
M	source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
M	source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl
M	source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
M	source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl
M	source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 7737e0b18db..567b8636179 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -135,6 +135,7 @@ data_to_c_simple(engines/eevee/shaders/default_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/default_world_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/background_vert.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/concentric_samples_lib.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/common_uniforms_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lamps_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lightprobe_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl SRC)
diff --git a/source/blender/draw/engines/eevee/eevee_data.c b/source/blender/draw/engines/eevee/eevee_data.c
index f34601ef7b6..0a052b12e93 100644
--- a/source/blender/draw/engines/eevee/eevee_data.c
+++ b/source/blender/draw/engines/eevee/eevee_data.c
@@ -55,6 +55,7 @@ static void eevee_view_layer_data_free(void *storage)
 	DRW_UBO_FREE_SAFE(sldata->probe_ubo);
 	DRW_UBO_FREE_SAFE(sldata->grid_ubo);
 	DRW_UBO_FREE_SAFE(sldata->planar_ubo);
+	DRW_UBO_FREE_SAFE(sldata->common_ubo);
 	DRW_FRAMEBUFFER_FREE_SAFE(sldata->probe_fb);
 	DRW_FRAMEBUFFER_FREE_SAFE(sldata->probe_filter_fb);
 	DRW_TEXTURE_FREE_SAFE(sldata->probe_rt);
@@ -62,9 +63,6 @@ static void eevee_view_layer_data_free(void *storage)
 	DRW_TEXTURE_FREE_SAFE(sldata->probe_pool);
 	DRW_TEXTURE_FREE_SAFE(sldata->irradiance_pool);
 	DRW_TEXTURE_FREE_SAFE(sldata->irradiance_rt);
-
-	/* Volumetrics */
-	MEM_SAFE_FREE(sldata->volumetrics);
 }
 
 static void eevee_lightprobe_data_free(void *storage)
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index c09e180b36d..2065ecabfb6 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -102,6 +102,7 @@ static void eevee_create_shader_downsample(void)
 
 void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
 {
+	EEVEE_CommonUniformBuffer *common_data = &sldata->common_data;
 	EEVEE_StorageList *stl = vedata->stl;
 	EEVEE_FramebufferList *fbl = vedata->fbl;
 	EEVEE_TextureList *txl = vedata->txl;
@@ -169,8 +170,8 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
 			mip_size[0] = floorf(fmaxf(1.0f, mip_size[0] / 2.0f));
 			mip_size[1] = floorf(fmaxf(1.0f, mip_size[1] / 2.0f));
 		}
-		stl->g_data->mip_ratio[i][0] = viewport_size[0] / (mip_size[0] * powf(2.0f, floorf(log2f(floorf(viewport_size[0] / mip_size[0])))));
-		stl->g_data->mip_ratio[i][1] = viewport_size[1] / (mip_size[1] * powf(2.0f, floorf(log2f(floorf(viewport_size[1] / mip_size[1])))));
+		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])))));
 	}
 
 
@@ -209,12 +210,10 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
 	}
 }
 
-void EEVEE_effects_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
+void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
 {
 	EEVEE_PassList *psl = vedata->psl;
-	EEVEE_StorageList *stl = vedata->stl;
 	EEVEE_TextureList *txl = vedata->txl;
-	EEVEE_EffectsInfo *effects = stl->effects;
 	int downsample_write = DRW_STATE_WRITE_DEPTH;
 
 	/* Intel gpu seems to have problem rendering to only depth format.
@@ -229,7 +228,7 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v
 		psl->color_downsample_ps = DRW_pass_create("Downsample", DRW_STATE_WRITE_COLOR);
 		DRWShadingGroup *grp = DRW_shgroup_create(e_data.downsample_sh, psl->color_downsample_ps);
 		DRW_shgroup_uniform_buffer(grp, "source", &e_data.color_src);
-		DRW_shgroup_uniform_float(grp, "fireflyFactor", &effects->ssr_firefly_fac, 1);
+		DRW_shgroup_uniform_float(grp, "fireflyFactor", &sldata->common_data.ssr_firefly_fac, 1);
 		DRW_shgroup_call_add(grp, quad, NULL);
 	}
 
@@ -401,7 +400,7 @@ void EEVEE_downsample_cube_buffer(EEVEE_Data *vedata, struct GPUFrameBuffer *fb_
 	DRW_stats_group_end();
 }
 
-void EEVEE_draw_effects(EEVEE_Data *vedata)
+void EEVEE_draw_effects(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
 {
 	EEVEE_TextureList *txl = vedata->txl;
 	EEVEE_FramebufferList *fbl = vedata->fbl;
@@ -478,7 +477,7 @@ void EEVEE_draw_effects(EEVEE_Data *vedata)
 	}
 
 	/* Record pers matrix for the next frame. */
-	DRW_viewport_matrix_get(stl->g_data->prev_persmat, DRW_MAT_PERS);
+	DRW_viewport_matrix_get(sldata->common_data.prev_persmat, DRW_MAT_PERS);
 
 	/* Update double buffer status if render mode. */
 	if (DRW_state_is_image_render()) {
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 2e7be2c29a5..fe2beb4b557 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -66,10 +66,14 @@ static void eevee_engine_init(void *ved)
 	                    (int)viewport_size[0], (int)viewport_size[1],
 	                    &tex, 1);
 
+	if (sldata->common_ubo == NULL) {
+		sldata->common_ubo = DRW_uniformbuffer_create(sizeof(sldata->common_data), &sldata->common_data);
+	}
+
 	/* EEVEE_effects_init needs to go first for TAA */
 	EEVEE_effects_init(sldata, vedata);
 
-	EEVEE_materials_init(stl, fbl);
+	EEVEE_materials_init(sldata, stl, fbl);
 	EEVEE_lights_init(sldata);
 	EEVEE_lightprobes_init(sldata, vedata);
 
@@ -188,6 +192,9 @@ static void eevee_draw_background(void *vedata)
 		EEVEE_lightprobes_refresh(sldata, vedata);
 		DRW_stats_group_end();
 
+		/* Update common buffer after probe rendering. */
+		DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
+
 		/* Refresh shadows */
 		DRW_stats_group_start("Shadows");
 		EEVEE_draw_shadows(sldata, psl);
@@ -263,7 +270,7 @@ static void eevee_draw_background(void *vedata)
 
 		/* Post Process */
 		DRW_stats_group_start("Post FX");
-		EEVEE_draw_effects(vedata);
+		EEVEE_draw_effects(sldata, vedata);
 		DRW_stats_group_end();
 
 		if ((stl->effects->taa_current_sample > 1) && !DRW_state_is_image_render()) {
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index 9d90338131b..18dc7efa8ed 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -107,6 +107,7 @@ extern char datatoc_irradiance_lib_glsl[];
 extern char datatoc_lightprobe_lib_glsl[];
 extern char datatoc_octahedron_lib_glsl[];
 extern char datatoc_bsdf_common_lib_glsl[];
+extern char datatoc_common_uniforms_lib_glsl[];
 extern char datatoc_bsdf_sampling_lib_glsl[];
 
 extern GlobalsUboStorage ts;
@@ -205,6 +206,7 @@ static void lightprobe_shaders_init(void)
 	char *shader_str = NULL;
 
 	shader_str = BLI_string_joinN(
+	        datatoc_common_uniforms_lib_glsl,
 	        datatoc_bsdf_common_lib_glsl,
 	        datatoc_bsdf_sampling_lib_glsl,
 	        datatoc_lightprobe_filter_glossy_frag_glsl);
@@ -218,6 +220,7 @@ static void lightprobe_shaders_init(void)
 	MEM_freeN(shader_str);
 
 	shader_str = BLI_string_joinN(
+	        datatoc_common_uniforms_lib_glsl,
 	        datatoc_bsdf_common_lib_glsl,
 	        datatoc_bsdf_sampling_lib_glsl,
 	        datatoc_lightprobe_filter_diffuse_frag_glsl);
@@ -227,6 +230,7 @@ static void lightprobe_shaders_init(void)
 	MEM_freeN(shader_str);
 
 	shader_str = BLI_string_joinN(
+	        datatoc_common_uniforms_lib_glsl,
 	        datatoc_bsdf_common_lib_glsl,
 	        datatoc_bsdf_sampling_lib_glsl,
 	        datatoc_lightprobe_filter_visibility_frag_glsl);
@@ -237,6 +241,7 @@ static void lightprobe_shaders_init(void)
 
 	shader_str = BLI_string_joinN(
 	        datatoc_octahedron_lib_glsl,
+	        datatoc_common_uniforms_lib_glsl,
 	        datatoc_bsdf_common_lib_glsl,
 	        datatoc_irradiance_lib_glsl,
 	        datatoc_lightprobe_lib_glsl,
@@ -252,6 +257,7 @@ static void lightprobe_shaders_init(void)
 
 	shader_str = BLI_string_joinN(
 	        datatoc_octahedron_lib_glsl,
+	        datatoc_common_uniforms_lib_glsl,
 	        datatoc_bsdf_common_lib_glsl,
 	        datatoc_lightprobe_lib_glsl,
 	        datatoc_lightprobe_cube_display_frag_glsl);
@@ -276,6 +282,7 @@ static void lightprobe_shaders_init(void)
 
 void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *UNUSED(vedata))
 {
+	EEVEE_CommonUniformBuffer *common_data = &sldata->common_data;
 	bool update_all = false;
 	const DRWContextState *draw_ctx = DRW_context_state_get();
 	ViewLayer *view_layer = draw_ctx->view_layer;
@@ -288,15 +295,16 @@ void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *UNUSED(veda
 
 	if (!sldata->probes) {
 		sldata->probes = MEM_callocN(sizeof(EEVEE_LightProbesInfo), "EEVEE_LightProbesInfo");
-		sldata->probes->specular_toggle = true;
-		sldata->probes->ssr_toggle = true;
-		sldata->probes->sss_toggle = true;
 		sldata->probes->grid_initialized = false;
 		sldata->probe_ubo = DRW_uniformbuffer_create(sizeof(EEVEE_LightProbe) * MAX_PROBE, NULL);
 		sldata->grid_ubo = DRW_uniformbuffer_create(sizeof(EEVEE_LightGrid) * MAX_GRID, NULL);
 		sldata->planar_ubo = DRW_uniformbuffer_create(sizeof(EEVEE_PlanarReflection) * MAX_PLANAR, NULL);
 	}
 
+	common_data->spec_toggle = true;
+	common_data->ssr_toggle = true;
+	common_data->sss_toggle = true;
+
 	int prop_bounce_num = BKE_collection_engine_property_value_get_int(props, "gi_diffuse_bounces");
 	if (sldata->probes->num_bounce != prop_bounce_num) {
 		sldata->probes->num_bounce = prop_bounce_num;
@@ -315,8 +323,8 @@ void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *UNUSED(veda
 	}
 
 	int visibility_res = BKE_collection_engine_property_value_get_int(props, "gi_visibility_resolution");
-	if (sldata->probes->irradiance_vis_size != visibility_res) {
-		sldata->probes->irradiance_vis_size = visibility_res;
+	if (common_data->prb_irradiance_vis_size 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list