From 1810b1e4c88191e3578518e12f9f3d318e08dc60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sat, 17 Sep 2022 10:17:38 +0200 Subject: GL: Framebuffer: Add support for empty framebuffer (no attachments) This allows to reduce the memory footprint of very large framebuffers if there is no need for any attachment. --- source/blender/gpu/GPU_framebuffer.h | 6 ++++++ source/blender/gpu/intern/gpu_framebuffer.cc | 5 +++++ source/blender/gpu/intern/gpu_framebuffer_private.hh | 4 ++-- source/blender/gpu/opengl/gl_framebuffer.cc | 5 +++++ source/blender/gpu/opengl/gl_framebuffer.hh | 2 +- 5 files changed, 19 insertions(+), 3 deletions(-) (limited to 'source/blender') diff --git a/source/blender/gpu/GPU_framebuffer.h b/source/blender/gpu/GPU_framebuffer.h index 70ec7c19e7c..bdb384c16f1 100644 --- a/source/blender/gpu/GPU_framebuffer.h +++ b/source/blender/gpu/GPU_framebuffer.h @@ -189,6 +189,12 @@ void GPU_framebuffer_texture_layer_attach( void GPU_framebuffer_texture_cubeface_attach( GPUFrameBuffer *fb, GPUTexture *tex, int slot, int face, int mip); +/** + * Default size is used if the framebuffer contains no attachments. + * It needs to be re-specified each time an attachment is added. + */ +void GPU_framebuffer_default_size(GPUFrameBuffer *gpu_fb, int width, int height); + /* Frame-buffer operations. */ /** diff --git a/source/blender/gpu/intern/gpu_framebuffer.cc b/source/blender/gpu/intern/gpu_framebuffer.cc index 8d93e49d588..4182ce75eac 100644 --- a/source/blender/gpu/intern/gpu_framebuffer.cc +++ b/source/blender/gpu/intern/gpu_framebuffer.cc @@ -368,6 +368,11 @@ void GPU_framebuffer_config_array(GPUFrameBuffer *gpu_fb, } } +void GPU_framebuffer_default_size(GPUFrameBuffer *gpu_fb, int width, int height) +{ + unwrap(gpu_fb)->size_set(width, height); +} + /* ---------- Viewport & Scissor Region ----------- */ void GPU_framebuffer_viewport_set(GPUFrameBuffer *gpu_fb, int x, int y, int width, int height) diff --git a/source/blender/gpu/intern/gpu_framebuffer_private.hh b/source/blender/gpu/intern/gpu_framebuffer_private.hh index 8cecc6b8b15..6e5d9518bfc 100644 --- a/source/blender/gpu/intern/gpu_framebuffer_private.hh +++ b/source/blender/gpu/intern/gpu_framebuffer_private.hh @@ -74,9 +74,9 @@ class FrameBuffer { /** Set of texture attachments to render to. DEPTH and DEPTH_STENCIL are mutually exclusive. */ GPUAttachment attachments_[GPU_FB_MAX_ATTACHMENT]; /** Is true if internal representation need to be updated. */ - bool dirty_attachments_; + bool dirty_attachments_ = true; /** Size of attachment textures. */ - int width_, height_; + int width_ = 0, height_ = 0; /** Debug name. */ char name_[DEBUG_NAME_LEN]; /** Frame-buffer state. */ diff --git a/source/blender/gpu/opengl/gl_framebuffer.cc b/source/blender/gpu/opengl/gl_framebuffer.cc index bd9fba4250d..1ab22a16df4 100644 --- a/source/blender/gpu/opengl/gl_framebuffer.cc +++ b/source/blender/gpu/opengl/gl_framebuffer.cc @@ -207,6 +207,11 @@ void GLFrameBuffer::update_attachments() this->size_set(size[0], size[1]); srgb_ = (GPU_texture_format(attach.tex) == GPU_SRGB8_A8); } + else { + /* Empty frame-buffer. */ + glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, width_); + glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_HEIGHT, height_); + } dirty_attachments_ = false; diff --git a/source/blender/gpu/opengl/gl_framebuffer.hh b/source/blender/gpu/opengl/gl_framebuffer.hh index 8ee04a584bd..edc05322153 100644 --- a/source/blender/gpu/opengl/gl_framebuffer.hh +++ b/source/blender/gpu/opengl/gl_framebuffer.hh @@ -32,7 +32,7 @@ class GLFrameBuffer : public FrameBuffer { /** State Manager of the same contexts. */ GLStateManager *state_manager_ = nullptr; /** Copy of the GL state. Contains ONLY color attachments enums for slot binding. */ - GLenum gl_attachments_[GPU_FB_MAX_COLOR_ATTACHMENT]; + GLenum gl_attachments_[GPU_FB_MAX_COLOR_ATTACHMENT] = {0}; /** Internal frame-buffers are immutable. */ bool immutable_; /** True is the frame-buffer has its first color target using the GPU_SRGB8_A8 format. */ -- cgit v1.2.3