Skip to content

Commit e2075b5

Browse files
committed
Add SPIRV-Tools so glslang can optimize shaders and a project setting.
Port SPIRV-Tools to SCons. Enable optimizations on glslang when it's built in. Add project setting to enable optimizations by the shader compiler (disabled by default).
1 parent 9283328 commit e2075b5

File tree

460 files changed

+209286
-4
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

460 files changed

+209286
-4
lines changed

SConstruct

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ opts.Add(BoolVariable("builtin_enet", "Use the built-in ENet library", True))
274274
opts.Add(BoolVariable("builtin_freetype", "Use the built-in FreeType library", True))
275275
opts.Add(BoolVariable("builtin_msdfgen", "Use the built-in MSDFgen library", True))
276276
opts.Add(BoolVariable("builtin_glslang", "Use the built-in glslang library", True))
277+
opts.Add(BoolVariable("builtin_spirv_tools", "Use the built-in SPIR-V Tools library", True))
277278
opts.Add(BoolVariable("builtin_graphite", "Use the built-in Graphite library", True))
278279
opts.Add(BoolVariable("builtin_harfbuzz", "Use the built-in HarfBuzz library", True))
279280
opts.Add(BoolVariable("builtin_sdl", "Use the built-in SDL library", True))

doc/classes/ProjectSettings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3314,6 +3314,8 @@
33143314
</member>
33153315
<member name="rendering/shader_compiler/shader_cache/use_zstd_compression" type="bool" setter="" getter="" default="true">
33163316
</member>
3317+
<member name="rendering/shader_compiler/shader_compilation/optimize" type="bool" setter="" getter="" default="false">
3318+
</member>
33173319
<member name="rendering/shading/overrides/force_lambert_over_burley" type="bool" setter="" getter="" default="false">
33183320
If [code]true[/code], uses faster but lower-quality Lambert material lighting model instead of Burley.
33193321
</member>

modules/glslang/SCsub

Lines changed: 210 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,212 @@ env_glslang = env_modules.Clone()
99
# Thirdparty source files
1010

