Skip to content

Make possible to generate a build profile from the command line #103097

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

YeldhamDev
Copy link
Member

This PR adds --generate-build-profile option to the editor binary, allowing to generate a build profile from the command line. By doing:

godot --path path/to/project --generate-build-profile path/to/profile.build

It detects what is being used in the project, and places the generated profile in the specified file path. This will be very handy for CI builds.

Sponsored By: 🐺 Lone Wolf Technology / 🍀 W4 Games.

Copy link
Member

@Calinou Calinou left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested locally, it mostly works as expected. Code looks good to me.

Remember to update misc/dist/shell/godot.bash-completion too.

As for generation itself, I get many errors when running on the 3D platformer demo if I didn't open the project in the editor beforehand to create .godot/:

[   0% ] first_scan_filesystem | Started Project initialization (5 steps)
[   0% ] first_scan_filesystem | Scanning file structure...
[  16% ] first_scan_filesystem | Loading global class names...
[  33% ] first_scan_filesystem | Verifying GDExtensions...
[  50% ] first_scan_filesystem | Creating autoload scripts...
[  66% ] first_scan_filesystem | Initializing plugins...
[  83% ] first_scan_filesystem | Starting file scan...
[ DONE ] first_scan_filesystem

ERROR: res://game.tscn:22 - Parse Error: Missing 'type' in external resource tag.
   at: _printerr (./scene/resources/resource_format_text.cpp:39)
ERROR: Condition "p_f->get_error() != OK" is true.
   at: get_classes_used (./core/io/resource_format_binary.cpp:943)
ERROR: res://enemy/enemy.tscn:444 - Parse Error: Missing 'type' in external resource tag.
   at: _printerr (./scene/resources/resource_format_text.cpp:39)
ERROR: Condition "p_f->get_error() != OK" is true.
   at: get_classes_used (./core/io/resource_format_binary.cpp:943)
ERROR: res://player/player.tscn:116 - Parse Error: Missing 'type' in external resource tag.
   at: _printerr (./scene/resources/resource_format_text.cpp:39)
ERROR: res://stage/stage.tscn:26 - Parse Error: Missing 'type' in external resource tag.
   at: _printerr (./scene/resources/resource_format_text.cpp:39)
ERROR: 1 RID allocations of type 'P11JoltShape3D' were leaked at exit.
ERROR: 6 RID allocations of type 'P10JoltBody3D' were leaked at exit.
ERROR: Pages in use exist at exit in PagedAllocator: N33RendererSceneRenderImplementation22RenderForwardClustered32GeometryInstanceForwardClusteredE
   at: ~PagedAllocator (./core/templates/paged_allocator.h:169)
ERROR: 2 shaders of type SceneForwardClusteredShaderRD were never freed
   at: ~ShaderRD (./servers/rendering/renderer_rd/shader_rd.cpp:1042)
ERROR: 6 RID allocations of type 'N10RendererRD12LightStorage13LightInstanceE' were leaked at exit.
ERROR: 6 RID allocations of type 'N10RendererRD12LightStorage5LightE' were leaked at exit.
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
ERROR: 6 RID allocations of type 'N10RendererRD11MeshStorage9MultiMeshE' were leaked at exit.
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
ERROR: 2 RID allocations of type 'N10RendererRD11MeshStorage4MeshE' were leaked at exit.
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
ERROR: 2 RID allocations of type 'N10RendererRD15MaterialStorage8MaterialE' were leaked at exit.
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
ERROR: 2 RID allocations of type 'N10RendererRD15MaterialStorage6ShaderE' were leaked at exit.
ERROR: 18 RID allocations of type 'N17RendererSceneCull8InstanceE' were leaked at exit.
WARNING: 6 RIDs of type "StorageBuffer" were leaked.
     at: _free_rids (./servers/rendering/rendering_device.cpp:6957)
WARNING: 2 RIDs of type "UniformBuffer" were leaked.
     at: _free_rids (./servers/rendering/rendering_device.cpp:6957)
WARNING: 2 RIDs of type "IndexArray" were leaked.
     at: _free_rids (./servers/rendering/rendering_device.cpp:6957)
WARNING: 2 RIDs of type "IndexBuffer" were leaked.
     at: _free_rids (./servers/rendering/rendering_device.cpp:6957)
WARNING: 4 RIDs of type "VertexBuffer" were leaked.
     at: _free_rids (./servers/rendering/rendering_device.cpp:6957)
WARNING: ObjectDB instances leaked at exit (run with --verbose for details).
     at: cleanup (./core/object/object.cpp:2490)
ERROR: 11 resources still in use at exit (run with --verbose for details).
   at: clear (./core/io/resource.cpp:784)

The generated profile will also be different, while the CLI/GUI profiles are 100% identical if resources were imported before running --generate-build-profile. This can't happen in a GUI scenario as you always have resources imported while the editor is open.

3d_platformer_build_profiles.zip

