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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs