@@ -319,6 +319,32 @@ void RendererSceneRenderRD::_process_compositor_effects(RS::CompositorEffectCall
319319 }
320320}
321321
322+ void RendererSceneRenderRD::_render_buffers_ensure_screen_texture (const RenderDataRD *p_render_data) {
323+ Ref<RenderSceneBuffersRD> rb = p_render_data->render_buffers ;
324+ ERR_FAIL_COND (rb.is_null ());
325+
326+ if (!rb->has_internal_texture ()) {
327+ // We're likely rendering reflection probes where we can't use our backbuffers.
328+ return ;
329+ }
330+
331+ bool can_use_storage = _render_buffers_can_be_storage ();
332+ Size2i size = rb->get_internal_size ();
333+
334+ // When upscaling, the blur texture needs to be at the target size for post-processing to work. We prefer to use a
335+ // dedicated backbuffer copy texture instead if the blur texture is not an option so shader effects work correctly.
336+ Size2i target_size = rb->get_target_size ();
337+ bool internal_size_matches = (size.width == target_size.width ) && (size.height == target_size.height );
338+ bool reuse_blur_texture = !rb->has_upscaled_texture () || internal_size_matches;
339+ if (reuse_blur_texture) {
340+ rb->allocate_blur_textures ();
341+ } else {
342+ uint32_t usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT;
343+ usage_bits |= can_use_storage ? RD::TEXTURE_USAGE_STORAGE_BIT : RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT;
344+ rb->create_texture (RB_SCOPE_BUFFERS, RB_TEX_BACK_COLOR, rb->get_base_data_format (), usage_bits);
345+ }
346+ }
347+
322348void RendererSceneRenderRD::_render_buffers_copy_screen_texture (const RenderDataRD *p_render_data) {
323349 Ref<RenderSceneBuffersRD> rb = p_render_data->render_buffers ;
324350 ERR_FAIL_COND (rb.is_null ());
@@ -340,12 +366,8 @@ void RendererSceneRenderRD::_render_buffers_copy_screen_texture(const RenderData
340366 bool internal_size_matches = (size.width == target_size.width ) && (size.height == target_size.height );
341367 bool reuse_blur_texture = !rb->has_upscaled_texture () || internal_size_matches;
342368 if (reuse_blur_texture) {
343- rb->allocate_blur_textures ();
344369 texture_name = RB_TEX_BLUR_0;
345370 } else {
346- uint32_t usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT;
347- usage_bits |= can_use_storage ? RD::TEXTURE_USAGE_STORAGE_BIT : RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT;
348- rb->create_texture (RB_SCOPE_BUFFERS, RB_TEX_BACK_COLOR, rb->get_base_data_format (), usage_bits);
349371 texture_name = RB_TEX_BACK_COLOR;
350372 }
351373
@@ -377,7 +399,7 @@ void RendererSceneRenderRD::_render_buffers_copy_screen_texture(const RenderData
377399 RD::get_singleton ()->draw_command_end_label ();
378400}
379401
380- void RendererSceneRenderRD::_render_buffers_copy_depth_texture (const RenderDataRD *p_render_data) {
402+ void RendererSceneRenderRD::_render_buffers_ensure_depth_texture (const RenderDataRD *p_render_data) {
381403 Ref<RenderSceneBuffersRD> rb = p_render_data->render_buffers ;
382404 ERR_FAIL_COND (rb.is_null ());
383405
@@ -386,14 +408,24 @@ void RendererSceneRenderRD::_render_buffers_copy_depth_texture(const RenderDataR
386408 return ;
387409 }
388410
389- RD::get_singleton ()->draw_command_begin_label (" Copy depth texture" );
390-
391- // note, this only creates our back depth texture if we haven't already created it.
411+ // Note, this only creates our back depth texture if we haven't already created it.
392412 uint32_t usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT;
393413 usage_bits |= RD::TEXTURE_USAGE_CAN_COPY_TO_BIT | RD::TEXTURE_USAGE_STORAGE_BIT;
394- usage_bits |= RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT; // set this as color attachment because we're copying data into it, it's not actually used as a depth buffer
414+ usage_bits |= RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT; // Set this as color attachment because we're copying data into it, it's not actually used as a depth buffer
395415
396416 rb->create_texture (RB_SCOPE_BUFFERS, RB_TEX_BACK_DEPTH, RD::DATA_FORMAT_R32_SFLOAT, usage_bits, RD::TEXTURE_SAMPLES_1);
417+ }
418+
419+ void RendererSceneRenderRD::_render_buffers_copy_depth_texture (const RenderDataRD *p_render_data) {
420+ Ref<RenderSceneBuffersRD> rb = p_render_data->render_buffers ;
421+ ERR_FAIL_COND (rb.is_null ());
422+
423+ if (!rb->has_depth_texture ()) {
424+ // We're likely rendering reflection probes where we can't use our backbuffers.
425+ return ;
426+ }
427+
428+ RD::get_singleton ()->draw_command_begin_label (" Copy depth texture" );
397429
398430 bool can_use_storage = _render_buffers_can_be_storage ();
399431 Size2i size = rb->get_internal_size ();
0 commit comments