mirror of
https://github.com/godotengine/godot.git
synced 2025-10-19 16:03:29 +00:00
Always use RenderSceneBuffers to manage backbuffer in Compatibility 3D
This commit is contained in:
parent
06827c91c6
commit
e1f19d14dd
3 changed files with 6 additions and 102 deletions
|
@ -2720,26 +2720,12 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue