diff options
Diffstat (limited to 'source/blender/gpu/intern/gpu_framebuffer.cc')
-rw-r--r-- | source/blender/gpu/intern/gpu_framebuffer.cc | 62 |
1 files changed, 60 insertions, 2 deletions
diff --git a/source/blender/gpu/intern/gpu_framebuffer.cc b/source/blender/gpu/intern/gpu_framebuffer.cc index fb3c9549f18..8d93e49d588 100644 --- a/source/blender/gpu/intern/gpu_framebuffer.cc +++ b/source/blender/gpu/intern/gpu_framebuffer.cc @@ -7,7 +7,6 @@ #include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" #include "BLI_math_base.h" #include "BLI_utildefines.h" @@ -18,7 +17,6 @@ #include "gpu_backend.hh" #include "gpu_context_private.hh" -#include "gpu_private.h" #include "gpu_texture_private.hh" #include "gpu_framebuffer_private.hh" @@ -126,6 +124,43 @@ void FrameBuffer::attachment_remove(GPUAttachmentType type) dirty_attachments_ = true; } +void FrameBuffer::load_store_config_array(const GPULoadStore *load_store_actions, uint actions_len) +{ + /* Follows attachment structure of GPU_framebuffer_config_array/GPU_framebuffer_ensure_config */ + const GPULoadStore &depth_action = load_store_actions[0]; + Span<GPULoadStore> color_attachments(load_store_actions + 1, actions_len - 1); + + if (this->attachments_[GPU_FB_DEPTH_STENCIL_ATTACHMENT].tex) { + this->attachment_set_loadstore_op( + GPU_FB_DEPTH_STENCIL_ATTACHMENT, depth_action.load_action, depth_action.store_action); + } + if (this->attachments_[GPU_FB_DEPTH_ATTACHMENT].tex) { + this->attachment_set_loadstore_op( + GPU_FB_DEPTH_ATTACHMENT, depth_action.load_action, depth_action.store_action); + } + + GPUAttachmentType type = GPU_FB_COLOR_ATTACHMENT0; + for (const GPULoadStore &actions : color_attachments) { + if (this->attachments_[type].tex) { + this->attachment_set_loadstore_op(type, actions.load_action, actions.store_action); + } + ++type; + } +} + +unsigned int FrameBuffer::get_bits_per_pixel() +{ + unsigned int total_bits = 0; + for (GPUAttachment &attachment : attachments_) { + Texture *tex = reinterpret_cast<Texture *>(attachment.tex); + if (tex != nullptr) { + int bits = to_bytesize(tex->format_get()) * to_component_len(tex->format_get()); + total_bits += bits; + } + } + return total_bits; +} + void FrameBuffer::recursive_downsample(int max_lvl, void (*callback)(void *userData, int level), void *userData) @@ -151,10 +186,21 @@ void FrameBuffer::recursive_downsample(int max_lvl, attachment.mip = mip_lvl; } } + /* Update the internal attachments and viewport size. */ dirty_attachments_ = true; this->bind(true); + /* Optimize load-store state. */ + GPUAttachmentType type = GPU_FB_DEPTH_ATTACHMENT; + for (GPUAttachment &attachment : attachments_) { + Texture *tex = reinterpret_cast<Texture *>(attachment.tex); + if (tex != nullptr) { + this->attachment_set_loadstore_op(type, GPU_LOADACTION_DONT_CARE, GPU_STOREACTION_STORE); + } + ++type; + } + callback(userData, mip_lvl); } @@ -200,6 +246,18 @@ void GPU_framebuffer_bind(GPUFrameBuffer *gpu_fb) unwrap(gpu_fb)->bind(enable_srgb); } +void GPU_framebuffer_bind_loadstore(GPUFrameBuffer *gpu_fb, + const GPULoadStore *load_store_actions, + uint actions_len) +{ + /* Bind */ + GPU_framebuffer_bind(gpu_fb); + + /* Update load store */ + FrameBuffer *fb = unwrap(gpu_fb); + fb->load_store_config_array(load_store_actions, actions_len); +} + void GPU_framebuffer_bind_no_srgb(GPUFrameBuffer *gpu_fb) { const bool enable_srgb = false; |