@YeldhamDev
Copy link
Member Author

@Calinou This can be solved by running --import once before --generate-build-profile. Now I wonder if there should just be a warning if you do it without importing, or should the latter also trigger importing as well?

@Calinou
Copy link
Member

Calinou commented Jun 1, 2025

@Calinou This can be solved by running --import once before --generate-build-profile. Now I wonder if there should just be a warning if you do it without importing, or should the latter also trigger importing as well?

I would make --generate-build-profile imply --import, so it happens automatically. This will avoid pitfalls with CI usage.

@YeldhamDev YeldhamDev force-pushed the build_cmdline_gen_profile branch from 00bf1cc to e175283 Compare June 1, 2025 17:23
@YeldhamDev
Copy link
Member Author

@Calinou Try again, please.

@Calinou
Copy link
Member

Calinou commented Jun 3, 2025

I still get errors with the latest revision of this PR on the 3D platformer demo when generating a profile after removing .godot/:

[   0% ] first_scan_filesystem | Started Project initialization (5 steps)
[   0% ] first_scan_filesystem | Scanning file structure...
[  16% ] first_scan_filesystem | Loading global class names...
[  33% ] first_scan_filesystem | Verifying GDExtensions...
[  50% ] first_scan_filesystem | Creating autoload scripts...
[  66% ] first_scan_filesystem | Initializing plugins...
[  83% ] first_scan_filesystem | Starting file scan...
[ DONE ] first_scan_filesystem

[   0% ] update_scripts_classes | Started Registering global classes... (5 steps)
[   0% ] update_scripts_classes | 
[  16% ] update_scripts_classes | 
[  33% ] update_scripts_classes | Bullet
[  50% ] update_scripts_classes | 
[  66% ] update_scripts_classes | Player
[ DONE ] update_scripts_classes

[   0% ] _update_scan_actions | Started Scanning actions... (37 steps)
[   0% ] _update_scan_actions | sound_coin.wav
[   2% ] _update_scan_actions | enemy.glb
[   5% ] _update_scan_actions | robot_walk.wav
[   7% ] _update_scan_actions | sound_explode.wav
[  10% ] _update_scan_actions | sound_hit.wav
[  13% ] _update_scan_actions | osb_down.webp
[  15% ] _update_scan_actions | osb_fire.webp
[  18% ] _update_scan_actions | osb_jump.webp
[  21% ] _update_scan_actions | osb_left.webp
[  23% ] _update_scan_actions | osb_right.webp
[  26% ] _update_scan_actions | osb_up.webp
[  28% ] _update_scan_actions | player.glb
[  31% ] _update_scan_actions | sound_jump.wav
[  34% ] _update_scan_actions | sound_shoot.wav
[  36% ] _update_scan_actions | ceiling.webp
[  39% ] _update_scan_actions | ceiling_corner.webp
[  42% ] _update_scan_actions | ceiling_wall.webp
[  44% ] _update_scan_actions | corner.webp
[  47% ] _update_scan_actions | corner_fix.webp
[  50% ] _update_scan_actions | corner_fixr.webp
[  52% ] _update_scan_actions | corner_floor.webp
[  55% ] _update_scan_actions | floor.webp
[  57% ] _update_scan_actions | floor_corner.webp
[  60% ] _update_scan_actions | floor_edge.webp
[  63% ] _update_scan_actions | ramp.webp
[  65% ] _update_scan_actions | tree_top.webp
[  68% ] _update_scan_actions | trunk.webp
[  71% ] _update_scan_actions | trunk_deco.webp
[  73% ] _update_scan_actions | trunk_floor.webp
[  76% ] _update_scan_actions | wall.webp
[  78% ] _update_scan_actions | wall_floor.webp
[  81% ] _update_scan_actions | wall_var.webp
[  84% ] _update_scan_actions | panorama.webp
[  86% ] _update_scan_actions | tiles_albedo.webp
[  89% ] _update_scan_actions | tiles_rough.webp
[  92% ] _update_scan_actions | icon.webp
[  94% ] _update_scan_actions | particle.webp
[ DONE ] _update_scan_actions