1111
thirdparty_obj = []
12+
enable_shader_optimization = False
13+
14+
if env["builtin_spirv_tools"]:
15+
enable_shader_optimization = True
16+
17+
thirdparty_dir = "#thirdparty/spirv-tools/"
18+
thirdparty_sources = [
19+
"source/assembly_grammar.cpp",
20+
"source/binary.cpp",
21+
"source/diagnostic.cpp",
22+
"source/disassemble.cpp",
23+
"source/enum_string_mapping.cpp",
24+
"source/extensions.cpp",
25+
"source/ext_inst.cpp",
26+
"source/libspirv.cpp",
27+
"source/name_mapper.cpp",
28+
"source/opcode.cpp",
29+
"source/operand.cpp",
30+
"source/parsed_operand.cpp",
31+
"source/pch_source.cpp",
32+
"source/print.cpp",
33+
"source/software_version.cpp",
34+
"source/spirv_endian.cpp",
35+
"source/spirv_fuzzer_options.cpp",
36+
"source/spirv_optimizer_options.cpp",
37+
"source/spirv_reducer_options.cpp",
38+
"source/spirv_target_env.cpp",
39+
"source/spirv_validator_options.cpp",
40+
"source/table.cpp",
41+
"source/text.cpp",
42+
"source/text_handler.cpp",
43+
"source/opt/aggressive_dead_code_elim_pass.cpp",
44+
"source/opt/amd_ext_to_khr.cpp",
45+
"source/opt/analyze_live_input_pass.cpp",
46+
"source/opt/basic_block.cpp",
47+
"source/opt/block_merge_pass.cpp",
48+
"source/opt/block_merge_util.cpp",
49+
"source/opt/build_module.cpp",
50+
"source/opt/ccp_pass.cpp",
51+
"source/opt/cfg.cpp",
52+
"source/opt/cfg_cleanup_pass.cpp",
53+
"source/opt/code_sink.cpp",
54+
"source/opt/combine_access_chains.cpp",
55+
"source/opt/compact_ids_pass.cpp",
56+
"source/opt/composite.cpp",
57+
"source/opt/constants.cpp",
58+
"source/opt/const_folding_rules.cpp",
59+
"source/opt/control_dependence.cpp",
60+
"source/opt/convert_to_half_pass.cpp",
61+
"source/opt/convert_to_sampled_image_pass.cpp",
62+
"source/opt/copy_prop_arrays.cpp",
63+
"source/opt/dataflow.cpp",
64+
"source/opt/dead_branch_elim_pass.cpp",
65+
"source/opt/dead_insert_elim_pass.cpp",
66+
"source/opt/dead_variable_elimination.cpp",
67+
"source/opt/debug_info_manager.cpp",
68+
"source/opt/decoration_manager.cpp",
69+
"source/opt/def_use_manager.cpp",
70+
"source/opt/desc_sroa.cpp",
71+
"source/opt/desc_sroa_util.cpp",
72+
"source/opt/dominator_analysis.cpp",
73+
"source/opt/dominator_tree.cpp",
74+
"source/opt/eliminate_dead_constant_pass.cpp",
75+
"source/opt/eliminate_dead_functions_pass.cpp",
76+
"source/opt/eliminate_dead_functions_util.cpp",
77+
"source/opt/eliminate_dead_io_components_pass.cpp",
78+
"source/opt/eliminate_dead_members_pass.cpp",
79+
"source/opt/eliminate_dead_output_stores_pass.cpp",
80+
"source/opt/feature_manager.cpp",
81+
"source/opt/fix_func_call_arguments.cpp",
82+
"source/opt/fix_storage_class.cpp",
83+
"source/opt/flatten_decoration_pass.cpp",
84+
"source/opt/fold.cpp",
85+
"source/opt/folding_rules.cpp",
86+
"source/opt/fold_spec_constant_op_and_composite_pass.cpp",
87+
"source/opt/freeze_spec_constant_value_pass.cpp",
88+
"source/opt/function.cpp",
89+
"source/opt/graphics_robust_access_pass.cpp",
90+
"source/opt/if_conversion.cpp",
91+
"source/opt/inline_exhaustive_pass.cpp",
92+
"source/opt/inline_opaque_pass.cpp",
93+
"source/opt/inline_pass.cpp",
94+
"source/opt/instruction.cpp",
95+
"source/opt/instruction_list.cpp",
96+
"source/opt/instrument_pass.cpp",
97+
"source/opt/inst_bindless_check_pass.cpp",
98+
"source/opt/inst_buff_addr_check_pass.cpp",
99+
"source/opt/inst_debug_printf_pass.cpp",
100+
"source/opt/interface_var_sroa.cpp",
101+
"source/opt/interp_fixup_pass.cpp",
102+
"source/opt/ir_context.cpp",
103+
"source/opt/ir_loader.cpp",
104+
"source/opt/licm_pass.cpp",
105+
"source/opt/liveness.cpp",
106+
"source/opt/local_access_chain_convert_pass.cpp",
107+
"source/opt/local_redundancy_elimination.cpp",
108+
"source/opt/local_single_block_elim_pass.cpp",
109+
"source/opt/local_single_store_elim_pass.cpp",
110+
"source/opt/loop_dependence.cpp",
111+
"source/opt/loop_dependence_helpers.cpp",
112+
"source/opt/loop_descriptor.cpp",
113+
"source/opt/loop_fission.cpp",
114+
"source/opt/loop_fusion.cpp",
115+
"source/opt/loop_fusion_pass.cpp",
116+
"source/opt/loop_peeling.cpp",
117+
"source/opt/loop_unroller.cpp",
118+
"source/opt/loop_unswitch_pass.cpp",
119+
"source/opt/loop_utils.cpp",
120+
"source/opt/mem_pass.cpp",
121+
"source/opt/merge_return_pass.cpp",
122+
"source/opt/module.cpp",
123+
"source/opt/optimizer.cpp",
124+
"source/opt/pass.cpp",
125+
"source/opt/pass_manager.cpp",
126+
"source/opt/pch_source_opt.cpp",
127+
"source/opt/private_to_local_pass.cpp",
128+
"source/opt/propagator.cpp",
129+
"source/opt/reduce_load_size.cpp",
130+
"source/opt/redundancy_elimination.cpp",
131+
"source/opt/register_pressure.cpp",
132+
"source/opt/relax_float_ops_pass.cpp",
133+
"source/opt/remove_dontinline_pass.cpp",
134+
"source/opt/remove_duplicates_pass.cpp",
135+
"source/opt/remove_unused_interface_variables_pass.cpp",
136+
"source/opt/replace_desc_array_access_using_var_index.cpp",
137+
"source/opt/replace_invalid_opc.cpp",
138+
"source/opt/scalar_analysis.cpp",
139+
"source/opt/scalar_analysis_simplification.cpp",
140+
"source/opt/scalar_replacement_pass.cpp",
141+
"source/opt/set_spec_constant_default_value_pass.cpp",
142+
"source/opt/simplification_pass.cpp",
143+
"source/opt/spread_volatile_semantics.cpp",
144+
"source/opt/ssa_rewrite_pass.cpp",
145+
"source/opt/strength_reduction_pass.cpp",
146+
"source/opt/strip_debug_info_pass.cpp",
147+
"source/opt/strip_nonsemantic_info_pass.cpp",
148+
"source/opt/struct_cfg_analysis.cpp",
149+
"source/opt/types.cpp",
150+
"source/opt/type_manager.cpp",
151+
"source/opt/unify_const_pass.cpp",
152+
"source/opt/upgrade_memory_model.cpp",
153+
"source/opt/value_number_table.cpp",
154+
"source/opt/vector_dce.cpp",
155+
"source/opt/workaround1209.cpp",
156+
"source/opt/wrap_opkill.cpp",
157+
"source/util/bit_vector.cpp",
158+
"source/util/parse_number.cpp",
159+
"source/util/string_utils.cpp",
160+
"source/val/basic_block.cpp",
161+
"source/val/construct.cpp",
162+
"source/val/function.cpp",
163+
"source/val/instruction.cpp",
164+
"source/val/validate.cpp",
165+
"source/val/validate_adjacency.cpp",
166+
"source/val/validate_annotation.cpp",
167+
"source/val/validate_arithmetics.cpp",
168+
"source/val/validate_atomics.cpp",
169+
"source/val/validate_barriers.cpp",
170+
"source/val/validate_bitwise.cpp",
171+
"source/val/validate_builtins.cpp",
172+
"source/val/validate_capability.cpp",
173+
"source/val/validate_cfg.cpp",
174+
"source/val/validate_composites.cpp",
175+
"source/val/validate_constants.cpp",
176+
"source/val/validate_conversion.cpp",
177+
"source/val/validate_debug.cpp",
178+
"source/val/validate_decorations.cpp",
179+
"source/val/validate_derivatives.cpp",
180+
"source/val/validate_execution_limitations.cpp",
181+
"source/val/validate_extensions.cpp",
182+
"source/val/validate_function.cpp",
183+
"source/val/validate_id.cpp",
184+
"source/val/validate_image.cpp",
185+
"source/val/validate_instruction.cpp",
186+
"source/val/validate_interfaces.cpp",
187+
"source/val/validate_layout.cpp",
188+
"source/val/validate_literals.cpp",
189+
"source/val/validate_logicals.cpp",
190+
"source/val/validate_memory.cpp",
191+
"source/val/validate_memory_semantics.cpp",
192+
"source/val/validate_mesh_shading.cpp",
193+
"source/val/validate_misc.cpp",
194+
"source/val/validate_mode_setting.cpp",
195+
"source/val/validate_non_uniform.cpp",
196+
"source/val/validate_primitives.cpp",
197+
"source/val/validate_ray_query.cpp",
198+
"source/val/validate_ray_tracing.cpp",
199+
"source/val/validate_ray_tracing_reorder.cpp",
200+
"source/val/validate_scopes.cpp",
201+
"source/val/validate_small_type_uses.cpp",
202+
"source/val/validate_type.cpp",
203+
"source/val/validation_state.cpp",
204+
]
205+
206+
thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources]
207+
208+
env_glslang.Prepend(CPPPATH=[thirdparty_dir])
209+
env_glslang.Prepend(CPPPATH=[thirdparty_dir + "include"])
210+
211+
env_thirdparty = env_glslang.Clone()
212+
env_thirdparty.Prepend(CPPPATH=[thirdparty_dir + "include/generated"])
213+
env_thirdparty.Prepend(CPPPATH=["#thirdparty/spirv-headers/include"])
214+
env_thirdparty.Prepend(CPPPATH=["#thirdparty/spirv-headers/include/spirv/unified1"])
215+
env_thirdparty.disable_warnings()
216+
env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
217+
env.modules_sources += thirdparty_obj
12218

