Skip to content

Commit ec62f12

Browse files
committed
Merge pull request #109971 from clayjohn/hdr2d-mobile
Use half float precision buffer for 3D when HDR2D is enabled
2 parents 70f0746 + f61ee7b commit ec62f12

File tree

13 files changed

+60
-53
lines changed

13 files changed

+60
-53
lines changed

servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,9 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat
689689
}
690690
}
691691

692-
p_render_data->scene_data->update_ubo(scene_state.uniform_buffers[p_index], get_debug_draw_mode(), env, reflection_probe_instance, p_render_data->camera_attributes, p_pancake_shadows, p_screen_size, p_default_bg_color, _render_buffers_get_luminance_multiplier(), p_opaque_render_buffers, p_apply_alpha_multiplier);
692+
float luminance_multiplier = rd.is_valid() ? rd->get_luminance_multiplier() : 1.0;
693+
694+
p_render_data->scene_data->update_ubo(scene_state.uniform_buffers[p_index], get_debug_draw_mode(), env, reflection_probe_instance, p_render_data->camera_attributes, p_pancake_shadows, p_screen_size, p_default_bg_color, luminance_multiplier, p_opaque_render_buffers, p_apply_alpha_multiplier);
693695

694696
// now do implementation UBO
695697

@@ -1434,7 +1436,7 @@ void RenderForwardClustered::_process_ssr(Ref<RenderSceneBuffersRD> p_render_buf
14341436

14351437
RENDER_TIMESTAMP("Process SSR");
14361438

1437-
ss_effects->ssr_allocate_buffers(p_render_buffers, rb_data->ss_effects_data.ssr, _render_buffers_get_color_format());
1439+
ss_effects->ssr_allocate_buffers(p_render_buffers, rb_data->ss_effects_data.ssr, p_render_buffers->get_base_data_format());
14381440

14391441
Projection reprojections[RendererSceneRender::MAX_RENDER_VIEWS];
14401442

@@ -1946,7 +1948,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
19461948
bool draw_sky = false;
19471949
bool draw_sky_fog_only = false;
19481950
// We invert luminance_multiplier for sky so that we can combine it with exposure value.
1949-
float sky_luminance_multiplier = 1.0 / _render_buffers_get_luminance_multiplier();
1951+
float sky_luminance_multiplier = 1.0 / rb->get_luminance_multiplier();
19501952
float sky_brightness_multiplier = 1.0;
19511953

19521954
Color clear_color;
@@ -2472,7 +2474,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
24722474
} else if (using_taa) {
24732475
RD::get_singleton()->draw_command_begin_label("TAA");
24742476
RENDER_TIMESTAMP("TAA");
2475-
taa->process(rb, _render_buffers_get_color_format(), p_render_data->scene_data->z_near, p_render_data->scene_data->z_far);
2477+
taa->process(rb, rb->get_base_data_format(), p_render_data->scene_data->z_near, p_render_data->scene_data->z_far);
24762478
RD::get_singleton()->draw_command_end_label();
24772479
}
24782480
}
@@ -4505,7 +4507,7 @@ void RenderForwardClustered::_mesh_compile_pipelines_for_surface(const SurfacePi
45054507

45064508
// Retrieve from the scene shader which groups are currently enabled.
45074509
const bool multiview_enabled = p_global.use_multiview && scene_shader.is_multiview_shader_group_enabled();
4508-
const RD::DataFormat buffers_color_format = _render_buffers_get_color_format();
4510+
const RD::DataFormat buffers_color_format = _render_buffers_get_preferred_color_format();
45094511
const bool buffers_can_be_storage = _render_buffers_can_be_storage();
45104512

45114513
// Set the attributes common to all pipelines.

servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -414,19 +414,12 @@ void RenderForwardMobile::update() {
414414

415415
/* Render functions */
416416

417-
float RenderForwardMobile::_render_buffers_get_luminance_multiplier() {
418-
// On mobile renderer we need to multiply source colors by 2 due to using a UNORM buffer
419-
// and multiplying by the output color during 3D rendering by 0.5
420-
return 2.0;
421-
}
422-
423-
RD::DataFormat RenderForwardMobile::_render_buffers_get_color_format() {
417+
RD::DataFormat RenderForwardMobile::_render_buffers_get_preferred_color_format() {
424418
// Using 32bit buffers enables AFBC on mobile devices which should have a definite performance improvement (MALI G710 and newer support this on 64bit RTs)
425419
return RD::DATA_FORMAT_A2B10G10R10_UNORM_PACK32;
426420
}
427421

428422
bool RenderForwardMobile::_render_buffers_can_be_storage() {
429-
// Using 32bit buffers enables AFBC on mobile devices which should have a definite performance improvement (MALI G710 and newer support this on 64bit RTs)
430423
// Doesn't support storage
431424
return false;
432425
}
@@ -1002,8 +995,8 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
1002995
bool draw_sky = false;
1003996
bool draw_sky_fog_only = false;
1004997
// We invert luminance_multiplier for sky so that we can combine it with exposure value.
1005-
float inverse_luminance_multiplier = 1.0 / _render_buffers_get_luminance_multiplier();
1006-
float sky_luminance_multiplier = inverse_luminance_multiplier;
998+
float inverse_luminance_multiplier = 1.0 / rb->get_luminance_multiplier();
999+
float sky_luminance_multiplier = 1.0 / 2.0; // Hardcoded since sky always uses LDR in the mobile renderer
10071000
float sky_brightness_multiplier = 1.0;
10081001

10091002
Color clear_color = p_default_bg_color;
@@ -1122,6 +1115,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
11221115
base_specialization.scene_use_ambient_cubemap = use_ambient_cubemap;
11231116
base_specialization.scene_use_reflection_cubemap = use_reflection_cubemap;
11241117
base_specialization.scene_roughness_limiter_enabled = p_render_data->render_buffers.is_valid() && screen_space_roughness_limiter_is_active();
1118+
base_specialization.luminance_multiplier = p_render_data->render_buffers.is_valid() ? p_render_data->render_buffers->get_luminance_multiplier() : 1.0;
11251119
}
11261120

11271121
{
@@ -2201,7 +2195,9 @@ void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data,
22012195
}
22022196
}
22032197

2204-
p_render_data->scene_data->update_ubo(scene_state.uniform_buffers[p_index], get_debug_draw_mode(), env, reflection_probe_instance, p_render_data->camera_attributes, p_pancake_shadows, p_screen_size, p_default_bg_color, _render_buffers_get_luminance_multiplier(), p_opaque_render_buffers, false);
2198+
float luminance_multiplier = p_render_data->render_buffers.is_valid() ? p_render_data->render_buffers->get_luminance_multiplier() : 1.0;
2199+
2200+
p_render_data->scene_data->update_ubo(scene_state.uniform_buffers[p_index], get_debug_draw_mode(), env, reflection_probe_instance, p_render_data->camera_attributes, p_pancake_shadows, p_screen_size, p_default_bg_color, luminance_multiplier, p_opaque_render_buffers, false);
22052201
}
22062202

