Skip to content

Commit eb0caa6

Browse files
committed
Merge pull request godotengine#108510 from bruvzg/bake_no_atomic
[macOS] Selectively bake "no image atomics" shader variants.
2 parents 1713a8d + 87e91f7 commit eb0caa6

File tree

5 files changed

+136
-34
lines changed

5 files changed

+136
-34
lines changed

servers/rendering/renderer_rd/cluster_builder_rd.cpp

Lines changed: 61 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -57,62 +57,105 @@ ClusterBuilderSharedDataRD::ClusterBuilderSharedDataRD() {
5757
Vector<String> variants;
5858
variants.push_back("");
5959
variants.push_back("\n#define USE_ATTACHMENT\n");
60-
variants.push_back("\n#define MOLTENVK_USED\n");
61-
variants.push_back("\n#define USE_ATTACHMENT\n#define MOLTENVK_USED\n");
60+
variants.push_back("\n#define MOLTENVK_USED\n#define NO_IMAGE_ATOMICS\n");
61+
variants.push_back("\n#define USE_ATTACHMENT\n#define MOLTENVK_USED\n#define NO_IMAGE_ATOMICS\n");
62+
variants.push_back("\n#define NO_IMAGE_ATOMICS\n");
63+
variants.push_back("\n#define MOLTENVK_USED\n#define NO_IMAGE_ATOMICS\n");
6264

6365
ClusterRender::ShaderVariant shader_variant;
64-
if (RD::get_singleton()->has_feature(RD::SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS)) {
65-
fb_format = RD::get_singleton()->framebuffer_format_create_empty();
66+
RenderingDevice *rd = RD::get_singleton();
67+
if (rd->has_feature(RD::SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS)) {
68+
fb_format = rd->framebuffer_format_create_empty();
6669
blend_state = RD::PipelineColorBlendState::create_disabled();
6770
#if (defined(MACOS_ENABLED) || defined(APPLE_EMBEDDED_ENABLED))
68-
if (RD::get_singleton()->get_device_capabilities().device_family == RDD::DEVICE_VULKAN) {
71+
if (rd->get_device_capabilities().device_family == RDD::DEVICE_VULKAN) {
6972
shader_variant = ClusterRender::SHADER_NORMAL_MOLTENVK;
70-
} else {
73+
} else if (rd->has_feature(RD::SUPPORTS_IMAGE_ATOMIC_32_BIT)) {
7174
shader_variant = ClusterRender::SHADER_NORMAL;
75+
} else {
76+
shader_variant = ClusterRender::SHADER_NORMAL_NO_ATOMICS;
7277
}
7378
#else
74-
shader_variant = ClusterRender::SHADER_NORMAL;
79+
if (rd->has_feature(RD::SUPPORTS_IMAGE_ATOMIC_32_BIT)) {
80+
shader_variant = ClusterRender::SHADER_NORMAL;
81+
} else {
82+
shader_variant = ClusterRender::SHADER_NORMAL_NO_ATOMICS;
83+
}
7584
#endif
7685
} else {
7786
Vector<RD::AttachmentFormat> afs;
7887
afs.push_back(RD::AttachmentFormat());
7988
afs.write[0].usage_flags = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT;
80-
fb_format = RD::get_singleton()->framebuffer_format_create(afs);
89+
fb_format = rd->framebuffer_format_create(afs);
8190
blend_state = RD::PipelineColorBlendState::create_blend();
8291
#if (defined(MACOS_ENABLED) || defined(APPLE_EMBEDDED_ENABLED))
83-
if (RD::get_singleton()->get_device_capabilities().device_family == RDD::DEVICE_VULKAN) {
92+
if (rd->get_device_capabilities().device_family == RDD::DEVICE_VULKAN) {
8493
shader_variant = ClusterRender::SHADER_USE_ATTACHMENT_MOLTENVK;
85-
} else {
94+
} else if (rd->has_feature(RD::SUPPORTS_IMAGE_ATOMIC_32_BIT)) {
8695
shader_variant = ClusterRender::SHADER_USE_ATTACHMENT;
96+
} else {
97+
shader_variant = ClusterRender::SHADER_USE_ATTACHMENT_NO_ATOMICS;
8798
}
8899
#else
89-
shader_variant = ClusterRender::SHADER_USE_ATTACHMENT;
100+
if (rd->has_feature(RD::SUPPORTS_IMAGE_ATOMIC_32_BIT)) {
101+
shader_variant = ClusterRender::SHADER_USE_ATTACHMENT;
102+
} else {
103+
shader_variant = ClusterRender::SHADER_USE_ATTACHMENT_NO_ATOMICS;
104+
}
90105
#endif
91106
}
92107

93108
cluster_render.cluster_render_shader.initialize(variants);
94109
#if (defined(MACOS_ENABLED) || defined(APPLE_EMBEDDED_ENABLED))
95-
if (RD::get_singleton()->get_device_capabilities().device_family == RDD::DEVICE_VULKAN) {
110+
if (rd->get_device_capabilities().device_family == RDD::DEVICE_VULKAN) {
96111
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_NORMAL, false);
97112
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_USE_ATTACHMENT, false);
113+
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_NORMAL_NO_ATOMICS, false);
114+
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_USE_ATTACHMENT_NO_ATOMICS, false);
115+
} else if (rd->has_feature(RD::SUPPORTS_IMAGE_ATOMIC_32_BIT)) {
116+
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_NORMAL_MOLTENVK, false);
117+
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_USE_ATTACHMENT_MOLTENVK, false);
118+
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_NORMAL_NO_ATOMICS, false);
119+
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_USE_ATTACHMENT_NO_ATOMICS, false);
98120
} else {
121+
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_NORMAL, false);
122+
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_USE_ATTACHMENT, false);
99123
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_NORMAL_MOLTENVK, false);
100124
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_USE_ATTACHMENT_MOLTENVK, false);
101125
}
102126
#else
103-
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_NORMAL_MOLTENVK, false);
104-
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_USE_ATTACHMENT_MOLTENVK, false);
127+
if (rd->has_feature(RD::SUPPORTS_IMAGE_ATOMIC_32_BIT)) {
128+
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_NORMAL_MOLTENVK, false);
129+
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_USE_ATTACHMENT_MOLTENVK, false);
130+
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_NORMAL_NO_ATOMICS, false);
131+
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_USE_ATTACHMENT_NO_ATOMICS, false);
132+
} else {
133+
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_NORMAL, false);
134+
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_USE_ATTACHMENT, false);
135+
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_NORMAL_MOLTENVK, false);
136+
cluster_render.cluster_render_shader.set_variant_enabled(ClusterRender::SHADER_USE_ATTACHMENT_MOLTENVK, false);
137+
}
105138
#endif
139+
// Do not bake default (with "gl_HelperInvocation" and image atomics) variants for macOS/iOS Vulkan, but bake it for the rest of configs (including Metal).
106140
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_NORMAL, "macos_forward_clustered_vulkan", false, true);
107-
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_USE_ATTACHMENT, "macos_forward_clustered_vulkan", false, true);
108-
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_NORMAL_MOLTENVK, "macos_forward_clustered_vulkan", true, false);
109-
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_USE_ATTACHMENT_MOLTENVK, "macos_forward_clustered_vulkan", true, false);
110-
111141
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_NORMAL, "ios_forward_clustered_vulkan", false, true);
142+
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_USE_ATTACHMENT, "macos_forward_clustered_vulkan", false, true);
112143
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_USE_ATTACHMENT, "ios_forward_clustered_vulkan", false, true);
144+
145+
// Bake no "gl_HelperInvocation" and no "image atomics" variants for macOS/iOS Vulkan only.
146+
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_NORMAL_MOLTENVK, "macos_forward_clustered_vulkan", true, false);
113147
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_NORMAL_MOLTENVK, "ios_forward_clustered_vulkan", true, false);
148+
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_USE_ATTACHMENT_MOLTENVK, "macos_forward_clustered_vulkan", true, false);
114149
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_USE_ATTACHMENT_MOLTENVK, "ios_forward_clustered_vulkan", true, false);
115150

