@@ -194,7 +194,7 @@ RID RendererSceneRenderImplementation::RenderForwardMobile::RenderBufferDataForw
194194 return RID ();
195195}
196196
197- RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs (FramebufferConfigType p_config_type) {
197+ RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs (FramebufferConfigType p_config_type, bool p_resolve_depth ) {
198198 ERR_FAIL_NULL_V (render_buffers, RID ());
199199
200200 RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton ();
@@ -230,17 +230,22 @@ RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(Framebuffe
230230
231231 Vector<RID> textures;
232232 int color_buffer_id = 0 ;
233- textures.push_back (use_msaa ? render_buffers->get_color_msaa () : render_buffers->get_internal_texture ()); // 0 - color buffer
234- textures.push_back (use_msaa ? render_buffers->get_depth_msaa () : render_buffers->get_depth_texture ()); // 1 - depth buffer
233+ int depth_buffer_id = 1 ;
234+ textures.push_back (use_msaa ? render_buffers->get_color_msaa () : render_buffers->get_internal_texture ()); // 0 - color buffer.
235+ textures.push_back (use_msaa ? render_buffers->get_depth_msaa () : render_buffers->get_depth_texture ()); // 1 - depth buffer.
235236 if (vrs_texture.is_valid ()) {
236- textures.push_back (vrs_texture); // 2 - vrs texture
237+ textures.push_back (vrs_texture); // 2 - vrs texture.
237238 }
238239 if (use_msaa) {
239240 color_buffer_id = textures.size ();
240- textures.push_back (render_buffers->get_internal_texture ()); // color buffer for resolve
241+ textures.push_back (render_buffers->get_internal_texture ()); // Color buffer for resolve.
242+ }
243+ if (use_msaa && p_resolve_depth) {
244+ depth_buffer_id = textures.size ();
245+ textures.push_back (render_buffers->get_depth_texture ()); // Depth buffer for resolve.
241246 }
242247
243- // Now define our subpasses
248+ // Now define our subpasses.
244249 Vector<RD::FramebufferPass> passes;
245250
246251 switch (p_config_type) {
@@ -250,8 +255,13 @@ RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(Framebuffe
250255 pass.depth_attachment = 1 ;
251256
252257 if (use_msaa) {
253- // Add resolve
258+ // Add color resolve.
254259 pass.resolve_attachments .push_back (color_buffer_id);
260+
261+ if (p_resolve_depth) {
262+ // Add depth resolve.
263+ pass.depth_resolve_attachment = depth_buffer_id;
264+ }
255265 }
256266 passes.push_back (pass);
257267
@@ -262,21 +272,26 @@ RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(Framebuffe
262272 Size2i target_size = render_buffers->get_target_size ();
263273 Size2i internal_size = render_buffers->get_internal_size ();
264274
265- // can 't do our blit pass if resolutions don't match, this should already have been checked.
275+ // Can 't do our blit pass if resolutions don't match, this should already have been checked.
266276 ERR_FAIL_COND_V (target_size != internal_size, RID ());
267277
268278 RD::FramebufferPass pass;
269279 pass.color_attachments .push_back (0 );
270280 pass.depth_attachment = 1 ;
271281
272282 if (use_msaa) {
273- // add resolve
283+ // Add color resolve.
274284 pass.resolve_attachments .push_back (color_buffer_id);
285+
286+ if (p_resolve_depth) {
287+ // Add depth resolve.
288+ pass.depth_resolve_attachment = depth_buffer_id;
289+ }
275290 }
276291
277292 passes.push_back (pass);
278293
279- // - add blit to 2D pass
294+ // Add blit to 2D pass.
280295 RID render_target = render_buffers->get_render_target ();
281296 ERR_FAIL_COND_V (render_target.is_null (), RID ());
282297 RID target_buffer;
@@ -289,7 +304,7 @@ RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(Framebuffe
289304 ERR_FAIL_COND_V (target_buffer.is_null (), RID ());
290305
291306 int target_buffer_id = textures.size ();
292- textures.push_back (target_buffer); // target buffer
307+ textures.push_back (target_buffer); // Target buffer.
293308
294309 RD::FramebufferPass blit_pass;
295310 blit_pass.input_attachments .push_back (color_buffer_id); // Read from our (resolved) color buffer
@@ -814,9 +829,13 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
814829
815830 RENDER_TIMESTAMP (" Setup 3D Scene" );
816831
832+ bool has_depth_texture_override = false ;
833+ bool supports_depth_resolve = RenderingDevice::get_singleton ()->has_feature (RD::SUPPORTS_FRAMEBUFFER_DEPTH_RESOLVE);
834+
817835 RID render_target = rb->get_render_target ();
818836 if (render_target.is_valid ()) {
819- p_render_data->scene_data ->calculate_motion_vectors = RendererRD::TextureStorage::get_singleton ()->render_target_get_override_velocity (render_target).is_valid ();
837+ p_render_data->scene_data ->calculate_motion_vectors = texture_storage->render_target_get_override_velocity (render_target).is_valid ();
838+ has_depth_texture_override = texture_storage->render_target_get_override_depth (render_target).is_valid ();
820839 } else {
821840 p_render_data->scene_data ->calculate_motion_vectors = false ;
822841 }
@@ -841,6 +860,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
841860
842861 RS::ViewportMSAA msaa = rb->get_msaa_3d ();
843862 bool use_msaa = msaa != RS::VIEWPORT_MSAA_DISABLED;
863+ bool resolve_depth_buffer = (use_msaa && has_depth_texture_override); // We'll check more conditions later.
844864
845865 bool ce_has_post_opaque = _has_compositor_effect (RS::COMPOSITOR_EFFECT_CALLBACK_TYPE_POST_OPAQUE, p_render_data);
846866 bool ce_has_pre_transparent = _has_compositor_effect (RS::COMPOSITOR_EFFECT_CALLBACK_TYPE_PRE_TRANSPARENT, p_render_data);
@@ -943,6 +963,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
943963 if (use_msaa && p_render_data->environment .is_valid () && RSG::camera_attributes->camera_attributes_uses_dof (p_render_data->camera_attributes )) {
944964 // Need to resolve depth texture for DOF when using MSAA.
945965 scene_state.used_depth_texture = true ;
966+ resolve_depth_buffer = true ;
946967 }
947968
948969 if (scene_state.used_screen_texture || scene_state.used_depth_texture ) {
@@ -951,13 +972,17 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
951972 using_subpass_post_process = false ;
952973 }
953974
975+ if (use_msaa && (global_surface_data.depth_texture_used || scene_state.used_depth_texture )) {
976+ resolve_depth_buffer = true ;
977+ }
978+
954979 if (using_subpass_post_process) {
955980 // We can do all in one go.
956- framebuffer = rb_data->get_color_fbs (RenderBufferDataForwardMobile::FB_CONFIG_RENDER_AND_POST_PASS);
981+ framebuffer = rb_data->get_color_fbs (RenderBufferDataForwardMobile::FB_CONFIG_RENDER_AND_POST_PASS, resolve_depth_buffer && supports_depth_resolve );
957982 global_pipeline_data_required.use_subpass_post_pass = true ;
958983 } else {
959984 // We separate things out.
960- framebuffer = rb_data->get_color_fbs (RenderBufferDataForwardMobile::FB_CONFIG_RENDER_PASS);
985+ framebuffer = rb_data->get_color_fbs (RenderBufferDataForwardMobile::FB_CONFIG_RENDER_PASS, resolve_depth_buffer && supports_depth_resolve );
961986 global_pipeline_data_required.use_separate_post_pass = true ;
962987 }
963988 samplers = rb->get_samplers ();
@@ -1247,8 +1272,6 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
12471272 RD::get_singleton ()->draw_command_end_label (); // Render Transparent Subpass
12481273 }
12491274
1250- // note if we are using MSAA we should get an automatic resolve through our subpass configuration.
1251-
12521275 // blit to tonemap
12531276 if (rb_data.is_valid () && using_subpass_post_process) {
12541277 _post_process_subpass (p_render_data->render_buffers ->get_internal_texture (), framebuffer, p_render_data);
@@ -1257,6 +1280,13 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
12571280 RD::get_singleton ()->draw_command_end_label (); // Render 3D Pass / Render Reflection Probe Pass
12581281
12591282 RD::get_singleton ()->draw_list_end ();
1283+
1284+ // note, if MSAA is used we should get an automatic resolve of the color buffer here.
1285+
1286+ if (use_msaa && has_depth_texture_override && !supports_depth_resolve) {
1287+ // We don't have a fallback for this, See PR #111322
1288+ WARN_PRINT_ONCE (" MSAA Depth buffer resolve is not supported on this platform." );
1289+ }
12601290 } else {
12611291 // We're done with our subpasses so end our container pass
12621292 // note, if MSAA is used we should get an automatic resolve of the color buffer here.
@@ -1279,12 +1309,17 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
12791309 }
12801310 }
12811311
1312+ if (use_msaa && has_depth_texture_override && !supports_depth_resolve) {
1313+ // We don't have a fallback for this, See PR #111322
1314+ WARN_PRINT_ONCE (" MSAA Depth buffer resolve is not supported on this platform." );
1315+ }
1316+
12821317 if (scene_state.used_depth_texture || global_surface_data.depth_texture_used ) {
12831318 _render_buffers_ensure_depth_texture (p_render_data);
12841319
12851320 if (scene_state.used_depth_texture ) {
12861321 // Copy depth texture to backbuffer so we can read from it.
1287- _render_buffers_copy_depth_texture (p_render_data, use_msaa);
1322+ _render_buffers_copy_depth_texture (p_render_data, use_msaa && !supports_depth_resolve); // Note, once fallback for has_depth_texture_override works, we also don't need to do our resolve here.
12881323 }
12891324 }
12901325
0 commit comments