From e1f19d14dd4dfef19f19754c1155af6a3d9d3e85 Mon Sep 17 00:00:00 2001 From: Kaleb Reid <78945904+Kaleb-Reid@users.noreply.github.com> Date: Sat, 4 Oct 2025 00:03:58 -0700 Subject: [PATCH] Always use RenderSceneBuffers to manage backbuffer in Compatibility 3D --- drivers/gles3/rasterizer_scene_gles3.cpp | 26 ++------ drivers/gles3/storage/texture_storage.cpp | 80 ----------------------- drivers/gles3/storage/texture_storage.h | 2 - 3 files changed, 6 insertions(+), 102 deletions(-) diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index f82614998ec..3636e533fca 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -2720,26 +2720,12 @@ void RasterizerSceneGLES3::render_scene(const Ref &p_render_ _draw_sky(render_data.environment, projection, transform, sky_energy_multiplier, render_data.luminance_multiplier, p_camera_data->view_count > 1, flip_y, apply_color_adjustments_in_post); } - if (rt && (scene_state.used_screen_texture || scene_state.used_depth_texture)) { - Size2i size; - GLuint backbuffer_fbo = 0; - GLuint backbuffer = 0; - GLuint backbuffer_depth = 0; - - if (rb->get_scaling_3d_mode() == RS::VIEWPORT_SCALING_3D_MODE_OFF) { - texture_storage->check_backbuffer(rt, scene_state.used_screen_texture, scene_state.used_depth_texture); // note, badly names, this just allocates! - - size = rt->size; - backbuffer_fbo = rt->backbuffer_fbo; - backbuffer = rt->backbuffer; - backbuffer_depth = rt->backbuffer_depth; - } else { - rb->check_backbuffer(scene_state.used_screen_texture, scene_state.used_depth_texture); - size = rb->get_internal_size(); - backbuffer_fbo = rb->get_backbuffer_fbo(); - backbuffer = rb->get_backbuffer(); - backbuffer_depth = rb->get_backbuffer_depth(); - } + if (scene_state.used_screen_texture || scene_state.used_depth_texture) { + rb->check_backbuffer(scene_state.used_screen_texture, scene_state.used_depth_texture); + Size2i size = rb->get_internal_size(); + GLuint backbuffer_fbo = rb->get_backbuffer_fbo(); + GLuint backbuffer = rb->get_backbuffer(); + GLuint backbuffer_depth = rb->get_backbuffer_depth(); if (backbuffer_fbo != 0) { glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); diff --git a/drivers/gles3/storage/texture_storage.cpp b/drivers/gles3/storage/texture_storage.cpp index 216e60bd3d2..56bb98278e8 100644 --- a/drivers/gles3/storage/texture_storage.cpp +++ b/drivers/gles3/storage/texture_storage.cpp @@ -2541,87 +2541,7 @@ void TextureStorage::_create_render_target_backbuffer(RenderTarget *rt) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } } -void GLES3::TextureStorage::check_backbuffer(RenderTarget *rt, const bool uses_screen_texture, const bool uses_depth_texture) { - if (rt->backbuffer != 0 && rt->backbuffer_depth != 0) { - return; - } - Config *config = Config::get_singleton(); - bool use_multiview = rt->view_count > 1 && config->multiview_supported; - GLenum texture_target = use_multiview ? GL_TEXTURE_2D_ARRAY : GL_TEXTURE_2D; - if (rt->backbuffer_fbo == 0) { - glGenFramebuffers(1, &rt->backbuffer_fbo); - } - glBindFramebuffer(GL_FRAMEBUFFER, rt->backbuffer_fbo); - if (rt->backbuffer == 0 && uses_screen_texture) { - glGenTextures(1, &rt->backbuffer); - glBindTexture(texture_target, rt->backbuffer); - if (use_multiview) { - glTexImage3D(texture_target, 0, rt->color_internal_format, rt->size.x, rt->size.y, rt->view_count, 0, rt->color_format, rt->color_type, nullptr); - } else { - glTexImage2D(texture_target, 0, rt->color_internal_format, rt->size.x, rt->size.y, 0, rt->color_format, rt->color_type, nullptr); - } - GLES3::Utilities::get_singleton()->texture_allocated_data(rt->backbuffer, rt->size.x * rt->size.y * rt->view_count * rt->color_format_size, "Render target backbuffer color texture (3D)"); - glTexParameteri(texture_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(texture_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -#ifndef IOS_ENABLED - if (use_multiview) { - glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, rt->backbuffer, 0, 0, rt->view_count); - } else { -#else - { -#endif - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, rt->backbuffer, 0); - } - } - if (rt->backbuffer_depth == 0 && uses_depth_texture) { - glGenTextures(1, &rt->backbuffer_depth); - glBindTexture(texture_target, rt->backbuffer_depth); - - GLint internal_format; - GLenum format; - GLenum type; - GLenum attachment; - int element_size; - - if (rt->depth_has_stencil) { - internal_format = GL_DEPTH24_STENCIL8; - format = GL_DEPTH_STENCIL; - type = GL_UNSIGNED_INT_24_8; - attachment = GL_DEPTH_STENCIL_ATTACHMENT; - element_size = 4; - } else { - internal_format = GL_DEPTH_COMPONENT24; - format = GL_DEPTH_COMPONENT; - type = GL_UNSIGNED_INT; - attachment = GL_DEPTH_ATTACHMENT; - element_size = 3; - } - - if (use_multiview) { - glTexImage3D(texture_target, 0, internal_format, rt->size.x, rt->size.y, rt->view_count, 0, format, type, nullptr); - } else { - glTexImage2D(texture_target, 0, internal_format, rt->size.x, rt->size.y, 0, format, type, nullptr); - } - GLES3::Utilities::get_singleton()->texture_allocated_data(rt->backbuffer_depth, rt->size.x * rt->size.y * rt->view_count * element_size, "Render target backbuffer depth texture"); - - glTexParameteri(texture_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(texture_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -#ifndef IOS_ENABLED - if (use_multiview) { - glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, attachment, rt->backbuffer_depth, 0, 0, rt->view_count); - } else { -#else - { -#endif - glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, rt->backbuffer_depth, 0); - } - } -} void TextureStorage::_clear_render_target(RenderTarget *rt) { // there is nothing else to clear when DIRECT_TO_SCREEN is used if (rt->direct_to_screen) { diff --git a/drivers/gles3/storage/texture_storage.h b/drivers/gles3/storage/texture_storage.h index 009ea6d313f..8ec9b3d369c 100644 --- a/drivers/gles3/storage/texture_storage.h +++ b/drivers/gles3/storage/texture_storage.h @@ -643,8 +643,6 @@ public: RenderTarget *get_render_target(RID p_rid) { return render_target_owner.get_or_null(p_rid); } bool owns_render_target(RID p_rid) { return render_target_owner.owns(p_rid); } - void check_backbuffer(RenderTarget *rt, const bool uses_screen_texture, const bool uses_depth_texture); - virtual RID render_target_create() override; virtual void render_target_free(RID p_rid) override;