|
@@ -1739,7 +1739,12 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|
|
_setup_voxelgis(*p_render_data->voxel_gi_instances);
|
|
|
_setup_environment(p_render_data, is_reflection_probe, screen_size, !is_reflection_probe, p_default_bg_color, false);
|
|
|
|
|
|
- _update_render_base_uniform_set(rb->get_samplers()); // May have changed due to the above (light buffer enlarged, as an example).
|
|
|
+ // May have changed due to the above (light buffer enlarged, as an example).
|
|
|
+ if (is_reflection_probe) {
|
|
|
+ _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default(), BASE_UNIFORM_SET_CACHE_DEFAULT);
|
|
|
+ } else {
|
|
|
+ _update_render_base_uniform_set(rb->get_samplers(), BASE_UNIFORM_SET_CACHE_VIEWPORT);
|
|
|
+ }
|
|
|
|
|
|
_fill_render_list(RENDER_LIST_OPAQUE, p_render_data, PASS_MODE_COLOR, using_sdfgi, using_sdfgi || using_voxelgi, using_motion_pass);
|
|
|
render_list[RENDER_LIST_OPAQUE].sort_by_key();
|
|
@@ -1970,7 +1975,11 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|
|
p_render_data->scene_data->opaque_prepass_threshold = 0.0f;
|
|
|
|
|
|
// Shadow pass can change the base uniform set samplers.
|
|
|
- _update_render_base_uniform_set(rb->get_samplers());
|
|
|
+ if (is_reflection_probe) {
|
|
|
+ _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default(), BASE_UNIFORM_SET_CACHE_DEFAULT);
|
|
|
+ } else {
|
|
|
+ _update_render_base_uniform_set(rb->get_samplers(), BASE_UNIFORM_SET_CACHE_VIEWPORT);
|
|
|
+ }
|
|
|
|
|
|
_setup_environment(p_render_data, is_reflection_probe, screen_size, !is_reflection_probe, p_default_bg_color, true, using_motion_pass);
|
|
|
|
|
@@ -2495,7 +2504,7 @@ void RenderForwardClustered::_render_shadow_pass(RID p_light, RID p_shadow_atlas
|
|
|
void RenderForwardClustered::_render_shadow_begin() {
|
|
|
scene_state.shadow_passes.clear();
|
|
|
RD::get_singleton()->draw_command_begin_label("Shadow Setup");
|
|
|
- _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default());
|
|
|
+ _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default(), BASE_UNIFORM_SET_CACHE_DEFAULT);
|
|
|
|
|
|
render_list[RENDER_LIST_SECONDARY].clear();
|
|
|
scene_state.instance_data[RENDER_LIST_SECONDARY].clear();
|
|
@@ -2619,7 +2628,7 @@ void RenderForwardClustered::_render_particle_collider_heightfield(RID p_fb, con
|
|
|
render_data.cluster_max_elements = 32;
|
|
|
render_data.instances = &p_instances;
|
|
|
|
|
|
- _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default());
|
|
|
+ _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default(), BASE_UNIFORM_SET_CACHE_DEFAULT);
|
|
|
|
|
|
_setup_environment(&render_data, true, Vector2(1, 1), true, Color(), false, false, false);
|
|
|
|
|
@@ -2665,7 +2674,7 @@ void RenderForwardClustered::_render_material(const Transform3D &p_cam_transform
|
|
|
|
|
|
scene_shader.enable_advanced_shader_group();
|
|
|
|
|
|
- _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default());
|
|
|
+ _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default(), BASE_UNIFORM_SET_CACHE_DEFAULT);
|
|
|
|
|
|
_setup_environment(&render_data, true, Vector2(1, 1), false, Color());
|
|
|
|
|
@@ -2716,7 +2725,7 @@ void RenderForwardClustered::_render_uv2(const PagedArray<RenderGeometryInstance
|
|
|
|
|
|
scene_shader.enable_advanced_shader_group();
|
|
|
|
|
|
- _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default());
|
|
|
+ _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default(), BASE_UNIFORM_SET_CACHE_DEFAULT);
|
|
|
|
|
|
_setup_environment(&render_data, true, Vector2(1, 1), false, Color());
|
|
|
|
|
@@ -2785,7 +2794,7 @@ void RenderForwardClustered::_render_sdfgi(Ref<RenderSceneBuffersRD> p_render_bu
|
|
|
render_data.cluster_max_elements = 32;
|
|
|
render_data.instances = &p_instances;
|
|
|
|
|
|
- _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default());
|
|
|
+ _update_render_base_uniform_set(RendererRD::MaterialStorage::get_singleton()->samplers_rd_get_default(), BASE_UNIFORM_SET_CACHE_DEFAULT);
|
|
|
|
|
|
PassMode pass_mode = PASS_MODE_SDF;
|
|
|
_fill_render_list(RENDER_LIST_SECONDARY, &render_data, pass_mode);
|
|
@@ -2859,21 +2868,23 @@ void RenderForwardClustered::_render_sdfgi(Ref<RenderSceneBuffersRD> p_render_bu
|
|
|
}
|
|
|
|
|
|
void RenderForwardClustered::base_uniforms_changed() {
|
|
|
- if (!render_base_uniform_set.is_null() && RD::get_singleton()->uniform_set_is_valid(render_base_uniform_set)) {
|
|
|
- RD::get_singleton()->free(render_base_uniform_set);
|
|
|
+ for (int i = 0; i < BASE_UNIFORM_SET_CACHE_MAX; i++) {
|
|
|
+ if (!render_base_uniform_set_cache[i].is_null() && RD::get_singleton()->uniform_set_is_valid(render_base_uniform_set_cache[i])) {
|
|
|
+ RD::get_singleton()->free(render_base_uniform_set_cache[i]);
|
|
|
+ }
|
|
|
+ render_base_uniform_set_cache[i] = RID();
|
|
|
}
|
|
|
- render_base_uniform_set = RID();
|
|
|
}
|
|
|
|
|
|
-void RenderForwardClustered::_update_render_base_uniform_set(const RendererRD::MaterialStorage::Samplers &p_samplers) {
|
|
|
+void RenderForwardClustered::_update_render_base_uniform_set(const RendererRD::MaterialStorage::Samplers &p_samplers, BaseUniformSetCache p_cache_index) {
|
|
|
RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton();
|
|
|
|
|
|
- if (render_base_uniform_set.is_null() || !RD::get_singleton()->uniform_set_is_valid(render_base_uniform_set) || (lightmap_texture_array_version != light_storage->lightmap_array_get_version())) {
|
|
|
- if (render_base_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(render_base_uniform_set)) {
|
|
|
- RD::get_singleton()->free(render_base_uniform_set);
|
|
|
+ if (render_base_uniform_set_cache[p_cache_index].is_null() || !RD::get_singleton()->uniform_set_is_valid(render_base_uniform_set_cache[p_cache_index]) || (lightmap_texture_array_version_cache[p_cache_index] != light_storage->lightmap_array_get_version())) {
|
|
|
+ if (render_base_uniform_set_cache[p_cache_index].is_valid() && RD::get_singleton()->uniform_set_is_valid(render_base_uniform_set_cache[p_cache_index])) {
|
|
|
+ RD::get_singleton()->free(render_base_uniform_set_cache[p_cache_index]);
|
|
|
}
|
|
|
|
|
|
- lightmap_texture_array_version = light_storage->lightmap_array_get_version();
|
|
|
+ lightmap_texture_array_version_cache[p_cache_index] = light_storage->lightmap_array_get_version();
|
|
|
|
|
|
Vector<RD::Uniform> uniforms;
|
|
|
|
|
@@ -3030,8 +3041,9 @@ void RenderForwardClustered::_update_render_base_uniform_set(const RendererRD::M
|
|
|
|
|
|
uniforms.append_array(p_samplers.get_uniforms(SAMPLERS_BINDING_FIRST_INDEX));
|
|
|
|
|
|
- render_base_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, scene_shader.default_shader_rd, SCENE_UNIFORM_SET);
|
|
|
+ render_base_uniform_set_cache[p_cache_index] = RD::get_singleton()->uniform_set_create(uniforms, scene_shader.default_shader_rd, SCENE_UNIFORM_SET);
|
|
|
}
|
|
|
+ render_base_uniform_set = render_base_uniform_set_cache[p_cache_index];
|
|
|
}
|
|
|
|
|
|
RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_render_list, const RenderDataRD *p_render_data, RID p_radiance_texture, bool p_use_directional_shadow_atlas, int p_index) {
|