|
@@ -489,11 +489,7 @@ void RenderForwardClustered::_render_list_template(RenderingDevice::DrawListID p
|
|
|
RID vertex_array_rd;
|
|
|
RID index_array_rd;
|
|
|
RID pipeline_rd;
|
|
|
- uint32_t ubershader_iterations = 2;
|
|
|
- if constexpr (p_pass_mode == PASS_MODE_DEPTH_MATERIAL || p_pass_mode == PASS_MODE_SDF) {
|
|
|
- ubershader_iterations = 1;
|
|
|
- }
|
|
|
-
|
|
|
+ const uint32_t ubershader_iterations = 2;
|
|
|
bool pipeline_valid = false;
|
|
|
while (pipeline_key.ubershader < ubershader_iterations) {
|
|
|
// Skeleton and blend shape.
|
|
@@ -519,9 +515,8 @@ void RenderForwardClustered::_render_list_template(RenderingDevice::DrawListID p
|
|
|
pipeline_hash = pipeline_key.hash();
|
|
|
|
|
|
if (shader != prev_shader || pipeline_hash != prev_pipeline_hash) {
|
|
|
- bool wait_for_compilation = (ubershader_iterations == 1) || pipeline_key.ubershader;
|
|
|
- RS::PipelineSource pipeline_source = wait_for_compilation ? RS::PIPELINE_SOURCE_DRAW : RS::PIPELINE_SOURCE_SPECIALIZATION;
|
|
|
- pipeline_rd = shader->pipeline_hash_map.get_pipeline(pipeline_key, pipeline_hash, wait_for_compilation, pipeline_source);
|
|
|
+ RS::PipelineSource pipeline_source = pipeline_key.ubershader ? RS::PIPELINE_SOURCE_DRAW : RS::PIPELINE_SOURCE_SPECIALIZATION;
|
|
|
+ pipeline_rd = shader->pipeline_hash_map.get_pipeline(pipeline_key, pipeline_hash, pipeline_key.ubershader, pipeline_source);
|
|
|
|
|
|
if (pipeline_rd.is_valid()) {
|
|
|
pipeline_valid = true;
|
|
@@ -3778,7 +3773,7 @@ RID RenderForwardClustered::_setup_sdfgi_render_pass_uniform_set(RID p_albedo_te
|
|
|
// The variant for SDF from the default material should only be retrieved when SDFGI is required.
|
|
|
ERR_FAIL_NULL_V(scene_shader.default_material_shader_ptr, RID());
|
|
|
scene_shader.enable_advanced_shader_group();
|
|
|
- scene_shader.default_shader_sdfgi_rd = scene_shader.default_material_shader_ptr->get_shader_variant(SceneShaderForwardClustered::PIPELINE_VERSION_DEPTH_PASS_WITH_SDF, 0, false);
|
|
|
+ scene_shader.default_shader_sdfgi_rd = scene_shader.default_material_shader_ptr->get_shader_variant(SceneShaderForwardClustered::PIPELINE_VERSION_DEPTH_PASS_WITH_SDF, 0, true);
|
|
|
ERR_FAIL_COND_V(scene_shader.default_shader_sdfgi_rd.is_null(), RID());
|
|
|
}
|
|
|
|
|
@@ -4570,11 +4565,11 @@ void RenderForwardClustered::_mesh_compile_pipelines_for_surface(const SurfacePi
|
|
|
// Depth pass with SDFGI support.
|
|
|
pipeline_key.version = SceneShaderForwardClustered::PIPELINE_VERSION_DEPTH_PASS_WITH_SDF;
|
|
|
pipeline_key.framebuffer_format_id = _get_depth_framebuffer_format_for_pipeline(buffers_can_be_storage, RD::TextureSamples(p_global.texture_samples), false, false);
|
|
|
- _mesh_compile_pipeline_for_surface(p_surface.shader, p_surface.mesh_surface, false, p_surface.instanced, p_source, pipeline_key, r_pipeline_pairs);
|
|
|
+ _mesh_compile_pipeline_for_surface(p_surface.shader, p_surface.mesh_surface, true, p_surface.instanced, p_source, pipeline_key, r_pipeline_pairs);
|
|
|
|
|
|
// Depth pass with SDFGI support for an empty framebuffer.
|
|
|
pipeline_key.framebuffer_format_id = RD::get_singleton()->framebuffer_format_create_empty();
|
|
|
- _mesh_compile_pipeline_for_surface(p_surface.shader, p_surface.mesh_surface, false, p_surface.instanced, p_source, pipeline_key, r_pipeline_pairs);
|
|
|
+ _mesh_compile_pipeline_for_surface(p_surface.shader, p_surface.mesh_surface, true, p_surface.instanced, p_source, pipeline_key, r_pipeline_pairs);
|
|
|
}
|
|
|
|
|
|
// The dedicated depth passes use a different version of the surface and the shader.
|