[Bf-blender-cvs] [f8b63b564de] blender2.8: Eevee: Update to support shader deferred compilation.

Clément Foucault noreply at git.blender.org
Tue Mar 6 16:45:44 CET 2018


Commit: f8b63b564de7e9d46a2fcb0fd485d0cea1a98aae
Author: Clément Foucault
Date:   Tue Mar 6 02:19:28 2018 +0100
Branches: blender2.8
https://developer.blender.org/rBf8b63b564de7e9d46a2fcb0fd485d0cea1a98aae

Eevee: Update to support shader deferred compilation.

World probe is tagged to refresh when it it's shader is updated.
Probes are recomputed only after all meshes shaders have been compiled.

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

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_materials.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_render.c

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

diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 2a866ee2b86..ecded9bb929 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -100,7 +100,7 @@ static void eevee_cache_init(void *vedata)
 	EEVEE_effects_cache_init(sldata, vedata);
 	EEVEE_lightprobes_cache_init(sldata, vedata);
 	EEVEE_lights_cache_init(sldata, vedata);
-	EEVEE_materials_cache_init(vedata);
+	EEVEE_materials_cache_init(sldata, vedata);
 	EEVEE_motion_blur_cache_init(sldata, vedata);
 	EEVEE_occlusion_cache_init(sldata, vedata);
 	EEVEE_screen_raytrace_cache_init(sldata, vedata);
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index dd4dc590b10..9705ba7d645 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -85,8 +85,6 @@ static struct {
 
 	struct Gwn_VertFormat *format_probe_display_cube;
 	struct Gwn_VertFormat *format_probe_display_planar;
-
-	int update_world;
 } e_data = {NULL}; /* Engine data */
 
 extern char datatoc_background_vert_glsl[];
@@ -304,6 +302,9 @@ void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *UNUSED(veda
 		sldata->planar_ubo = DRW_uniformbuffer_create(sizeof(EEVEE_PlanarReflection) * MAX_PLANAR, NULL);
 	}
 
+	/* Only start doing probes if all materials have finished compiling. */
+	sldata->probes->all_materials_updated = true;
+
 	common_data->spec_toggle = true;
 	common_data->ssr_toggle = true;
 	common_data->sss_toggle = true;
@@ -334,7 +335,7 @@ void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *UNUSED(veda
 	}
 
 	if (update_all) {
-		e_data.update_world |= PROBE_UPDATE_ALL;
+		sldata->probes->update_world |= PROBE_UPDATE_ALL;
 		sldata->probes->updated_bounce = 0;
 		sldata->probes->grid_initialized = false;
 	}
@@ -395,34 +396,50 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedat
 		float *col = ts.colorBackground;
 		if (wo) {
 			col = &wo->horr;
-			if (wo->update_flag != 0 || pinfo->prev_world != wo) {
-				e_data.update_world |= PROBE_UPDATE_ALL;
-				pinfo->updated_bounce = 0;
-				pinfo->grid_initialized = false;
-			}
-			wo->update_flag = 0;
+			bool wo_sh_compiled = true;
 
 			if (wo->use_nodes && wo->nodetree) {
+				static float error_col[3] = {1.0f, 0.0f, 1.0f};
+				static float compile_col[3] = {0.5f, 0.5f, 0.5f};
 				struct GPUMaterial *gpumat = EEVEE_material_world_lightprobe_get(scene, wo);
 
-				grp = DRW_shgroup_material_create(gpumat, psl->probe_background);
-
-				if (grp) {
-					DRW_shgroup_uniform_float(grp, "backgroundAlpha", &stl->g_data->background_alpha, 1);
-					DRW_shgroup_call_add(grp, geom, NULL);
-				}
-				else {
-					/* Shader failed : pink background */
-					static float pink[3] = {1.0f, 0.0f, 1.0f};
-					col = pink;
+				GPUMaterialStatus status = GPU_material_status(gpumat);
+
+				switch (status) {
+					case GPU_MAT_SUCCESS:
+						grp = DRW_shgroup_material_create(gpumat, psl->probe_background);
+						DRW_shgroup_uniform_float(grp, "backgroundAlpha", &stl->g_data->background_alpha, 1);
+						DRW_shgroup_call_add(grp, geom, NULL);
+						wo_sh_compiled = true;
+						break;
+					case GPU_MAT_QUEUED:
+						pinfo->all_materials_updated = false;
+						wo_sh_compiled = false;
+						/* TODO Bypass probe compilation. */
+						col = compile_col;
+						break;
+					case GPU_MAT_FAILED:
+					default:
+						wo_sh_compiled = true;
+						col = error_col;
+						break;
 				}
 			}
 
-			pinfo->prev_world = wo;
+			if (wo->update_flag != 0 || pinfo->prev_world != wo || pinfo->prev_wo_sh_compiled != wo_sh_compiled) {
+				pinfo->update_world |= PROBE_UPDATE_ALL;
+				pinfo->updated_bounce = 0;
+				pinfo->grid_initialized = false;
+
+				pinfo->prev_wo_sh_compiled = wo_sh_compiled;
+				pinfo->prev_world = wo;
+			}
+			wo->update_flag = 0;
 		}
 		else if (pinfo->prev_world) {
+			pinfo->prev_wo_sh_compiled = false;
 			pinfo->prev_world = NULL;
-			e_data.update_world |= PROBE_UPDATE_ALL;
+			pinfo->update_world |= PROBE_UPDATE_ALL;
 			pinfo->updated_bounce = 0;
 			pinfo->grid_initialized = false;
 		}
@@ -584,7 +601,7 @@ void EEVEE_lightprobes_cache_add(EEVEE_ViewLayerData *sldata, Object *ob)
 		}
 	}
 