151+
// Bake no "image atomics" variants for macOS/iOS/visionOS Metal only.
152+
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_NORMAL_NO_ATOMICS, "macos_forward_clustered_metal", true, false);
153+
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_NORMAL_NO_ATOMICS, "ios_forward_clustered_metal", true, false);
154+
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_NORMAL_NO_ATOMICS, "visionos_forward_clustered_metal", true, false);
155+
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_USE_ATTACHMENT_NO_ATOMICS, "macos_forward_clustered_metal", true, false);
156+
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_USE_ATTACHMENT_NO_ATOMICS, "ios_forward_clustered_metal", true, false);
157+
cluster_render.cluster_render_shader.set_variants_bake_for(ClusterRender::SHADER_USE_ATTACHMENT_NO_ATOMICS, "visionos_forward_clustered_metal", true, false);
158+
116159
cluster_render.shader_version = cluster_render.cluster_render_shader.version_create();
117160
cluster_render.shader = cluster_render.cluster_render_shader.version_get_shader(cluster_render.shader_version, shader_variant);
118161
cluster_render.shader_pipelines[ClusterRender::PIPELINE_NORMAL] = RD::get_singleton()->render_pipeline_create(cluster_render.shader, fb_format, vertex_format, RD::RENDER_PRIMITIVE_TRIANGLES, rasterization_state, RD::PipelineMultisampleState(), RD::PipelineDepthStencilState(), blend_state, 0);

