@@ -315,6 +315,32 @@ void RendererSceneRenderRD::_process_compositor_effects(RS::CompositorEffectCall
315315 }
316316}
317317
318+ void RendererSceneRenderRD::_render_buffers_ensure_screen_texture (const RenderDataRD *p_render_data) {
319+ Ref<RenderSceneBuffersRD> rb = p_render_data->render_buffers ;
320+ ERR_FAIL_COND (rb.is_null ());
321+
322+ if (!rb->has_internal_texture ()) {
323+ // We're likely rendering reflection probes where we can't use our backbuffers.
324+ return ;
325+ }
326+
327+ bool can_use_storage = _render_buffers_can_be_storage ();
328+ Size2i size = rb->get_internal_size ();
329+
330+ // When upscaling, the blur texture needs to be at the target size for post-processing to work. We prefer to use a
331+ // dedicated backbuffer copy texture instead if the blur texture is not an option so shader effects work correctly.
332+ Size2i target_size = rb->get_target_size ();
333+ bool internal_size_matches = (size.width == target_size.width ) && (size.height == target_size.height );
334+ bool reuse_blur_texture = !rb->has_upscaled_texture () || internal_size_matches;
335+ if (reuse_blur_texture) {
336+ rb->allocate_blur_textures ();
337+ } else {
338+ uint32_t usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT;
339+ usage_bits |= can_use_storage ? RD::TEXTURE_USAGE_STORAGE_BIT : RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT;
340+ rb->create_texture (RB_SCOPE_BUFFERS, RB_TEX_BACK_COLOR, rb->get_base_data_format (), usage_bits);
341+ }
342+ }
343+
318344void RendererSceneRenderRD::_render_buffers_copy_screen_texture (const RenderDataRD *p_render_data) {
319345 Ref<RenderSceneBuffersRD> rb = p_render_data->render_buffers ;
320346 ERR_FAIL_COND (rb.is_null ());
@@ -336,12 +362,8 @@ void RendererSceneRenderRD::_render_buffers_copy_screen_texture(const RenderData
336362 bool internal_size_matches = (size.width == target_size.width ) && (size.height == target_size.height );
337363 bool reuse_blur_texture = !rb->has_upscaled_texture () || internal_size_matches;
338364 if (reuse_blur_texture) {
339- rb->allocate_blur_textures ();
340365 texture_name = RB_TEX_BLUR_0;
341366 } 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);
345367 texture_name = RB_TEX_BACK_COLOR;
346368 }
347369
@@ -373,7 +395,7 @@ void RendererSceneRenderRD::_render_buffers_copy_screen_texture(const RenderData
373395 RD::get_singleton ()->draw_command_end_label ();
374396}
375397
376- void RendererSceneRenderRD::_render_buffers_copy_depth_texture (const RenderDataRD *p_render_data) {
398+ void RendererSceneRenderRD::_render_buffers_ensure_depth_texture (const RenderDataRD *p_render_data) {
377399 Ref<RenderSceneBuffersRD> rb = p_render_data->render_buffers ;
378400 ERR_FAIL_COND (rb.is_null ());
379401
@@ -382,14 +404,24 @@ void RendererSceneRenderRD::_render_buffers_copy_depth_texture(const RenderDataR
382404 return ;
383405 }
384406
385- RD::get_singleton ()->draw_command_begin_label (" Copy depth texture" );
386-
387- // note, this only creates our back depth texture if we haven't already created it.
407+ // Note, this only creates our back depth texture if we haven't already created it.
388408 uint32_t usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT;
389409 usage_bits |= RD::TEXTURE_USAGE_CAN_COPY_TO_BIT | RD::TEXTURE_USAGE_STORAGE_BIT;
390- 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
410+ 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
391411
392412 rb->create_texture (RB_SCOPE_BUFFERS, RB_TEX_BACK_DEPTH, RD::DATA_FORMAT_R32_SFLOAT, usage_bits, RD::TEXTURE_SAMPLES_1);
413+ }
414+
415+ void RendererSceneRenderRD::_render_buffers_copy_depth_texture (const RenderDataRD *p_render_data) {
416+ Ref<RenderSceneBuffersRD> rb = p_render_data->render_buffers ;
417+ ERR_FAIL_COND (rb.is_null ());
418+
419+ if (!rb->has_depth_texture ()) {
420+ // We're likely rendering reflection probes where we can't use our backbuffers.
421+ return ;
422+ }
423+
424+ RD::get_singleton ()->draw_command_begin_label (" Copy depth texture" );
393425
394426 bool can_use_storage = _render_buffers_can_be_storage ();
395427 Size2i size = rb->get_internal_size ();
0 commit comments