22072203
/// RENDERING ///
@@ -3141,7 +3137,6 @@ void RenderForwardMobile::_mesh_compile_pipelines_for_surface(const SurfacePipel
31413137
pipeline_key.wireframe = false;
31423138

31433139
const bool multiview_enabled = p_global.use_multiview && scene_shader.is_multiview_shader_group_enabled();
3144-
const RD::DataFormat buffers_color_format = _render_buffers_get_color_format();
31453140
const bool buffers_can_be_storage = _render_buffers_can_be_storage();
31463141
const uint32_t vrs_iterations = p_global.use_vrs ? 2 : 1;
31473142

@@ -3155,6 +3150,7 @@ void RenderForwardMobile::_mesh_compile_pipelines_for_surface(const SurfacePipel
31553150
for (uint32_t use_post_pass = post_pass_start; use_post_pass < post_pass_iterations; use_post_pass++) {
31563151
const uint32_t hdr_iterations = use_post_pass ? hdr_target_iterations : (hdr_start + 1);
31573152
for (uint32_t use_hdr = hdr_start; use_hdr < hdr_iterations; use_hdr++) {
3153+
const RD::DataFormat buffers_color_format = use_hdr ? RD::DATA_FORMAT_R16G16B16A16_SFLOAT : _render_buffers_get_preferred_color_format();
31583154
pipeline_key.version = SceneShaderForwardMobile::SHADER_VERSION_COLOR_PASS;
31593155
pipeline_key.framebuffer_format_id = _get_color_framebuffer_format_for_pipeline(buffers_color_format, buffers_can_be_storage, RD::TextureSamples(p_global.texture_samples), RD::TextureSamples(p_global.target_samples), use_vrs, use_post_pass, use_hdr, 1);
31603156
_mesh_compile_pipeline_for_surface(p_surface.shader, p_surface.mesh_surface, p_surface.instanced, p_source, pipeline_key, r_pipeline_pairs);
@@ -3340,7 +3336,7 @@ void RenderForwardMobile::_update_shader_quality_settings() {
33403336
RenderForwardMobile::RenderForwardMobile() {
33413337
singleton = this;
33423338

3343-
sky.set_texture_format(_render_buffers_get_color_format());
3339+
sky.set_texture_format(_render_buffers_get_preferred_color_format());
33443340

33453341
String defines;
33463342

servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -413,8 +413,7 @@ class RenderForwardMobile : public RendererSceneRenderRD {
413413
/* setup */
414414
virtual void _update_shader_quality_settings() override;
415415

416-
virtual float _render_buffers_get_luminance_multiplier() override;
417-
virtual RD::DataFormat _render_buffers_get_color_format() override;
416+
virtual RD::DataFormat _render_buffers_get_preferred_color_format() override;
418417
virtual bool _render_buffers_can_be_storage() override;
419418

420419
virtual RID _render_buffers_get_normal_texture(Ref<RenderSceneBuffersRD> p_render_buffers) override;

servers/rendering/renderer_rd/renderer_scene_render_rd.cpp

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ Ref<RenderSceneBuffers> RendererSceneRenderRD::render_buffers_create() {
242242

243243
rb->set_can_be_storage(_render_buffers_can_be_storage());
244244
rb->set_max_cluster_elements(max_cluster_elements);
245-
rb->set_base_data_format(_render_buffers_get_color_format());
245+
rb->set_preferred_data_format(_render_buffers_get_preferred_color_format());
246246
if (vrs) {
247247
rb->set_vrs(vrs);
248248
}
@@ -587,7 +587,7 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
587587
}
588588
}
589589

590-
float luminance_multiplier = _render_buffers_get_luminance_multiplier();
590+
float luminance_multiplier = rb->get_luminance_multiplier();
591591
for (uint32_t l = 0; l < rb->get_view_count(); l++) {
592592
for (int i = 0; i < (max_glow_level + 1); i++) {
593593
Size2i vp_size = rb->get_texture_slice_size(RB_SCOPE_BUFFERS, RB_TEX_BLUR_1, i);
@@ -693,7 +693,7 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
693693
}
694694
}
695695

696-
tonemap.luminance_multiplier = _render_buffers_get_luminance_multiplier();
696+
tonemap.luminance_multiplier = rb->get_luminance_multiplier();
697697
tonemap.view_count = rb->get_view_count();
698698

699699
RID dest_fb;
@@ -702,7 +702,7 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
702702
if (spatial_upscaler != nullptr || use_smaa) {
703703
// If we use a spatial upscaler to upscale or SMAA to antialias we need to write our result into an intermediate buffer.
704704
// Note that this is cached so we only create the texture the first time.
705-
dest_fb_format = _render_buffers_get_color_format();
705+
dest_fb_format = rb->get_base_data_format();
706706
RID dest_texture = rb->create_texture(SNAME("Tonemapper"), SNAME("destination"), dest_fb_format, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT, RD::TEXTURE_SAMPLES_1, Size2i(), 0, 1, true, true);
707707
dest_fb = FramebufferCacheRD::get_singleton()->get_cache(dest_texture);
708708
if (use_smaa) {
@@ -758,7 +758,7 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
758758
bool using_hdr = texture_storage->render_target_is_using_hdr(render_target);
759759
RID dest_fb;
760760
if (spatial_upscaler) {
761-
rb->create_texture(SNAME("SMAA"), SNAME("destination"), _render_buffers_get_color_format(), RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT, RD::TEXTURE_SAMPLES_1, Size2i(), 0, 1, true, true);
761+
rb->create_texture(SNAME("SMAA"), SNAME("destination"), rb->get_base_data_format(), RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT, RD::TEXTURE_SAMPLES_1, Size2i(), 0, 1, true, true);
762762
}
763763
if (rb->get_view_count() > 1) {
764764
for (uint32_t v = 0; v < rb->get_view_count(); v++) {
@@ -802,7 +802,7 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
802802
RD::DataFormat format_for_debanding;
803803

804804
if (spatial_upscaler) {
805-
RID dest_texture = rb->create_texture(SNAME("SMAA"), SNAME("destination"), _render_buffers_get_color_format(), RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT, RD::TEXTURE_SAMPLES_1, Size2i(), 0, 1, true, true);
805+
RID dest_texture = rb->create_texture(SNAME("SMAA"), SNAME("destination"), rb->get_base_data_format(), RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT, RD::TEXTURE_SAMPLES_1, Size2i(), 0, 1, true, true);
806806
dest_fb = FramebufferCacheRD::get_singleton()->get_cache(dest_texture);
807807
// Debanding is currently not supported when using spatial upscaling, so apply it before scaling.
808808
// This produces suboptimal results because the image will be modified by spatial upscaling after
@@ -935,7 +935,7 @@ void RendererSceneRenderRD::_post_process_subpass(RID p_source_texture, RID p_fr
935935

936936
tonemap.texture_size = Vector2i(target_size.x, target_size.y);
937937

938-
tonemap.luminance_multiplier = _render_buffers_get_luminance_multiplier();
938+
tonemap.luminance_multiplier = rb->get_luminance_multiplier();
939939
tonemap.view_count = rb->get_view_count();
940940

941941
if (rb->get_use_debanding()) {
@@ -1115,11 +1115,7 @@ RID RendererSceneRenderRD::render_buffers_get_default_voxel_gi_buffer() {
11151115
return gi.default_voxel_gi_buffer;
11161116
}
11171117

1118-
float RendererSceneRenderRD::_render_buffers_get_luminance_multiplier() {
1119-
return 1.0;
1120-
}
1121-
1122-
RD::DataFormat RendererSceneRenderRD::_render_buffers_get_color_format() {
1118+
RD::DataFormat RendererSceneRenderRD::_render_buffers_get_preferred_color_format() {
11231119
return RD::DATA_FORMAT_R16G16B16A16_SFLOAT;
11241120
}
11251121

servers/rendering/renderer_rd/renderer_scene_render_rd.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,9 +244,7 @@ class RendererSceneRenderRD : public RendererSceneRender, public RenderingShader
244244
virtual void voxel_gi_set_quality(RS::VoxelGIQuality p_quality) override { gi.voxel_gi_quality = p_quality; }
245245

246246
/* render buffers */
247-
248-
virtual float _render_buffers_get_luminance_multiplier();
249-
virtual RD::DataFormat _render_buffers_get_color_format();
247+
virtual RD::DataFormat _render_buffers_get_preferred_color_format();
250248
virtual bool _render_buffers_can_be_storage();
251249
virtual Ref<RenderSceneBuffers> render_buffers_create() override;
252250
virtual void gi_set_use_half_resolution(bool p_enable) override;

servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ float sc_luminance_multiplier() {
142142
return 1.0;
143143
}
144144

145+
#define REFLECTION_MULTIPLIER 1.0
146+
145147
#define SDFGI_MAX_CASCADES 8
146148

147149
/* Set 0: Base Pass (never changes) */

servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1563,7 +1563,7 @@ void main() {
15631563
indirect_specular_light = hvec3(textureLod(samplerCube(radiance_cubemap, DEFAULT_SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP), vec3(ref_vec), lod).rgb);
15641564

15651565
#endif //USE_RADIANCE_CUBEMAP_ARRAY
1566-
indirect_specular_light *= sc_luminance_multiplier();
1566+
indirect_specular_light *= REFLECTION_MULTIPLIER;
15671567
indirect_specular_light *= half(scene_data.IBL_exposure_normalization);
15681568
indirect_specular_light *= horizon * horizon;
15691569
indirect_specular_light *= half(scene_data.ambient_light_color_energy.a);
@@ -1585,7 +1585,7 @@ void main() {
15851585
#else
15861586
hvec3 cubemap_ambient = hvec3(textureLod(samplerCube(radiance_cubemap, DEFAULT_SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP), ambient_dir, MAX_ROUGHNESS_LOD).rgb);
15871587
#endif //USE_RADIANCE_CUBEMAP_ARRAY
1588-
cubemap_ambient *= sc_luminance_multiplier();
1588+
cubemap_ambient *= REFLECTION_MULTIPLIER;
15891589
cubemap_ambient *= half(scene_data.IBL_exposure_normalization);
15901590
ambient_light = mix(ambient_light, cubemap_ambient * half(scene_data.ambient_light_color_energy.a), half(scene_data.ambient_color_sky_mix));
15911591
}

servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile_inc.glsl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,10 @@ half sc_luminance_multiplier() {
215215
return half(sc_packed_2());
216216
}
217217

218+
// Like the luminance multiplier, but it is only for sky and reflection probes
219+
// since they are always LDR.
220+
#define REFLECTION_MULTIPLIER half(2.0)
221+
218222
/* Set 0: Base Pass (never changes) */
219223

220224
#include "../light_data_inc.glsl"

servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -957,7 +957,7 @@ void reflection_process(uint ref_index, vec3 vertex, hvec3 ref_vec, hvec3 normal
957957
hvec4 reflection;
958958
half reflection_blend = max(half(0.0), blend - reflection_accum.a);
959959

960-
reflection.rgb = hvec3(textureLod(samplerCubeArray(reflection_atlas, DEFAULT_SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP), vec4(local_ref_vec, reflections.data[ref_index].index), sqrt(roughness) * MAX_ROUGHNESS_LOD).rgb) * sc_luminance_multiplier();
960+
reflection.rgb = hvec3(textureLod(samplerCubeArray(reflection_atlas, DEFAULT_SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP), vec4(local_ref_vec, reflections.data[ref_index].index), sqrt(roughness) * MAX_ROUGHNESS_LOD).rgb) * REFLECTION_MULTIPLIER;
961961
reflection.rgb *= half(reflections.data[ref_index].exposure_normalization);
962962
reflection.a = reflection_blend;
963963

servers/rendering/renderer_rd/storage_rd/light_storage.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1542,7 +1542,7 @@ bool LightStorage::reflection_probe_instance_begin_render(RID p_instance, RID p_
15421542
}
15431543
atlas->reflections.resize(atlas->count);
15441544
for (int i = 0; i < atlas->count; i++) {
1545-
atlas->reflections.write[i].data.update_reflection_data(atlas->size, mipmaps, false, atlas->reflection, i * 6, update_always, RendererSceneRenderRD::get_singleton()->get_sky()->roughness_layers, RendererSceneRenderRD::get_singleton()->_render_buffers_get_color_format());
1545+
atlas->reflections.write[i].data.update_reflection_data(atlas->size, mipmaps, false, atlas->reflection, i * 6, update_always, RendererSceneRenderRD::get_singleton()->get_sky()->roughness_layers, RendererSceneRenderRD::get_singleton()->_render_buffers_get_preferred_color_format());
15461546
for (int j = 0; j < 6; j++) {
15471547
atlas->reflections.write[i].fbs[j] = RendererSceneRenderRD::get_singleton()->reflection_probe_create_framebuffer(atlas->reflections.write[i].data.layers[0].mipmaps[0].views[j], atlas->depth_buffer);
15481548
}
@@ -1814,7 +1814,7 @@ void LightStorage::update_reflection_probe_buffer(RenderDataRD *p_render_data, c
18141814
}
18151815

18161816
RD::DataFormat LightStorage::get_reflection_probe_color_format() {
1817-
return RendererSceneRenderRD::get_singleton()->_render_buffers_get_color_format();
1817+
return RendererSceneRenderRD::get_singleton()->_render_buffers_get_preferred_color_format();
18181818
}
18191819

18201820
uint32_t LightStorage::get_reflection_probe_color_usage_bits() {

0 commit comments

Comments
 (0)