[   0% ] reimport | Started (Re)Importing Assets (37 steps)
[   0% ] reimport | Preparing files to reimport...
[   2% ] reimport | Preparing files to reimport...
[   5% ] reimport | Preparing files to reimport...
[   7% ] reimport | Preparing files to reimport...
[  10% ] reimport | Preparing files to reimport...
[  13% ] reimport | Preparing files to reimport...
[  15% ] reimport | Preparing files to reimport...
[  18% ] reimport | Preparing files to reimport...
[  21% ] reimport | Preparing files to reimport...
[  23% ] reimport | Preparing files to reimport...
[  26% ] reimport | Preparing files to reimport...
[  28% ] reimport | Preparing files to reimport...
[  31% ] reimport | Preparing files to reimport...
[  34% ] reimport | Preparing files to reimport...
[  36% ] reimport | Preparing files to reimport...
[  39% ] reimport | Preparing files to reimport...
[  42% ] reimport | Preparing files to reimport...
[  44% ] reimport | Preparing files to reimport...
[  47% ] reimport | Preparing files to reimport...
[  50% ] reimport | Preparing files to reimport...
[  52% ] reimport | Preparing files to reimport...
[  55% ] reimport | Preparing files to reimport...
[  57% ] reimport | Preparing files to reimport...
[  60% ] reimport | Preparing files to reimport...
[  63% ] reimport | Preparing files to reimport...
[  65% ] reimport | Preparing files to reimport...
[  68% ] reimport | Preparing files to reimport...
[  71% ] reimport | Preparing files to reimport...
[  73% ] reimport | Preparing files to reimport...
[  76% ] reimport | Preparing files to reimport...
[  78% ] reimport | Preparing files to reimport...
[  81% ] reimport | Preparing files to reimport...
[  84% ] reimport | Preparing files to reimport...
[  86% ] reimport | Preparing files to reimport...
[  89% ] reimport | Preparing files to reimport...
[  92% ] reimport | Preparing files to reimport...
[  94% ] reimport | Preparing files to reimport...
[   0% ] reimport | Executing pre-reimport operations...
[   0% ] preload_reimporting_scene | Started Preparing scenes for reload (1 steps)
[   0% ] preload_reimporting_scene | Analyzing scene [empty]
[  50% ] preload_reimporting_scene | Preparation done.
[ DONE ] preload_reimporting_scene

[   0% ] reimport | corner_fixr.webp
[  50% ] reimport | corner_floor.webp
[ 150% ] reimport | floor_corner.webp
[ 300% ] reimport | tree_top.webp
[ 350% ] reimport | trunk.webp
[ 650% ] reimport | panorama.webp
[ 700% ] reimport | tiles_albedo.webp
[ 750% ] reimport | tiles_rough.webp
[ 900% ] reimport | osb_down.webp
[1000% ] reimport | osb_jump.webp
[1100% ] reimport | osb_right.webp
[1150% ] reimport | osb_up.webp
[1200% ] reimport | ceiling.webp
[1250% ] reimport | ceiling_corner.webp
[1300% ] reimport | ceiling_wall.webp
[1350% ] reimport | corner.webp
[1400% ] reimport | corner_fix.webp
[1450% ] reimport | corner_fixr.webp
[1500% ] reimport | corner_floor.webp
[1550% ] reimport | floor.webp
[1600% ] reimport | floor_corner.webp
[1650% ] reimport | floor_edge.webp
[1700% ] reimport | ramp.webp
[1750% ] reimport | player.glb
[   0% ] import | Started Import Scene (104 steps)
[   0% ] import | Importing Scene...
[   1% ] import | Running Custom Script...
[  99% ] import | Saving...
[ DONE ] import

[  34% ] reimport | enemy.glb
[   0% ] import | Started Import Scene (104 steps)
[   0% ] import | Importing Scene...
[   1% ] import | Running Custom Script...
[  99% ] import | Saving...
[ DONE ] import

[  35% ] reimport | Finalizing Asset Import...
[ DONE ] reimport

[   0% ] update_script_paths_documentation | Started Updating scripts documentation (5 steps)
[   0% ] update_script_paths_documentation | coin.gd
[  16% ] update_script_paths_documentation | enemy.gd
[  33% ] update_script_paths_documentation | bullet.gd
[  50% ] update_script_paths_documentation | follow_camera.gd
[  66% ] update_script_paths_documentation | player.gd
[ DONE ] update_script_paths_documentation

[   0% ] reimport | Started (Re)Importing Assets (37 steps)
[   0% ] reimport | Executing post-reimport operations...
[ DONE ] reimport

ERROR: res://game.tscn:22 - Parse Error: Missing 'type' in external resource tag.
   at: _printerr (./scene/resources/resource_format_text.cpp:39)
ERROR: Condition "p_f->get_error() != OK" is true.
   at: get_classes_used (./core/io/resource_format_binary.cpp:943)
ERROR: res://enemy/enemy.tscn:444 - Parse Error: Missing 'type' in external resource tag.
   at: _printerr (./scene/resources/resource_format_text.cpp:39)
ERROR: Condition "p_f->get_error() != OK" is true.
   at: get_classes_used (./core/io/resource_format_binary.cpp:943)
ERROR: res://player/player.tscn:116 - Parse Error: Missing 'type' in external resource tag.
   at: _printerr (./scene/resources/resource_format_text.cpp:39)
ERROR: res://stage/stage.tscn:26 - Parse Error: Missing 'type' in external resource tag.
   at: _printerr (./scene/resources/resource_format_text.cpp:39)
