Merge pull request #111303 from Kaleb-Reid/fix-dof-msaa-mobile

Use resolved depth texture for DOF with MSAA in Mobile
This commit is contained in:
Thaddeus Crews 2025-10-06 09:06:38 -05:00
commit f85dc0720d
No known key found for this signature in database
GPG key ID: 8C6E5FEB5FC03CCC
3 changed files with 9 additions and 4 deletions

View file

@ -936,6 +936,11 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
using_subpass_post_process = false; using_subpass_post_process = false;
} }
if (use_msaa && p_render_data->environment.is_valid() && RSG::camera_attributes->camera_attributes_uses_dof(p_render_data->camera_attributes)) {
// Need to resolve depth texture for DOF when using MSAA.
scene_state.used_depth_texture = true;
}
if (scene_state.used_screen_texture || scene_state.used_depth_texture) { if (scene_state.used_screen_texture || scene_state.used_depth_texture) {
// can't use our last two subpasses because we're reading from screen texture or depth texture // can't use our last two subpasses because we're reading from screen texture or depth texture
merge_transparent_pass = false; merge_transparent_pass = false;
@ -1311,7 +1316,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
// If we need extra effects we do this in its own pass // If we need extra effects we do this in its own pass
RENDER_TIMESTAMP("Tonemap"); RENDER_TIMESTAMP("Tonemap");
_render_buffers_post_process_and_tonemap(p_render_data); _render_buffers_post_process_and_tonemap(p_render_data, use_msaa);
RD::get_singleton()->draw_command_end_label(); // Post process pass RD::get_singleton()->draw_command_end_label(); // Post process pass
} }

View file

@ -446,7 +446,7 @@ void RendererSceneRenderRD::_render_buffers_copy_depth_texture(const RenderDataR
RD::get_singleton()->draw_command_end_label(); RD::get_singleton()->draw_command_end_label();
} }
void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const RenderDataRD *p_render_data) { void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const RenderDataRD *p_render_data, bool p_use_msaa) {
RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
ERR_FAIL_NULL(p_render_data); ERR_FAIL_NULL(p_render_data);
@ -530,7 +530,7 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
for (uint32_t i = 0; i < rb->get_view_count(); i++) { for (uint32_t i = 0; i < rb->get_view_count(); i++) {
buffers.base_texture = use_upscaled_texture ? rb->get_upscaled_texture(i) : rb->get_internal_texture(i); buffers.base_texture = use_upscaled_texture ? rb->get_upscaled_texture(i) : rb->get_internal_texture(i);
buffers.depth_texture = rb->get_depth_texture(i); buffers.depth_texture = p_use_msaa ? rb->get_texture_slice(RB_SCOPE_BUFFERS, RB_TEX_BACK_DEPTH, i, 0) : rb->get_depth_texture(i);
buffers.base_fb = FramebufferCacheRD::get_singleton()->get_cache(buffers.base_texture); // TODO move this into bokeh_dof_raster, we can do this internally buffers.base_fb = FramebufferCacheRD::get_singleton()->get_cache(buffers.base_texture); // TODO move this into bokeh_dof_raster, we can do this internally
// In stereo p_render_data->z_near and p_render_data->z_far can be offset for our combined frustum. // In stereo p_render_data->z_near and p_render_data->z_far can be offset for our combined frustum.

View file

@ -111,7 +111,7 @@ protected:
void _render_buffers_copy_screen_texture(const RenderDataRD *p_render_data); void _render_buffers_copy_screen_texture(const RenderDataRD *p_render_data);
void _render_buffers_ensure_depth_texture(const RenderDataRD *p_render_data); void _render_buffers_ensure_depth_texture(const RenderDataRD *p_render_data);
void _render_buffers_copy_depth_texture(const RenderDataRD *p_render_data, bool p_use_msaa = false); void _render_buffers_copy_depth_texture(const RenderDataRD *p_render_data, bool p_use_msaa = false);
void _render_buffers_post_process_and_tonemap(const RenderDataRD *p_render_data); void _render_buffers_post_process_and_tonemap(const RenderDataRD *p_render_data, bool p_use_msaa = false);
void _post_process_subpass(RID p_source_texture, RID p_framebuffer, const RenderDataRD *p_render_data); void _post_process_subpass(RID p_source_texture, RID p_framebuffer, const RenderDataRD *p_render_data);
void _disable_clear_request(const RenderDataRD *p_render_data); void _disable_clear_request(const RenderDataRD *p_render_data);