-	if (e_data.update_world) {
+	if (pinfo->update_world) {
 		ped->need_update = true;
 		ped->updated_cells = 0;
 		ped->updated_lvl = 0;
@@ -899,7 +916,7 @@ void EEVEE_lightprobes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *ved
 		}
 
 		/* Tag probes to refresh */
-		e_data.update_world |= PROBE_UPDATE_CUBE;
+		pinfo->update_world |= PROBE_UPDATE_CUBE;
 		common_data->prb_num_render_cube = 0;
 		pinfo->cache_num_cube = pinfo->num_cube;
 
@@ -935,7 +952,7 @@ void EEVEE_lightprobes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *ved
 		common_data->prb_num_render_grid = 0;
 		pinfo->updated_bounce = 0;
 		pinfo->grid_initialized = false;
-		e_data.update_world |= PROBE_UPDATE_GRID;
+		pinfo->update_world |= PROBE_UPDATE_GRID;
 
 		for (int i = 1; (ob = pinfo->probes_grid_ref[i]) && (i < MAX_PROBE); i++) {
 			EEVEE_LightProbeEngineData *ped = EEVEE_lightprobe_data_ensure(ob);
@@ -1372,14 +1389,15 @@ static void lightprobe_cell_world_location_get(EEVEE_LightGrid *egrid, float loc
 static void lightprobes_refresh_world(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
 {
 	EEVEE_CommonUniformBuffer *common_data = &sldata->common_data;
+	EEVEE_LightProbesInfo *pinfo = sldata->probes;
 	EEVEE_PassList *psl = vedata->psl;
 
 	render_world_to_probe(sldata, psl);
-	if (e_data.update_world & PROBE_UPDATE_CUBE) {
+	if (pinfo->update_world & PROBE_UPDATE_CUBE) {
 		glossy_filter_probe(sldata, vedata, psl, 0, 1.0);
 		common_data->prb_num_render_cube = 1;
 	}
-	if (e_data.update_world & PROBE_UPDATE_GRID) {
+	if (pinfo->update_world & PROBE_UPDATE_GRID) {
 		diffuse_filter_probe(sldata, vedata, psl, 0, 0.0, 0.0, 0.0, 0.0, 1.0);
 		SWAP(GPUTexture *, sldata->irradiance_pool, sldata->irradiance_rt);
 		DRW_framebuffer_texture_detach(sldata->probe_pool);
@@ -1389,7 +1407,7 @@ static void lightprobes_refresh_world(EEVEE_ViewLayerData *sldata, EEVEE_Data *v
 		DRW_framebuffer_texture_attach(sldata->probe_filter_fb, sldata->probe_pool, 0, 0);
 		common_data->prb_num_render_grid = 1;
 	}
-	e_data.update_world = 0;
+	pinfo->update_world = 0;
 	DRW_viewport_request_redraw();
 }
 
@@ -1664,6 +1682,7 @@ bool EEVEE_lightprobes_all_probes_ready(EEVEE_ViewLayerData *sldata, EEVEE_Data
 void EEVEE_lightprobes_refresh(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
 {
 	EEVEE_CommonUniformBuffer *common_data = &sldata->common_data;
+	EEVEE_LightProbesInfo *pinfo = sldata->probes;
 
 	/* Disable specular lighting when rendering probes to avoid feedback loops (looks bad). */
 	common_data->spec_toggle = false;
@@ -1677,10 +1696,10 @@ void EEVEE_lightprobes_refresh(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
 	common_data->ao_dist = 0.0f;
 
 	/* Render world in priority */
-	if (e_data.update_world) {
+	if (pinfo->update_world) {
 		lightprobes_refresh_world(sldata, vedata);
 	}
-	else if (EEVEE_lightprobes_all_probes_ready(sldata, vedata) == false) {
+	else if (EEVEE_lightprobes_all_probes_ready(sldata, vedata) == false && pinfo->all_materials_updated) {
 		lightprobes_refresh_all_no_world(sldata, vedata);
 	}
 
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 314cbc5033a..a72bf85cbe9 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -856,7 +856,7 @@ static struct DRWShadingGroup *EEVEE_default_shading_group_get(
 	return DRW_shgroup_create(e_data.default_lit[options], vedata->psl->default_pass[options]);
 }
 
-void EEVEE_materials_cache_init(EEVEE_Data *vedata)
+void EEVEE_materials_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
 {
 	EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
 	EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
@@ -894,6 +894,7 @@ void EEVEE_materials_cache_init(EEVEE_Data *vedata)
 						DRW_shgroup_call_add(grp, geom, NULL);
 						break;
 					case GPU_MAT_QUEUED:
+						sldata->probes->all_materials_updated = false;
 						/* TODO Bypass probe compilation. */
 						col = compile_col;
 						break;
@@ -1042,60 +1043,29 @@ static void material_opaque(
 	}
 
 	if (use_gpumat) {
+		static float error_col[3] = {1.0f, 0.0f, 1.0f};
+		static float compile_col[3] = {0.5f, 0.5f, 0.5f};
+		static float half = 0.5f;
+
 		/* Shading */
 		*gpumat = EEVEE_material_mesh_get(scene, ma, vedata, false, false, use_refract,
 		                                  use_sss, use_translucency, linfo->shadow_method);
 
-		*shgrp = DRW_shgroup_material_create(*gpumat,
-		                                     (use_refract) ? psl->refract_pass :
-		                                     (use_sss) ? psl->sss_pass : psl->material_pass);
-		if (*shgrp) {
-			static int no_ssr = -1;
-			static int first_ssr = 1;
-			int *ssr_id = (((effects->enabled_effects & EFFECT_SSR) != 0) && !use_refract) ? &first_ssr : &no_ssr;
-			add_standard_uniforms(*shgrp, sldata, vedata, ssr_id, &ma->refract_depth, use_refract, false);
-
-			if (use_sss) {
-				struct GPUTexture *sss_tex_profile = NULL;
-				struct GPUUniformBuffer *sss_profile = GPU_material_sss_profile_get(*gpumat,
-				                                                                    stl->effects->sss_sample_count,
-				                                                                    &sss_tex_profile);
-
-				if (sss_profile) {
-					if (use_translucency) {
-						DRW_shgroup_uniform_block(*shgrp, "sssProfile", sss_profile);
-						DRW_shgroup_uniform_texture(*shgrp, "sssTexProfile", sss_tex_profile);
-					}
-
-					/* Limit of 8 bit stencil buffer. ID 255 is refraction. */
-					if (e_data.sss_count < 254) {
-						DRW_shgroup_stencil_mask(*shgrp, e_data.sss_count + 1);
-						EEVEE_subsurface_add_pass(sldata, vedata, e_data.sss_count + 1, sss_profile);
-						e_data.sss_count++;
-					}
-					else {
-						/* TODO : display message. *

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list