13219
if env["builtin_glslang"]:
14220
thirdparty_dir = "#thirdparty/glslang/"
@@ -66,14 +272,16 @@ if env["builtin_glslang"]:
66272
# and in installed public headers.
67273
env_glslang.Prepend(CPPEXTPATH=[thirdparty_dir, "#thirdparty"])
68274

69-
env_glslang.Append(CPPDEFINES=[("ENABLE_OPT", 0)])
275+
if enable_shader_optimization:
276+
env_glslang.Append(CPPDEFINES=[("ENABLE_OPT", 0)])
277+
else:
278+
env_glslang.Append(CPPDEFINES=[("ENABLE_OPT", 1)])
70279

71280
env_thirdparty = env_glslang.Clone()
72281
env_thirdparty.disable_warnings()
73282
env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
74283
env.modules_sources += thirdparty_obj
75284

76-
77285
# Godot source files
78286

79287
module_obj = []

modules/glslang/register_types.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232

3333
#include "core/config/engine.h"
3434
#include "shader_compile.h"
35+
#include "core/config/project_settings.h"
36+
#include "servers/rendering/rendering_device.h"
3537

3638
#include <glslang/Public/ResourceLimits.h>
3739
#include <glslang/Public/ShaderLang.h>
@@ -103,6 +105,12 @@ Vector<uint8_t> compile_glslang_shader(RenderingDeviceCommons::ShaderStage p_sta
103105
spv::SpvBuildLogger logger;
104106
glslang::SpvOptions spvOptions;
105107

108+
bool optimize = GLOBAL_GET("rendering/shader_compiler/shader_compilation/optimize");
109+
if (optimize) {
110+
spvOptions.disableOptimizer = false;
111+
spvOptions.optimizeSize = true;
112+
}
113+
106114
if (Engine::get_singleton()->is_generate_spirv_debug_info_enabled()) {
107115
spvOptions.generateDebugInfo = true;
108116
spvOptions.emitNonSemanticShaderDebugInfo = true;

servers/rendering/renderer_rd/environment/gi.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2173,7 +2173,6 @@ void GI::SDFGI::render_region(Ref<RenderSceneBuffersRD> p_render_buffers, int p_
21732173
uint32_t cascade_half_size = cascade_size >> 1;
21742174
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDFGIShader::PRE_PROCESS_JUMP_FLOOD_INITIALIZE_HALF]);
21752175
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, sdf_initialize_half_uniform_set, 0);
2176-
RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::PreprocessPushConstant));
21772176
RD::get_singleton()->compute_list_dispatch_threads(compute_list, cascade_half_size, cascade_half_size, cascade_half_size);
21782177
RD::get_singleton()->compute_list_add_barrier(compute_list);
21792178