servers/rendering/renderer_rd/cluster_builder_rd.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ class ClusterBuilderSharedDataRD {
7878
SHADER_USE_ATTACHMENT,
7979
SHADER_NORMAL_MOLTENVK,
8080
SHADER_USE_ATTACHMENT_MOLTENVK,
81+
SHADER_NORMAL_NO_ATOMICS,
82+
SHADER_USE_ATTACHMENT_NO_ATOMICS,
8183
};
8284

8385
enum PipelineVersion {

servers/rendering/renderer_rd/environment/fog.cpp

Lines changed: 70 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,24 @@ Fog::~Fog() {
4747
singleton = nullptr;
4848
}
4949

50+
int Fog::_get_fog_variant() {
51+
RenderingDevice *rd = RD::get_singleton();
52+
if (rd->has_feature(RD::SUPPORTS_IMAGE_ATOMIC_32_BIT)) {
53+
return 0;
54+
} else {
55+
return 1;
56+
}
57+
}
58+
59+
int Fog::_get_fog_process_variant(int p_idx) {
60+
RenderingDevice *rd = RD::get_singleton();
61+
if (rd->has_feature(RD::SUPPORTS_IMAGE_ATOMIC_32_BIT)) {
62+
return p_idx;
63+
} else {
64+
return p_idx + VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_MAX;
65+
}
66+
}
67+
5068
/* FOG VOLUMES */
5169

5270
RID Fog::fog_volume_allocate() {
@@ -143,7 +161,7 @@ Vector3 Fog::fog_volume_get_size(RID p_fog_volume) const {
143161
bool Fog::FogMaterialData::update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty) {
144162
uniform_set_updated = true;
145163

146-
return update_parameters_uniform_set(p_parameters, p_uniform_dirty, p_textures_dirty, shader_data->uniforms, shader_data->ubo_offsets.ptr(), shader_data->texture_uniforms, shader_data->default_texture_params, shader_data->ubo_size, uniform_set, Fog::get_singleton()->volumetric_fog.shader.version_get_shader(shader_data->version, 0), VolumetricFogShader::FogSet::FOG_SET_MATERIAL, true, true);
164+
return update_parameters_uniform_set(p_parameters, p_uniform_dirty, p_textures_dirty, shader_data->uniforms, shader_data->ubo_offsets.ptr(), shader_data->texture_uniforms, shader_data->default_texture_params, shader_data->ubo_size, uniform_set, Fog::get_singleton()->volumetric_fog.shader.version_get_shader(shader_data->version, _get_fog_variant()), VolumetricFogShader::FogSet::FOG_SET_MATERIAL, true, true);
147165
}
148166

149167
Fog::FogMaterialData::~FogMaterialData() {
@@ -194,8 +212,26 @@ void Fog::init_fog_shader(uint32_t p_max_directional_lights, int p_roughness_lay
194212
// Initialize local fog shader
195213
Vector<String> volumetric_fog_modes;
196214
volumetric_fog_modes.push_back("");
215+
volumetric_fog_modes.push_back("#define NO_IMAGE_ATOMICS\n");
216+
197217
volumetric_fog.shader.initialize(volumetric_fog_modes, defines);
198218

219+
RenderingDevice *rd = RD::get_singleton();
220+
if (rd->has_feature(RD::SUPPORTS_IMAGE_ATOMIC_32_BIT)) {
221+
volumetric_fog.shader.set_variant_enabled(1, false);
222+
} else {
223+
volumetric_fog.shader.set_variant_enabled(0, false);
224+
}
225+
// Always bake default (with image atomics) variant.
226+
volumetric_fog.shader.set_variants_bake_for(0, "*", true, true);
227+
228+
// Bake no "image atomics" variant for macOS/iOS (Vulkan and Metal) and visionOS (Metal).
229+
volumetric_fog.shader.set_variants_bake_for(1, "macos_forward_clustered_vulkan", true, false);
230+
volumetric_fog.shader.set_variants_bake_for(1, "macos_forward_clustered_metal", true, false);
231+
volumetric_fog.shader.set_variants_bake_for(1, "ios_forward_clustered_vulkan", true, false);
232+
volumetric_fog.shader.set_variants_bake_for(1, "ios_forward_clustered_metal", true, false);
233+
volumetric_fog.shader.set_variants_bake_for(1, "visionos_forward_clustered_metal", true, false);
234+
199235
material_storage->shader_set_data_request_function(RendererRD::MaterialStorage::SHADER_TYPE_FOG, _create_fog_shader_funcs);
200236
material_storage->material_set_data_request_function(RendererRD::MaterialStorage::SHADER_TYPE_FOG, _create_fog_material_funcs);
201237
volumetric_fog.volume_ubo = RD::get_singleton()->uniform_buffer_create(sizeof(VolumetricFogShader::VolumeUBO));
@@ -252,7 +288,7 @@ ALBEDO = vec3(1.0);
252288
material_storage->material_set_shader(volumetric_fog.default_material, volumetric_fog.default_shader);
253289

254290
FogMaterialData *md = static_cast<FogMaterialData *>(material_storage->material_get_data(volumetric_fog.default_material, RendererRD::MaterialStorage::SHADER_TYPE_FOG));
255-
volumetric_fog.default_shader_rd = volumetric_fog.shader.version_get_shader(md->shader_data->version, 0);
291+
volumetric_fog.default_shader_rd = volumetric_fog.shader.version_get_shader(md->shader_data->version, _get_fog_variant());
256292

257293
Vector<RD::Uniform> uniforms;
258294

@@ -282,10 +318,35 @@ ALBEDO = vec3(1.0);
282318
volumetric_fog_modes.push_back("\n#define MODE_FOG\n");
283319
volumetric_fog_modes.push_back("\n#define MODE_COPY\n");
284320

321+
volumetric_fog_modes.push_back("\n#define MODE_DENSITY\n#define NO_IMAGE_ATOMICS\n");
322+
volumetric_fog_modes.push_back("\n#define MODE_DENSITY\n#define ENABLE_SDFGI\n#define NO_IMAGE_ATOMICS\n");
323+
volumetric_fog_modes.push_back("\n#define MODE_FILTER\n#define NO_IMAGE_ATOMICS\n");
324+
volumetric_fog_modes.push_back("\n#define MODE_FOG\n#define NO_IMAGE_ATOMICS\n");
325+
volumetric_fog_modes.push_back("\n#define MODE_COPY\n#define NO_IMAGE_ATOMICS\n");
326+
285327
volumetric_fog.process_shader.initialize(volumetric_fog_modes, defines);
328+
329+
RenderingDevice *rd = RD::get_singleton();
330+
for (int i = 0; i < VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_MAX; i++) {
331+
if (rd->has_feature(RD::SUPPORTS_IMAGE_ATOMIC_32_BIT)) {
332+
volumetric_fog.process_shader.set_variant_enabled(i + VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_MAX, false);
333+
} else {
334+
volumetric_fog.process_shader.set_variant_enabled(i, false);
335+
}
336+
// Always bake default (with image atomics) variant.
337+
volumetric_fog.process_shader.set_variants_bake_for(i, "*", true, true);
338+
339+
// Bake no "image atomics" variant for macOS/iOS (Vulkan and Metal) and visionOS (Metal) only.
340+
volumetric_fog.process_shader.set_variants_bake_for(i + VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_MAX, "macos_forward_clustered_vulkan", true, false);
341+
volumetric_fog.process_shader.set_variants_bake_for(i + VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_MAX, "macos_forward_clustered_metal", true, false);
342+
volumetric_fog.process_shader.set_variants_bake_for(i + VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_MAX, "ios_forward_clustered_vulkan", true, false);
343+
volumetric_fog.process_shader.set_variants_bake_for(i + VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_MAX, "ios_forward_clustered_metal", true, false);
344+
volumetric_fog.process_shader.set_variants_bake_for(i + VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_MAX, "visionos_forward_clustered_metal", true, false);
345+
}
346+
286347
volumetric_fog.process_shader_version = volumetric_fog.process_shader.version_create();
287348
for (int i = 0; i < VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_MAX; i++) {
288-
volumetric_fog.process_pipelines[i] = RD::get_singleton()->compute_pipeline_create(volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, i));
349+
volumetric_fog.process_pipelines[i] = RD::get_singleton()->compute_pipeline_create(volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, _get_fog_process_variant(i)));
289350
}
290351
volumetric_fog.params_ubo = RD::get_singleton()->uniform_buffer_create(sizeof(VolumetricFogShader::ParamsUBO));
291352
}
@@ -349,7 +410,7 @@ void Fog::FogShaderData::set_code(const String &p_code) {
349410
ubo_offsets = gen_code.uniform_offsets;
350411
texture_uniforms = gen_code.texture_uniforms;
351412

352-
pipeline = RD::get_singleton()->compute_pipeline_create(fog_singleton->volumetric_fog.shader.version_get_shader(version, 0));
413+
pipeline = RD::get_singleton()->compute_pipeline_create(fog_singleton->volumetric_fog.shader.version_get_shader(version, _get_fog_variant()));
353414

354415
valid = true;
355416
}
@@ -941,22 +1002,22 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P
9411002
if (fog->copy_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(fog->copy_uniform_set)) {
9421003
RD::get_singleton()->free(fog->copy_uniform_set);
9431004
}
944-
fog->copy_uniform_set = RD::get_singleton()->uniform_set_create(copy_uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_COPY), 0);
1005+
fog->copy_uniform_set = RD::get_singleton()->uniform_set_create(copy_uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, _get_fog_process_variant(VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_COPY)), 0);
9451006

