@@ -615,6 +615,8 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
615615
616616 RendererRD::ToneMapper::TonemapSettings tonemap;
617617
618+ bool using_hdr = texture_storage->render_target_is_using_hdr (render_target);
619+
618620 tonemap.exposure_texture = luminance->get_current_luminance_buffer (rb);
619621 if (can_use_effects && RSG::camera_attributes->camera_attributes_uses_auto_exposure (p_render_data->camera_attributes ) && tonemap.exposure_texture .is_valid ()) {
620622 tonemap.use_auto_exposure = true ;
@@ -653,7 +655,6 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
653655 tonemap.use_fxaa = true ;
654656 }
655657
656- tonemap.use_debanding = rb->get_use_debanding ();
657658 tonemap.texture_size = Vector2i (color_size.x , color_size.y );
658659
659660 if (p_render_data->environment .is_valid ()) {
@@ -665,7 +666,7 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
665666 tonemap.use_color_correction = false ;
666667 tonemap.use_1d_color_correction = false ;
667668 tonemap.color_correction_texture = texture_storage->texture_rd_get_default (RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE);
668- tonemap.convert_to_srgb = !texture_storage-> render_target_is_using_hdr (render_target) ;
669+ tonemap.convert_to_srgb = !using_hdr ;
669670
670671 if (can_use_effects && p_render_data->environment .is_valid ()) {
671672 tonemap.use_bcs = environment_get_adjustments_enabled (p_render_data->environment );
@@ -683,24 +684,43 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
683684 tonemap.view_count = rb->get_view_count ();
684685
685686 RID dest_fb;
687+ RD::DataFormat dest_fb_format;
686688 if (spatial_upscaler != nullptr || use_smaa) {
687689 // If we use a spatial upscaler to upscale or SMAA to antialias we need to write our result into an intermediate buffer.
688690 // Note that this is cached so we only create the texture the first time.
689- RID dest_texture = rb->create_texture (SNAME (" Tonemapper" ), 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 );
691+ dest_fb_format = _render_buffers_get_color_format ();
692+ 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 );
690693 dest_fb = FramebufferCacheRD::get_singleton ()->get_cache (dest_texture);
691694 } else {
692695 // If we do a bilinear upscale we just render into our render target and our shader will upscale automatically.
693696 // Target size in this case is lying as we never get our real target size communicated.
694697 // Bit nasty but...
695698
696699 if (dest_is_msaa_2d) {
700+ // Assume that the DataFormat of render_target_get_rd_texture_msaa is the same as render_target_get_color_format.
701+ dest_fb_format = texture_storage->render_target_get_color_format (using_hdr, tonemap.convert_to_srgb );
697702 dest_fb = FramebufferCacheRD::get_singleton ()->get_cache (texture_storage->render_target_get_rd_texture_msaa (render_target));
698703 texture_storage->render_target_set_msaa_needs_resolve (render_target, true ); // Make sure this gets resolved.
699704 } else {
705+ // Assume that the DataFormat of render_target_get_rd_framebuffer is the same as render_target_get_color_format.
706+ dest_fb_format = texture_storage->render_target_get_color_format (using_hdr, tonemap.convert_to_srgb );
700707 dest_fb = texture_storage->render_target_get_rd_framebuffer (render_target);
701708 }
702709 }
703710
711+ if (rb->get_use_debanding ()) {
712+ if (dest_fb_format >= RD::DATA_FORMAT_R8_UNORM && dest_fb_format <= RD::DATA_FORMAT_A8B8G8R8_SRGB_PACK32) {
713+ tonemap.debanding_mode = RendererRD::ToneMapper::TonemapSettings::DebandingMode::DEBANDING_MODE_8_BIT;
714+ } else if (dest_fb_format >= RD::DATA_FORMAT_A2R10G10B10_UNORM_PACK32 && dest_fb_format <= RD::DATA_FORMAT_A2B10G10R10_SINT_PACK32) {
715+ tonemap.debanding_mode = RendererRD::ToneMapper::TonemapSettings::DebandingMode::DEBANDING_MODE_10_BIT;
716+ } else {
717+ // In this case, debanding will be handled later when quantizing to an integer data format. (During blit, for example.)
718+ tonemap.debanding_mode = RendererRD::ToneMapper::TonemapSettings::DebandingMode::DEBANDING_MODE_DISABLED;
719+ }
720+ } else {
721+ tonemap.debanding_mode = RendererRD::ToneMapper::TonemapSettings::DebandingMode::DEBANDING_MODE_DISABLED;
722+ }
723+
704724 tone_mapper->tonemapper (color_texture, dest_fb, tonemap);
705725
706726 RD::get_singleton ()->draw_command_end_label ();
@@ -814,6 +834,8 @@ void RendererSceneRenderRD::_post_process_subpass(RID p_source_texture, RID p_fr
814834 ERR_FAIL_MSG (" Auto Exposure is not supported when using subpasses." );
815835 }
816836
837+ bool using_hdr = texture_storage->render_target_is_using_hdr (rb->get_render_target ());
838+
817839 tonemap.use_glow = false ;
818840 tonemap.glow_texture = texture_storage->texture_rd_get_default (RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK);
819841 tonemap.glow_map = texture_storage->texture_rd_get_default (RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_WHITE);
@@ -823,7 +845,7 @@ void RendererSceneRenderRD::_post_process_subpass(RID p_source_texture, RID p_fr
823845 tonemap.use_color_correction = false ;
824846 tonemap.use_1d_color_correction = false ;
825847 tonemap.color_correction_texture = texture_storage->texture_rd_get_default (RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE);
826- tonemap.convert_to_srgb = !texture_storage-> render_target_is_using_hdr (rb-> get_render_target ()) ;
848+ tonemap.convert_to_srgb = !using_hdr ;
827849
828850 if (can_use_effects && p_render_data->environment .is_valid ()) {
829851 tonemap.use_bcs = environment_get_adjustments_enabled (p_render_data->environment );
@@ -837,12 +859,26 @@ void RendererSceneRenderRD::_post_process_subpass(RID p_source_texture, RID p_fr
837859 }
838860 }
839861
840- tonemap.use_debanding = rb->get_use_debanding ();
841862 tonemap.texture_size = Vector2i (target_size.x , target_size.y );
842863
843864 tonemap.luminance_multiplier = _render_buffers_get_luminance_multiplier ();
844865 tonemap.view_count = rb->get_view_count ();
845866
867+ if (rb->get_use_debanding ()) {
868+ // Assume that the DataFormat of p_framebuffer is the same as render_target_get_color_format.
869+ RD::DataFormat dest_fb_format = texture_storage->render_target_get_color_format (using_hdr, tonemap.convert_to_srgb );
870+ if (dest_fb_format >= RD::DATA_FORMAT_R8_UNORM && dest_fb_format <= RD::DATA_FORMAT_A8B8G8R8_SRGB_PACK32) {
871+ tonemap.debanding_mode = RendererRD::ToneMapper::TonemapSettings::DebandingMode::DEBANDING_MODE_8_BIT;
872+ } else if (dest_fb_format >= RD::DATA_FORMAT_A2R10G10B10_UNORM_PACK32 && dest_fb_format <= RD::DATA_FORMAT_A2B10G10R10_SINT_PACK32) {
873+ tonemap.debanding_mode = RendererRD::ToneMapper::TonemapSettings::DebandingMode::DEBANDING_MODE_10_BIT;
874+ } else {
875+ // In this case, debanding will be handled later when quantizing to an integer data format. (During blit, for example.)
876+ tonemap.debanding_mode = RendererRD::ToneMapper::TonemapSettings::DebandingMode::DEBANDING_MODE_DISABLED;
877+ }
878+ } else {
879+ tonemap.debanding_mode = RendererRD::ToneMapper::TonemapSettings::DebandingMode::DEBANDING_MODE_DISABLED;
880+ }
881+
846882 tone_mapper->tonemapper (draw_list, p_source_texture, RD::get_singleton ()->framebuffer_get_format (p_framebuffer), tonemap);
847883
848884 RD::get_singleton ()->draw_command_end_label ();
0 commit comments