Skip to content

Commit 3e7ed2e

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 ec62b8a commit 3e7ed2e

File tree

460 files changed

+209287
-5
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

+209287
-5
lines changed

SConstruct

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ opts.Add(BoolVariable("builtin_enet", "Use the built-in ENet library", True))
232232
opts.Add(BoolVariable("builtin_freetype", "Use the built-in FreeType library", True))
233233
opts.Add(BoolVariable("builtin_msdfgen", "Use the built-in MSDFgen library", True))
234234
opts.Add(BoolVariable("builtin_glslang", "Use the built-in glslang library", True))
235+
opts.Add(BoolVariable("builtin_spirv_tools", "Use the built-in SPIR-V Tools library", True))
235236
opts.Add(BoolVariable("builtin_graphite", "Use the built-in Graphite library", True))
236237
opts.Add(BoolVariable("builtin_harfbuzz", "Use the built-in HarfBuzz library", True))
237238
opts.Add(BoolVariable("builtin_icu4c", "Use the built-in ICU library", True))

doc/classes/ProjectSettings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2616,6 +2616,8 @@
26162616
</member>
26172617
<member name="rendering/shader_compiler/shader_cache/use_zstd_compression" type="bool" setter="" getter="" default="true">
26182618
</member>
2619+
<member name="rendering/shader_compiler/shader_compilation/optimize" type="bool" setter="" getter="" default="false">
2620+
</member>
26192621
<member name="rendering/shading/overrides/force_lambert_over_burley" type="bool" setter="" getter="" default="false">
26202622
If [code]true[/code], uses faster but lower-quality Lambert material lighting model instead of Burley.
26212623
</member>

modules/glslang/SCsub

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

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

12218
if env["builtin_glslang"]:
13219
thirdparty_dir = "#thirdparty/glslang/"
@@ -70,14 +276,16 @@ if env["builtin_glslang"]:
70276
else:
71277
env_glslang.Prepend(CPPPATH=[thirdparty_dir, "#thirdparty"])
72278

73-
env_glslang.Append(CPPDEFINES=["ENABLE_OPT=0"])
279+
if enable_shader_optimization:
280+
env_glslang.Append(CPPDEFINES=["ENABLE_OPT=1"])
281+
else:
282+
env_glslang.Append(CPPDEFINES=["ENABLE_OPT=0"])
74283

75284
env_thirdparty = env_glslang.Clone()
76285
env_thirdparty.disable_warnings()
77286
env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
78287
env.modules_sources += thirdparty_obj
79288

80-
81289
# Godot source files
82290

83291
module_obj = []

modules/glslang/register_types.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "register_types.h"
3232

3333
#include "core/config/engine.h"
34+
#include "core/config/project_settings.h"
3435
#include "servers/rendering/rendering_device.h"
3536

3637
#include <glslang/Include/Types.h>
@@ -161,6 +162,12 @@ static Vector<uint8_t> _compile_shader_glsl(RenderingDevice::ShaderStage p_stage
161162
spv::SpvBuildLogger logger;
162163
glslang::SpvOptions spvOptions;
163164

165+
bool optimize = GLOBAL_GET("rendering/shader_compiler/shader_compilation/optimize");
166+
if (optimize) {
167+
spvOptions.disableOptimizer = false;
168+
spvOptions.optimizeSize = true;
169+
}
170+
164171
if (Engine::get_singleton()->is_generate_spirv_debug_info_enabled()) {
165172
spvOptions.generateDebugInfo = true;
166173
spvOptions.emitNonSemanticShaderDebugInfo = true;
@@ -181,7 +188,8 @@ static Vector<uint8_t> _compile_shader_glsl(RenderingDevice::ShaderStage p_stage
181188
static String _get_cache_key_function_glsl(const RenderingDevice *p_render_device) {
182189
const RD::Capabilities *capabilities = p_render_device->get_device_capabilities();
183190
String version;
184-
version = "SpirVGen=" + itos(glslang::GetSpirvGeneratorVersion()) + ", major=" + itos(capabilities->version_major) + ", minor=" + itos(capabilities->version_minor) + " , subgroup_size=" + itos(p_render_device->limit_get(RD::LIMIT_SUBGROUP_SIZE)) + " , subgroup_ops=" + itos(p_render_device->limit_get(RD::LIMIT_SUBGROUP_OPERATIONS)) + " , subgroup_in_shaders=" + itos(p_render_device->limit_get(RD::LIMIT_SUBGROUP_IN_SHADERS)) + " , debug=" + itos(Engine::get_singleton()->is_generate_spirv_debug_info_enabled());
191+
bool optimize = GLOBAL_GET("rendering/shader_compiler/shader_compilation/optimize");
192+
version = "SpirVGen=" + itos(glslang::GetSpirvGeneratorVersion()) + ", major=" + itos(capabilities->version_major) + ", minor=" + itos(capabilities->version_minor) + " , subgroup_size=" + itos(p_render_device->limit_get(RD::LIMIT_SUBGROUP_SIZE)) + " , subgroup_ops=" + itos(p_render_device->limit_get(RD::LIMIT_SUBGROUP_OPERATIONS)) + " , subgroup_in_shaders=" + itos(p_render_device->limit_get(RD::LIMIT_SUBGROUP_IN_SHADERS)) + " , debug=" + itos(Engine::get_singleton()->is_generate_spirv_debug_info_enabled()) + " , optimize=" + itos(optimize);
185193
return version;
186194
}
187195

servers/rendering/renderer_rd/environment/gi.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2150,7 +2150,6 @@ void GI::SDFGI::render_region(Ref<RenderSceneBuffersRD> p_render_buffers, int p_
21502150
uint32_t cascade_half_size = cascade_size >> 1;
21512151
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDFGIShader::PRE_PROCESS_JUMP_FLOOD_INITIALIZE_HALF]);
21522152
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, sdf_initialize_half_uniform_set, 0);
2153-
RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::PreprocessPushConstant));
21542153
RD::get_singleton()->compute_list_dispatch_threads(compute_list, cascade_half_size, cascade_half_size, cascade_half_size);
21552154
RD::get_singleton()->compute_list_add_barrier(compute_list);
21562155

@@ -2200,7 +2199,6 @@ void GI::SDFGI::render_region(Ref<RenderSceneBuffersRD> p_render_buffers, int p_
22002199

22012200
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDFGIShader::PRE_PROCESS_JUMP_FLOOD_UPSCALE]);
22022201
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, sdf_upscale_uniform_set, 0);
2203-
RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::PreprocessPushConstant));
22042202
RD::get_singleton()->compute_list_dispatch_threads(compute_list, cascade_size, cascade_size, cascade_size);
22052203
RD::get_singleton()->compute_list_add_barrier(compute_list);
22062204

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
@@ -2908,6 +2908,7 @@ void RenderingServer::init() {
29082908
// Number of commands that can be drawn per frame.
29092909
GLOBAL_DEF_RST(PropertyInfo(Variant::INT, "rendering/gl_compatibility/item_buffer_size", PROPERTY_HINT_RANGE, "128,1048576,1"), 16384);
29102910

2911+
GLOBAL_DEF_RST("rendering/shader_compiler/shader_compilation/optimize", false);
29112912
GLOBAL_DEF("rendering/shader_compiler/shader_cache/enabled", true);
29122913
GLOBAL_DEF("rendering/shader_compiler/shader_cache/compress", true);
29132914
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)