ERROR: 1 RID allocations of type 'P11JoltShape3D' were leaked at exit.
ERROR: 6 RID allocations of type 'P10JoltBody3D' were leaked at exit.
ERROR: Pages in use exist at exit in PagedAllocator: N33RendererSceneRenderImplementation22RenderForwardClustered32GeometryInstanceSurfaceDataCacheE
   at: ~PagedAllocator (./core/templates/paged_allocator.h:169)
ERROR: Pages in use exist at exit in PagedAllocator: N33RendererSceneRenderImplementation22RenderForwardClustered32GeometryInstanceForwardClusteredE
   at: ~PagedAllocator (./core/templates/paged_allocator.h:169)
ERROR: 2 shaders of type SceneForwardClusteredShaderRD were never freed
   at: ~ShaderRD (./servers/rendering/renderer_rd/shader_rd.cpp:1042)
ERROR: 6 RID allocations of type 'N10RendererRD12LightStorage13LightInstanceE' were leaked at exit.
ERROR: 6 RID allocations of type 'N10RendererRD12LightStorage5LightE' were leaked at exit.
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
ERROR: 6 RID allocations of type 'N10RendererRD11MeshStorage9MultiMeshE' were leaked at exit.
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
ERROR: 2 RID allocations of type 'N10RendererRD11MeshStorage4MeshE' were leaked at exit.
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
ERROR: 2 RID allocations of type 'N10RendererRD15MaterialStorage8MaterialE' were leaked at exit.
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (./servers/rendering/storage/utilities.cpp:56)
ERROR: 2 RID allocations of type 'N10RendererRD15MaterialStorage6ShaderE' were leaked at exit.
ERROR: 18 RID allocations of type 'N17RendererSceneCull8InstanceE' were leaked at exit.
WARNING: 6 RIDs of type "StorageBuffer" were leaked.
     at: _free_rids (./servers/rendering/rendering_device.cpp:6957)
WARNING: 2 RIDs of type "UniformBuffer" were leaked.
     at: _free_rids (./servers/rendering/rendering_device.cpp:6957)
WARNING: 2 RIDs of type "IndexArray" were leaked.
     at: _free_rids (./servers/rendering/rendering_device.cpp:6957)
WARNING: 2 RIDs of type "IndexBuffer" were leaked.
     at: _free_rids (./servers/rendering/rendering_device.cpp:6957)
WARNING: 4 RIDs of type "VertexBuffer" were leaked.
     at: _free_rids (./servers/rendering/rendering_device.cpp:6957)
WARNING: ObjectDB instances leaked at exit (run with --verbose for details).
     at: cleanup (./core/object/object.cpp:2490)
ERROR: 11 resources still in use at exit (run with --verbose for details).
   at: clear (./core/io/resource.cpp:784)

This time, all 3 profiles are slightly different from each other:

  • The one generated from the editor GUI.
  • The one generated from the editor CLI with .godot/ already present.
  • The one generated from the editor CLI with .godot/ removed beforehand.

Differences only seem to be on animation classes like AnimatedValuesBackup, AnimationNodeStartState and AnimationNodeEndState.

build_profiles.zip

@YeldhamDev YeldhamDev force-pushed the build_cmdline_gen_profile branch from e175283 to 4b0d105 Compare June 3, 2025 13:59
@YeldhamDev
Copy link
Member Author

Alright, found the problems:

There's still a crash that happens on exit, but that appears to be from a regression unrelated to this PR.

@Calinou Once more, please try again.

@Calinou
Copy link
Member

Calinou commented Jun 3, 2025