@@ -2223,7 +2222,6 @@ void GI::SDFGI::render_region(Ref<RenderSceneBuffersRD> p_render_buffers, int p_
22232222

22242223
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDFGIShader::PRE_PROCESS_JUMP_FLOOD_UPSCALE]);
22252224
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, sdf_upscale_uniform_set, 0);
2226-
RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::PreprocessPushConstant));
22272225
RD::get_singleton()->compute_list_dispatch_threads(compute_list, cascade_size, cascade_size, cascade_size);
22282226
RD::get_singleton()->compute_list_add_barrier(compute_list);
22292227

servers/rendering/renderer_rd/shaders/environment/sdfgi_preprocess.glsl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@ layout(r16ui, set = 0, binding = 2) uniform restrict readonly uimage3D src_occlu
155155

156156
#endif
157157

158+
#if !defined(MODE_INITIALIZE_JUMP_FLOOD_HALF) && !defined(MODE_UPSCALE_JUMP_FLOOD)
159+
158160
layout(push_constant, std430) uniform Params {
159161
ivec3 scroll;
160162

@@ -170,6 +172,8 @@ layout(push_constant, std430) uniform Params {
170172
}
171173
params;
172174

175+
#endif
176+
173177
void main() {
174178
#ifdef MODE_SCROLL
175179

servers/rendering_server.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3637,6 +3637,7 @@ void RenderingServer::init() {
36373637
// Number of commands that can be drawn per frame.
36383638
GLOBAL_DEF_RST(PropertyInfo(Variant::INT, "rendering/gl_compatibility/item_buffer_size", PROPERTY_HINT_RANGE, "128,1048576,1"), 16384);
36393639

3640+
GLOBAL_DEF_RST("rendering/shader_compiler/shader_compilation/optimize", false);
36403641
GLOBAL_DEF("rendering/shader_compiler/shader_cache/enabled", true);
36413642
GLOBAL_DEF("rendering/shader_compiler/shader_cache/compress", true);
36423643
GLOBAL_DEF("rendering/shader_compiler/shader_cache/use_zstd_compression", true);

thirdparty/glslang/SPIRV/SpvTools.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,10 @@ void SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector
219219

220220
spvtools::OptimizerOptions spvOptOptions;
221221
optimizer.SetTargetEnv(MapToSpirvToolsEnv(intermediate.getSpv(), logger));
222+
// -- GODOT start --
223+
spvOptOptions.set_preserve_bindings(true);
224+
spvOptOptions.set_preserve_spec_constants(true);
225+
// -- GODOT end --
222226
spvOptOptions.set_run_validator(false); // The validator may run as a separate step later on
223227
optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions);
224228
}

0 commit comments

Comments
 (0)