9461007
if (!gi_dependent_sets_valid) {
947-
fog->gi_dependent_sets.process_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_FOG), 0);
1008+
fog->gi_dependent_sets.process_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, _get_fog_process_variant(VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_FOG)), 0);
9481009

9491010
RID aux7 = uniforms.write[7].get_id(0);
9501011
RID aux8 = uniforms.write[8].get_id(0);
9511012

9521013
uniforms.write[7].set_id(0, aux8);
9531014
uniforms.write[8].set_id(0, aux7);
9541015

955-
fog->gi_dependent_sets.process_uniform_set2 = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_FOG), 0);
1016+
fog->gi_dependent_sets.process_uniform_set2 = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, _get_fog_process_variant(VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_FOG)), 0);
9561017

9571018
uniforms.remove_at(8);
9581019
uniforms.write[7].set_id(0, aux7);
959-
fog->gi_dependent_sets.process_uniform_set_density = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_DENSITY), 0);
1020+
fog->gi_dependent_sets.process_uniform_set_density = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, _get_fog_process_variant(VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_DENSITY)), 0);
9601021
}
9611022
}
9621023

@@ -990,7 +1051,7 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P
9901051
uniforms.push_back(u);
9911052
}
9921053

993-
fog->sdfgi_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_DENSITY_WITH_SDFGI), 1);
1054+
fog->sdfgi_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, _get_fog_process_variant(VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_DENSITY_WITH_SDFGI)), 1);
9941055
}
9951056
}
9961057

servers/rendering/renderer_rd/environment/fog.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ class Fog : public RendererFog {
4848
private:
4949
static Fog *singleton;
5050

51+
static int _get_fog_variant();
52+
static int _get_fog_process_variant(int p_idx);
53+
5154
/* FOG VOLUMES */
5255

5356
struct FogVolume {

0 commit comments

Comments
 (0)