It works better now (no more error messages if .godot/ isn't present), but cli_initial.gdbuild is still different from cli.gdbuild and gui.gdbuild (although the latter two are 100% identical again).

build_profiles_2.zip

@YeldhamDev
Copy link
Member Author

Are you sure? On my end the files end up identical, what is the command you're passing?

@YeldhamDev YeldhamDev force-pushed the build_cmdline_gen_profile branch 2 times, most recently from 032fac7 to 365d99a Compare June 3, 2025 22:45
@Calinou
Copy link
Member

Calinou commented Jun 3, 2025

Are you sure? On my end the files end up identical, what is the command you're passing?

bin/godot.linuxbsd.editor.x86_64 --path ~/Documents/Git/godotengine/godot-demo-projects/3d/platformer/ --generate-build-profile cli.gdbuild

@YeldhamDev
Copy link
Member Author

I'm sorry, but they are completely identical on my end. I've no clue what's going on...

@akien-mga
Copy link
Member

bin/godot.linuxbsd.editor.x86_64 --path ~/Documents/Git/godotengine/godot-demo-projects/3d/platformer/ --generate-build-profile cli.gdbuild

I tested this with a dev build, and I get a DEV_ASSERT on exit:

Scan / import / detect logs
$ godot-git --generate-build-profile cli_initial.gdbuild
Godot Engine v4.5.dev.custom_build.365d99a84 (2025-06-03 22:44:51 UTC) - https://godotengine.org
Vulkan 1.4.305 - Forward+ - Using Device #0: AMD - AMD Radeon Graphics (RADV PHOENIX)

[   0% ] first_scan_filesystem | Started Project initialization (5 steps)
[   0% ] first_scan_filesystem | Scanning file structure...
[  16% ] first_scan_filesystem | Loading global class names...
[  33% ] first_scan_filesystem | Verifying GDExtensions...
[  50% ] first_scan_filesystem | Creating autoload scripts...
[  66% ] first_scan_filesystem | Initializing plugins...
[  83% ] first_scan_filesystem | Starting file scan...
[ DONE ] first_scan_filesystem

[   0% ] update_scripts_classes | Started Registering global classes... (5 steps)
[   0% ] update_scripts_classes | 
[  16% ] update_scripts_classes | 
[  33% ] update_scripts_classes | Bullet
[  50% ] update_scripts_classes | 
[  66% ] update_scripts_classes | Player
[ DONE ] update_scripts_classes

[   0% ] _update_scan_actions | Started Scanning actions... (37 steps)
[   0% ] _update_scan_actions | sound_coin.wav
[   2% ] _update_scan_actions | enemy.glb
[   5% ] _update_scan_actions | robot_walk.wav
[   7% ] _update_scan_actions | sound_explode.wav
[  10% ] _update_scan_actions | sound_hit.wav
[  13% ] _update_scan_actions | osb_down.webp
[  15% ] _update_scan_actions | osb_fire.webp
[  18% ] _update_scan_actions | osb_jump.webp
[  21% ] _update_scan_actions | osb_left.webp
[  23% ] _update_scan_actions | osb_right.webp
[  26% ] _update_scan_actions | osb_up.webp
[  28% ] _update_scan_actions | player.glb
[  31% ] _update_scan_actions | sound_jump.wav
[  34% ] _update_scan_actions | sound_shoot.wav
[  36% ] _update_scan_actions | ceiling.webp
[  39% ] _update_scan_actions | ceiling_corner.webp
[  42% ] _update_scan_actions | ceiling_wall.webp
[  44% ] _update_scan_actions | corner.webp
[  47% ] _update_scan_actions | corner_fix.webp
[  50% ] _update_scan_actions | corner_fixr.webp
[  52% ] _update_scan_actions | corner_floor.webp
[  55% ] _update_scan_actions | floor.webp
[  57% ] _update_scan_actions | floor_corner.webp
[  60% ] _update_scan_actions | floor_edge.webp
[  63% ] _update_scan_actions | ramp.webp
[  65% ] _update_scan_actions | tree_top.webp
[  68% ] _update_scan_actions | trunk.webp
[  71% ] _update_scan_actions | trunk_deco.webp
[  73% ] _update_scan_actions | trunk_floor.webp
[  76% ] _update_scan_actions | wall.webp
[  78% ] _update_scan_actions | wall_floor.webp
[  81% ] _update_scan_actions | wall_var.webp
[  84% ] _update_scan_actions | panorama.webp
[  86% ] _update_scan_actions | tiles_albedo.webp
[  89% ] _update_scan_actions | tiles_rough.webp
[  92% ] _update_scan_actions | icon.webp
[  94% ] _update_scan_actions | particle.webp
[ DONE ] _update_scan_actions

[   0% ] reimport | Started (Re)Importing Assets (37 steps)
[   0% ] reimport | Preparing files to reimport...
[   2% ] reimport | Preparing files to reimport...
[   5% ] reimport | Preparing files to reimport...
[   7% ] reimport | Preparing files to reimport...
[  10% ] reimport | Preparing files to reimport...
[  13% ] reimport | Preparing files to reimport...
[  15% ] reimport | Preparing files to reimport...
[  18% ] reimport | Preparing files to reimport...
[  21% ] reimport | Preparing files to reimport...
[  23% ] reimport | Preparing files to reimport...
[  26% ] reimport | Preparing files to reimport...
[  28% ] reimport | Preparing files to reimport...
[  31% ] reimport | Preparing files to reimport...
[  34% ] reimport | Preparing files to reimport...
[  36% ] reimport | Preparing files to reimport...
[  39% ] reimport | Preparing files to reimport...
[  42% ] reimport | Preparing files to reimport...
[  44% ] reimport | Preparing files to reimport...
[  47% ] reimport | Preparing files to reimport...
[  50% ] reimport | Preparing files to reimport...
[  52% ] reimport | Preparing files to reimport...
[  55% ] reimport | Preparing files to reimport...
[  57% ] reimport | Preparing files to reimport...
[  60% ] reimport | Preparing files to reimport...
[  63% ] reimport | Preparing files to reimport...
[  65% ] reimport | Preparing files to reimport...
[  68% ] reimport | Preparing files to reimport...
[  71% ] reimport | Preparing files to reimport...
[  73% ] reimport | Preparing files to reimport...
[  76% ] reimport | Preparing files to reimport...
[  78% ] reimport | Preparing files to reimport...
[  81% ] reimport | Preparing files to reimport...
[  84% ] reimport | Preparing files to reimport...
[  86% ] reimport | Preparing files to reimport...
[  89% ] reimport | Preparing files to reimport...
[  92% ] reimport | Preparing files to reimport...
[  94% ] reimport | Preparing files to reimport...
[   0% ] reimport | Executing pre-reimport operations...
[   0% ] preload_reimporting_scene | Started Preparing scenes for reload (1 steps)
[   0% ] preload_reimporting_scene | Analyzing scene [empty]
[  50% ] preload_reimporting_scene | Preparation done.
[ DONE ] preload_reimporting_scene

[   0% ] reimport | corner_fixr.webp
[  50% ] reimport | corner_floor.webp
[ 100% ] reimport | floor.webp
[ 150% ] reimport | floor_corner.webp
[ 200% ] reimport | floor_edge.webp
[ 250% ] reimport | ramp.webp
[ 300% ] reimport | tree_top.webp
[ 400% ] reimport | trunk_deco.webp
[ 450% ] reimport | trunk_floor.webp
[ 500% ] reimport | wall.webp
[ 600% ] reimport | wall_var.webp
[ 650% ] reimport | panorama.webp
[ 700% ] reimport | tiles_albedo.webp
[ 750% ] reimport | tiles_rough.webp
[ 850% ] reimport | particle.webp
[ 900% ] reimport | osb_down.webp
[ 950% ] reimport | osb_fire.webp
[1000% ] reimport | osb_jump.webp
[1050% ] reimport | osb_left.webp
[1100% ] reimport | osb_right.webp
[1150% ] reimport | osb_up.webp
[1200% ] reimport | ceiling.webp
[1250% ] reimport | ceiling_corner.webp
[1300% ] reimport | ceiling_wall.webp
[1350% ] reimport | corner.webp
[1400% ] reimport | corner_fix.webp
[1450% ] reimport | corner_fixr.webp
[1500% ] reimport | corner_floor.webp
[1550% ] reimport | floor.webp
[1600% ] reimport | floor_corner.webp
[1650% ] reimport | floor_edge.webp
[1700% ] reimport | ramp.webp
[1750% ] reimport | player.glb
[   0% ] import | Started Import Scene (104 steps)
[   0% ] import | Importing Scene...
[   1% ] import | Running Custom Script...
[  99% ] import | Saving...
[ DONE ] import

[  34% ] reimport | enemy.glb
[   0% ] import | Started Import Scene (104 steps)
[   0% ] import | Importing Scene...
[   1% ] import | Running Custom Script...
[  99% ] import | Saving...
[ DONE ] import

[  35% ] reimport | Finalizing Asset Import...
[ DONE ] reimport

[   0% ] update_script_paths_documentation | Started Updating scripts documentation (5 steps)
[   0% ] update_script_paths_documentation | coin.gd
[  16% ] update_script_paths_documentation | enemy.gd
[  33% ] update_script_paths_documentation | bullet.gd
[  50% ] update_script_paths_documentation | follow_camera.gd
[  66% ] update_script_paths_documentation | player.gd
[ DONE ] update_script_paths_documentation

[   0% ] reimport | Started (Re)Importing Assets (37 steps)
[   0% ] reimport | Executing post-reimport operations...
[ DONE ] reimport

[   0% ] detect_classes_from_project | Started Scanning Project for Used Classes (3 steps)
[  25% ] detect_classes_from_project | res://default_bus_layout.tres
[  25% ] detect_classes_from_project | res://export_presets.cfg
[  25% ] detect_classes_from_project | res://game.tscn
[  25% ] detect_classes_from_project | res://icon.webp
[  25% ] detect_classes_from_project | res://particle.webp
[  25% ] detect_classes_from_project | res://particle_material.tres
[  25% ] detect_classes_from_project | res://README.md
[  25% ] detect_classes_from_project | res://coin/coin.gd
[  25% ] detect_classes_from_project | res://coin/coin.tscn
[  25% ] detect_classes_from_project | res://coin/coin_material.tres
[  25% ] detect_classes_from_project | res://coin/sound_coin.wav
[  25% ] detect_classes_from_project | res://enemy/enemy.gd
[  25% ] detect_classes_from_project | res://enemy/enemy.glb
[  25% ] detect_classes_from_project | res://enemy/enemy.tscn
[  25% ] detect_classes_from_project | res://enemy/robot_walk.wav
[  25% ] detect_classes_from_project | res://enemy/sound_explode.wav
[  25% ] detect_classes_from_project | res://enemy/sound_hit.wav
[  25% ] detect_classes_from_project | res://player/follow_camera.gd
[  25% ] detect_classes_from_project | res://player/player.gd
[  25% ] detect_classes_from_project | res://player/player.glb
[  25% ] detect_classes_from_project | res://player/player.tscn
[  25% ] detect_classes_from_project | res://player/player_glow.tres
[  25% ] detect_classes_from_project | res://player/player_gray.tres
[  25% ] detect_classes_from_project | res://player/sound_jump.wav
[  25% ] detect_classes_from_project | res://player/sound_shoot.wav
[  25% ] detect_classes_from_project | res://player/bullet/bullet.gd
[  25% ] detect_classes_from_project | res://player/bullet/bullet.tscn
[  25% ] detect_classes_from_project | res://player/controls/osb_down.webp
[  25% ] detect_classes_from_project | res://player/controls/osb_fire.webp
[  25% ] detect_classes_from_project | res://player/controls/osb_jump.webp
[  25% ] detect_classes_from_project | res://player/controls/osb_left.webp
[  25% ] detect_classes_from_project | res://player/controls/osb_right.webp
[  25% ] detect_classes_from_project | res://player/controls/osb_up.webp
[  25% ] detect_classes_from_project | res://stage/grid_map.scn
[  25% ] detect_classes_from_project | res://stage/panorama.webp
[  25% ] detect_classes_from_project | res://stage/stage.tscn
[  25% ] detect_classes_from_project | res://stage/tiles.tres
[  25% ] detect_classes_from_project | res://stage/tiles_albedo.webp
[  25% ] detect_classes_from_project | res://stage/tiles_rough.webp
[  25% ] detect_classes_from_project | res://stage/tile_material.tres
[  25% ] detect_classes_from_project | res://stage/collision/box.tres
[  25% ] detect_classes_from_project | res://stage/collision/corner.res
[  25% ] detect_classes_from_project | res://stage/collision/corner_fix.res
[  25% ] detect_classes_from_project | res://stage/collision/corner_fixr.res
[  25% ] detect_classes_from_project | res://stage/collision/floor_corner.res
[  25% ] detect_classes_from_project | res://stage/collision/floor_edge.res
[  25% ] detect_classes_from_project | res://stage/collision/ramp.res
[  25% ] detect_classes_from_project | res://stage/collision/trunk.tres
[  25% ] detect_classes_from_project | res://stage/collision/trunk_deco.res
[  25% ] detect_classes_from_project | res://stage/meshes/ceiling.res
[  25% ] detect_classes_from_project | res://stage/meshes/ceiling_corner.res
[  25% ] detect_classes_from_project | res://stage/meshes/ceiling_wall.res
[  25% ] detect_classes_from_project | res://stage/meshes/corner.res
[  25% ] detect_classes_from_project | res://stage/meshes/corner_fix.res
[  25% ] detect_classes_from_project | res://stage/meshes/corner_fixr.res
[  25% ] detect_classes_from_project | res://stage/meshes/corner_floor.res
[  25% ] detect_classes_from_project | res://stage/meshes/floor.res
[  25% ] detect_classes_from_project | res://stage/meshes/floor_corner.res
[  25% ] detect_classes_from_project | res://stage/meshes/floor_edge.res
[  25% ] detect_classes_from_project | res://stage/meshes/ramp.res
[  25% ] detect_classes_from_project | res://stage/meshes/tree_top.res
[  25% ] detect_classes_from_project | res://stage/meshes/trunk.res
[  25% ] detect_classes_from_project | res://stage/meshes/trunk_deco.res
[  25% ] detect_classes_from_project | res://stage/meshes/trunk_floor.res
[  25% ] detect_classes_from_project | res://stage/meshes/wall.res
[  25% ] detect_classes_from_project | res://stage/meshes/wall_floor.res
[  25% ] detect_classes_from_project | res://stage/meshes/wall_var.res
[  25% ] detect_classes_from_project | res://stage/meshes/previews/ceiling.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/ceiling_corner.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/ceiling_wall.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/corner.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/corner_fix.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/corner_fixr.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/corner_floor.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/floor.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/floor_corner.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/floor_edge.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/ramp.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/tree_top.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/trunk.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/trunk_deco.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/trunk_floor.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/wall.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/wall_floor.webp
[  25% ] detect_classes_from_project | res://stage/meshes/previews/wall_var.webp
[  50% ] detect_classes_from_project | Processing Classes Found
[ DONE ] detect_classes_from_project

Errors and crash:

ERROR: 1 RID allocations of type 'P11JoltShape3D' were leaked at exit.
ERROR: 6 RID allocations of type 'P10JoltBody3D' were leaked at exit.
ERROR: Pages in use exist at exit in PagedAllocator: N33RendererSceneRenderImplementation22RenderForwardClustered32GeometryInstanceSurfaceDataCacheE
   at: ~PagedAllocator (./core/templates/paged_allocator.h:169)
ERROR: Pages in use exist at exit in PagedAllocator: N33RendererSceneRenderImplementation22RenderForwardClustered32GeometryInstanceForwardClusteredE
   at: ~PagedAllocator (./core/templates/paged_allocator.h:169)
ERROR: FATAL: DEV_ASSERT failed  "_first == nullptr" is false.
   at: ~List (./core/templates/self_list.h:167)

================================================================
handle_crash: Program crashed with signal 4
Engine version: Godot Engine v4.5.dev.custom_build (365d99a8444539525316f312b25f1081c5d79dd4)
Dumping the backtrace. Please include this when reporting the bug on: https://github.com/godotengine/godot/issues
[1] /lib64/libc.so.6(+0x19c30) [0x7fbc84375c30] (??:0)
[2] SelfList<RendererSceneRenderImplementation::RenderForwardClustered::GeometryInstanceSurfaceDataCache>::List::~List() (/home/akien/Godot/godot/core/templates/self_list.h:167 (discriminator 4))
[3] RendererSceneRenderImplementation::RenderForwardClustered::~RenderForwardClustered() (/home/akien/Godot/godot/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp:5095 (discriminator 5))
[4] void memdelete<RendererSceneRenderRD>(RendererSceneRenderRD*) (/home/akien/Godot/godot/core/os/memory.h:142)
[5] RendererCompositorRD::finalize() (/home/akien/Godot/godot/servers/rendering/renderer_rd/renderer_compositor_rd.cpp:172)
[6] RenderingServerDefault::_finish() (/home/akien/Godot/godot/servers/rendering/rendering_server_default.cpp:246)
[7] RenderingServerDefault::finish() (/home/akien/Godot/godot/servers/rendering/rendering_server_default.cpp:279)
[8] finalize_display() (/home/akien/Godot/godot/main/main.cpp:404)
[9] Main::cleanup(bool) (/home/akien/Godot/godot/main/main.cpp:5031)
[10] godot-git(main+0x16b) [0x6d94711] (/home/akien/Godot/godot/platform/linuxbsd/godot_linuxbsd.cpp:91)
[11] /lib64/libc.so.6(+0x35f5) [0x7fbc8435f5f5] (??:0)
[12] /lib64/libc.so.6(__libc_start_main+0x88) [0x7fbc8435f6a8] (??:0)
[13] godot-git(_start+0x25) [0x6d944e5] (??:?)
-- END OF C++ BACKTRACE --
================================================================
Aborted (core dumped)

@YeldhamDev
Copy link
Member Author

@godotengine/rendering My PR appears to expose a preexisting bug on rendering cleanup (see above). Could you guys lend a hand?

@clayjohn
Copy link
Member

clayjohn commented Jun 5, 2025

@godotengine/rendering My PR appears to expose a preexisting bug on rendering cleanup (see above). Could you guys lend a hand?

I doubt its a pre-existing bug. The crash is on an assert that happens at de-initialization time to say that not all memory allocations were freed. I suspect that the change in logic with this PR results in not all rendering resources getting freed before closing

@YeldhamDev
Copy link
Member Author

@clayjohn The problem is that I have no clue what could be causing it. It only happens if the assets haven't being imported at least once.

@YeldhamDev YeldhamDev force-pushed the build_cmdline_gen_profile branch from 365d99a to edc5c42 Compare July 7, 2025 18:27
@YeldhamDev YeldhamDev requested a review from a team as a code owner July 7, 2025 18:27
@YeldhamDev
Copy link
Member Author

YeldhamDev commented Jul 7, 2025

I've managed to fix the crash (on headless mode, at least), it was caused by a missing check. However, those errors still remain (they only appear when running it without the assets being imported first):

ERROR: 1 RID allocations of type 'P11JoltShape3D' were leaked at exit.
ERROR: 6 RID allocations of type 'P10JoltBody3D' were leaked at exit.
ERROR: Pages in use exist at exit in PagedAllocator: N20RasterizerSceneDummy21GeometryInstanceDummyE
   at: ~PagedAllocator (./core/templates/paged_allocator.h:169)
ERROR: 6 RID allocations of type 'N13RendererDummy11MeshStorage14DummyMultiMeshE' were leaked at exit.
ERROR: 2 RID allocations of type 'N13RendererDummy9DummyMeshE' were leaked at exit.
WARNING: Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.
     at: ~Dependency (servers/rendering/storage/utilities.cpp:56)
ERROR: 2 RID allocations of type 'N13RendererDummy15MaterialStorage13DummyMaterialE' were leaked at exit.
ERROR: 2 RID allocations of type 'N13RendererDummy15MaterialStorage11DummyShaderE' were leaked at exit.
ERROR: 18 RID allocations of type 'N17RendererSceneCull8InstanceE' were leaked at exit.
WARNING: ObjectDB instances leaked at exit (run with --verbose for details).
     at: cleanup (core/object/object.cpp:2490)
ERROR: 11 resources still in use at exit (run with --verbose for details).
   at: clear (core/io/resource.cpp:789)

When running with --verbose, the leaks all share the same error:

ERROR: Cannot get path of node as it is not in a scene tree.

And seem to come from the same file in the 3D platformer demo:

res://player/bullet/bullet.tscn

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants