1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-09 12:50:35 +00:00

Detect possible usage of SSS and screen textures at load time to allocate needed resources at load time.

This allows us to avoid a class of pipeline compilation stutters and
stutters from allocating screen textures.
This commit is contained in:
clayjohn
2025-04-08 23:52:45 -07:00
parent 87f897ae0a
commit bf47c42b21
6 changed files with 106 additions and 37 deletions

View File

@@ -1904,16 +1904,25 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
color_framebuffer = rb_data->get_color_pass_fb(color_pass_flags);
}
if (using_sss || using_separate_specular || scene_state.used_lightmap || using_voxelgi) {
// Ensure this is allocated so we don't get a stutter the first time an object with SSS appears on screen.
if (global_surface_data.sss_used) {
rb_data->ensure_specular();
}
if (global_surface_data.normal_texture_used) {
rb_data->ensure_normal_roughness_texture();
}
if (using_sss || using_separate_specular || scene_state.used_lightmap || using_voxelgi || global_surface_data.sss_used) {
scene_shader.enable_advanced_shader_group(p_render_data->scene_data->view_count > 1);
}
// Update the global pipeline requirements with all the features found to be in use in this scene.
if (depth_pass_mode == PASS_MODE_DEPTH_NORMAL_ROUGHNESS) {
if (depth_pass_mode == PASS_MODE_DEPTH_NORMAL_ROUGHNESS || global_surface_data.normal_texture_used) {
global_pipeline_data_required.use_normal_and_roughness = true;
}
if (scene_state.used_lightmap) {
if (scene_state.used_lightmap || scene_state.lightmaps_used > 0) {
global_pipeline_data_required.use_lightmaps = true;
}
@@ -1921,7 +1930,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
global_pipeline_data_required.use_voxelgi = true;
}
if (using_separate_specular) {
if (using_separate_specular || global_surface_data.sss_used) {
global_pipeline_data_required.use_separate_specular = true;
}
@@ -2292,18 +2301,26 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
rb->ensure_upscaled();
}
if (scene_state.used_screen_texture) {
if (scene_state.used_screen_texture || global_surface_data.screen_texture_used) {
RENDER_TIMESTAMP("Copy Screen Texture");
// Copy screen texture to backbuffer so we can read from it
_render_buffers_copy_screen_texture(p_render_data);
_render_buffers_ensure_screen_texture(p_render_data);
if (scene_state.used_screen_texture) {
// Copy screen texture to backbuffer so we can read from it
_render_buffers_copy_screen_texture(p_render_data);
}
}
if (scene_state.used_depth_texture) {
if (scene_state.used_depth_texture || global_surface_data.depth_texture_used) {
RENDER_TIMESTAMP("Copy Depth Texture");
// Copy depth texture to backbuffer so we can read from it
_render_buffers_copy_depth_texture(p_render_data);
_render_buffers_ensure_depth_texture(p_render_data);
if (scene_state.used_depth_texture) {
// Copy depth texture to backbuffer so we can read from it
_render_buffers_copy_depth_texture(p_render_data);
}
}
{
@@ -3937,18 +3954,22 @@ void RenderForwardClustered::_geometry_instance_add_surface_with_material(Geomet
if (p_material->shader_data->uses_sss) {
flags |= GeometryInstanceSurfaceDataCache::FLAG_USES_SUBSURFACE_SCATTERING;
global_surface_data.sss_used = true;
}
if (p_material->shader_data->uses_screen_texture) {
flags |= GeometryInstanceSurfaceDataCache::FLAG_USES_SCREEN_TEXTURE;
global_surface_data.screen_texture_used = true;
}
if (p_material->shader_data->uses_depth_texture) {
flags |= GeometryInstanceSurfaceDataCache::FLAG_USES_DEPTH_TEXTURE;
global_surface_data.depth_texture_used = true;
}
if (p_material->shader_data->uses_normal_texture) {
flags |= GeometryInstanceSurfaceDataCache::FLAG_USES_NORMAL_TEXTURE;
global_surface_data.normal_texture_used = true;
}
if (ginstance->data->cast_double_sided_shadows) {

View File

@@ -629,6 +629,14 @@ private:
void _update_dirty_geometry_instances();
void _update_dirty_geometry_pipelines();
// Global data about the scene that can be used to pre-allocate resources without relying on culling.
struct GlobalSurfaceData {
bool screen_texture_used = false;
bool normal_texture_used = false;
bool depth_texture_used = false;
bool sss_used = false;
} global_surface_data;
/* Render List */
struct RenderList {