43 attachment.tex =
nullptr;
45 attachment.layer = -1;
52 if (attachment.tex !=
nullptr) {
53 reinterpret_cast<Texture *
>(attachment.tex)->detach_from(
this);
57#ifndef GPU_NO_USE_PY_REFERENCES
72 if (new_attachment.
mip == -1) {
78 "GPUFramebuffer: Error: Trying to attach texture to type %d but maximum slot is %d.\n",
84 if (new_attachment.
tex) {
85 if (new_attachment.
layer > 0) {
101 if (attachment.
tex == new_attachment.
tex && attachment.
layer == new_attachment.
layer &&
102 attachment.
mip == new_attachment.
mip)
108 if (attachment.
tex) {
109 reinterpret_cast<Texture *
>(attachment.
tex)->detach_from(
this);
113 if (new_attachment.
tex) {
114 reinterpret_cast<Texture *
>(new_attachment.
tex)->attach_to(
this, type);
120 attachment = new_attachment;
163 const GPULoadStore &depth_action = load_store_actions[0];
201 if (tex !=
nullptr) {
210 void (*callback)(
void *user_data,
int level),
219 for (
int mip_lvl = 1; mip_lvl <= max_lvl; mip_lvl++) {
223 if (tex !=
nullptr) {
231 attachment.mip = mip_lvl;
243 if (tex !=
nullptr) {
250 callback(user_data, mip_lvl);
254 if (attachment.tex !=
nullptr) {
256 reinterpret_cast<Texture *
>(attachment.tex)->mip_range_set(0, max_lvl);
296 const bool enable_srgb =
true;
298 unwrap(
fb)->set_use_explicit_loadstore(
false);
306 const bool enable_srgb =
true;
308 unwrap(
fb)->set_use_explicit_loadstore(
true);
312 unwrap(
fb)->load_store_config_array(load_store_actions, actions_len);
325 const bool enable_srgb =
false;
367 return unwrap(gpu_fb)->check(err_out);
376 unwrap(gpu_fb)->attachment_set(type, attachment);
386 GPUFrameBuffer *
fb, GPUTexture *tex,
int slot,
int layer,
int mip)
393 GPUFrameBuffer *
fb, GPUTexture *tex,
int slot,
int face,
int mip)
413 if (depth_attachment.
mip == -1) {
416 else if (depth_attachment.
tex ==
nullptr) {
425 fb->attachment_set(type, depth_attachment);
430 fb->attachment_set(type, attachment);
437 unwrap(gpu_fb)->default_size_set(width, height);
444 int viewport_rect[4] = {
x,
y, width, height};
445 unwrap(gpu_fb)->viewport_set(viewport_rect);
451 unwrap(gpu_fb)->viewport_multi_set(viewport_rects);
456 unwrap(gpu_fb)->viewport_get(r_viewport);
461 unwrap(gpu_fb)->viewport_reset();
468 const float clear_col[4],
473 "Using GPU_framebuffer_clear_* functions in conjunction with custom load-store "
474 "state via GPU_framebuffer_bind_ex is invalid.");
475 unwrap(gpu_fb)->clear(
buffers, clear_col, clear_depth, clear_stencil);
489 const float clear_col[4],
506 const float clear_col[4],
517 "Using GPU_framebuffer_clear_* functions in conjunction with custom load-store "
518 "state via GPU_framebuffer_bind_ex is invalid.");
519 unwrap(
fb)->clear_multi(clear_colors);
525 "Using GPU_framebuffer_clear_* functions in conjunction with custom load-store "
526 "state via GPU_framebuffer_bind_ex is invalid.");
527 float clear_col[4] = {red, green, blue, alpha};
534 "Using GPU_framebuffer_clear_* functions in conjunction with custom load-store "
535 "state via GPU_framebuffer_bind_ex is invalid.");
536 float clear_col[4] = {0};
543 int rect[4] = {
x,
y,
w, h};
557 int rect[4] = {
x,
y,
w, h};
564 int rect[4] = {
x,
y,
w, h};
571 GPUFrameBuffer *gpu_fb_write,
582 GPUTexture *read_tex, *write_tex;
588 read_tex = fb_read->
color_tex(read_slot);
589 write_tex = fb_write->
color_tex(write_slot);
603 fb_read->
blit_to(blit_buffers, read_slot, fb_write, write_slot, 0, 0);
611 void (*per_level_callback)(
void *user_data,
int level),
614 unwrap(
fb)->recursive_downsample(max_level, per_level_callback, user_data);
617#ifndef GPU_NO_USE_PY_REFERENCES
638#define FRAMEBUFFER_STACK_DEPTH 16
664#undef FRAMEBUFFER_STACK_DEPTH
696 if (framebuffer.fb ==
nullptr) {
697 framebuffer.ctx = ctx;
700 GPU_ATTACHMENT_TEXTURE(ofs->depth),
701 GPU_ATTACHMENT_TEXTURE(ofs->color),
705 if (framebuffer.ctx == ctx) {
706 return framebuffer.fb;
717 "Warning: GPUOffscreen used in more than 3 GPUContext. "
718 "This may create performance drop.\n");
722 framebuffer.fb =
nullptr;
730 bool with_depth_buffer,
740 height =
max_ii(1, height);
748 if (with_depth_buffer) {
755 if ((with_depth_buffer && !ofs->
depth) || !ofs->
color) {
756 const char error[] =
"GPUTexture: Texture allocation failed.";
761 fprintf(stderr,
"%s",
error);
776 float const clear_color[4] = {0.0f, 0.0f, 0.0f, 0.0f};
777 float clear_depth = 0.0f;
779 if (with_depth_buffer) {
794 if (framebuffer.fb) {
798 if (offscreen->
color) {
801 if (offscreen->
depth) {
819 GPUFrameBuffer *
fb =
nullptr;
873 return offscreen->
color;
882 GPUFrameBuffer **r_fb,
883 GPUTexture **r_color,
884 GPUTexture **r_depth)
887 *r_color = offscreen->
color;
888 *r_depth = offscreen->
depth;
#define BLI_assert_msg(a, msg)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
char * STRNCPY(char(&dst)[N], const char *src)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
bool GPU_mip_render_workaround()
@ GPU_LOADACTION_DONT_CARE
@ GPU_STOREACTION_DONT_CARE
void GPU_framebuffer_multi_viewports_set(GPUFrameBuffer *gpu_fb, const int viewport_rects[GPU_MAX_VIEWPORTS][4])
void GPU_framebuffer_read_color(GPUFrameBuffer *fb, int x, int y, int width, int height, int channels, int slot, eGPUDataFormat data_format, void *r_data)
void GPU_framebuffer_viewport_get(GPUFrameBuffer *fb, int r_viewport[4])
void GPU_offscreen_draw_to_screen(GPUOffScreen *offscreen, int x, int y)
const char * GPU_framebuffer_get_name(GPUFrameBuffer *fb)
void GPU_framebuffer_bind_no_srgb(GPUFrameBuffer *fb)
GPUFrameBuffer * GPU_framebuffer_create(const char *name)
GPUFrameBuffer * GPU_framebuffer_active_get()
int GPU_offscreen_width(const GPUOffScreen *offscreen)
bool GPU_framebuffer_check_valid(GPUFrameBuffer *fb, char err_out[256])
void GPU_framebuffer_viewport_set(GPUFrameBuffer *fb, int x, int y, int width, int height)
void GPU_framebuffer_viewport_reset(GPUFrameBuffer *fb)
void GPU_offscreen_bind(GPUOffScreen *offscreen, bool save)
void GPU_offscreen_viewport_data_get(GPUOffScreen *offscreen, GPUFrameBuffer **r_fb, GPUTexture **r_color, GPUTexture **r_depth)
void GPU_framebuffer_texture_cubeface_attach(GPUFrameBuffer *fb, GPUTexture *texture, int slot, int face, int mip)
void GPU_framebuffer_clear_color_depth_stencil(GPUFrameBuffer *fb, const float clear_col[4], float clear_depth, uint clear_stencil)
void GPU_framebuffer_restore()
void GPU_framebuffer_clear_stencil(GPUFrameBuffer *fb, uint clear_stencil)
void GPU_framebuffer_texture_detach(GPUFrameBuffer *fb, GPUTexture *texture)
void GPU_framebuffer_clear_depth_stencil(GPUFrameBuffer *fb, float clear_depth, uint clear_stencil)
static constexpr int GPU_MAX_VIEWPORTS
void GPU_frontbuffer_read_color(int x, int y, int width, int height, int channels, eGPUDataFormat data_format, void *r_data)
void ** GPU_framebuffer_py_reference_get(GPUFrameBuffer *fb)
void GPU_framebuffer_read_depth(GPUFrameBuffer *fb, int x, int y, int width, int height, eGPUDataFormat data_format, void *r_data)
#define GPU_ATTACHMENT_NONE
void GPU_framebuffer_clear_color_depth(GPUFrameBuffer *fb, const float clear_col[4], float clear_depth)
uint GPU_framebuffer_stack_level_get()
void GPU_framebuffer_subpass_transition_array(GPUFrameBuffer *fb, const GPUAttachmentState *attachment_states, uint attachment_len)
#define GPU_ATTACHMENT_TEXTURE_MIP(_texture, _mip)
void GPU_framebuffer_bind_loadstore(GPUFrameBuffer *fb, const GPULoadStore *load_store_actions, uint load_store_actions_len)
int GPU_offscreen_height(const GPUOffScreen *offscreen)
GPUOffScreen * GPU_offscreen_create(int width, int height, bool with_depth_buffer, eGPUTextureFormat format, eGPUTextureUsage usage, bool clear, char err_out[256])
void GPU_framebuffer_py_reference_set(GPUFrameBuffer *fb, void **py_ref)
void GPU_framebuffer_free(GPUFrameBuffer *fb)
void GPU_framebuffer_bind(GPUFrameBuffer *fb)
void GPU_framebuffer_multi_clear(GPUFrameBuffer *fb, const float(*clear_colors)[4])
GPUTexture * GPU_offscreen_color_texture(const GPUOffScreen *offscreen)
void GPU_clear_color(float red, float green, float blue, float alpha)
void GPU_framebuffer_config_array(GPUFrameBuffer *fb, const GPUAttachment *config, int config_len)
void GPU_offscreen_read_color_region(GPUOffScreen *offscreen, eGPUDataFormat data_format, int x, int y, int w, int h, void *r_data)
void GPU_framebuffer_texture_layer_attach(GPUFrameBuffer *fb, GPUTexture *texture, int slot, int layer, int mip)
void GPU_offscreen_free(GPUOffScreen *offscreen)
void GPU_backbuffer_bind(eGPUBackBuffer back_buffer_type)
eGPUTextureFormat GPU_offscreen_format(const GPUOffScreen *offscreen)
void GPU_framebuffer_push(GPUFrameBuffer *fb)
#define NULL_ATTACHMENT_COLOR
void GPU_clear_depth(float depth)
void GPU_framebuffer_default_size(GPUFrameBuffer *fb, int width, int height)
void GPU_framebuffer_recursive_downsample(GPUFrameBuffer *fb, int max_level, void(*per_level_callback)(void *user_data, int level), void *user_data)
void GPU_framebuffer_clear_color(GPUFrameBuffer *fb, const float clear_col[4])
#define GPU_framebuffer_ensure_config(_fb,...)
void GPU_offscreen_read_color(GPUOffScreen *offscreen, eGPUDataFormat data_format, void *r_data)
GPUFrameBuffer * GPU_framebuffer_pop()
#define GPU_ATTACHMENT_TEXTURE_LAYER_MIP(_texture, _layer, _mip)
void GPU_framebuffer_clear(GPUFrameBuffer *fb, eGPUFrameBufferBits buffers, const float clear_col[4], float clear_depth, unsigned int clear_stencil)
void GPU_framebuffer_clear_depth(GPUFrameBuffer *fb, float clear_depth)
bool GPU_framebuffer_bound(GPUFrameBuffer *fb)
GPUFrameBuffer * GPU_framebuffer_back_get()
void GPU_offscreen_unbind(GPUOffScreen *offscreen, bool restore)
#define GPU_ATTACHMENT_TEXTURE_CUBEFACE_MIP(_texture, _face, _mip)
void GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *texture, int slot, int mip)
void GPU_framebuffer_blit(GPUFrameBuffer *fb_read, int read_slot, GPUFrameBuffer *fb_write, int write_slot, eGPUFrameBufferBits blit_buffers)
int GPU_texture_height(const GPUTexture *texture)
GPUTexture * GPU_texture_create_2d(const char *name, int width, int height, int mip_len, eGPUTextureFormat format, eGPUTextureUsage usage, const float *data)
void GPU_texture_free(GPUTexture *texture)
int GPU_texture_width(const GPUTexture *texture)
bool GPU_texture_is_cube(const GPUTexture *texture)
bool GPU_texture_is_array(const GPUTexture *texture)
@ GPU_TEXTURE_USAGE_ATTACHMENT
@ GPU_TEXTURE_USAGE_FORMAT_VIEW
bool GPU_texture_has_stencil_format(const GPUTexture *texture)
bool GPU_texture_has_depth_format(const GPUTexture *texture)
eGPUTextureFormat GPU_texture_format(const GPUTexture *texture)
Read Guarded memory(de)allocation.
BMesh const char void * data
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
constexpr int64_t size() const
void attachment_remove(GPUAttachmentType type)
virtual void subpass_transition_impl(const GPUAttachmentState depth_attachment_state, Span< GPUAttachmentState > color_attachment_states)=0
GPUTexture * depth_tex() const
virtual void attachment_set_loadstore_op(GPUAttachmentType type, GPULoadStore ls)=0
uint get_bits_per_pixel()
virtual void read(eGPUFrameBufferBits planes, eGPUDataFormat format, const int area[4], int channel_len, int slot, void *r_data)=0
void set_color_attachment_bit(GPUAttachmentType type, bool value)
virtual void bind(bool enabled_srgb)=0
char name_[DEBUG_NAME_LEN]
void subpass_transition(const GPUAttachmentState depth_attachment_state, Span< GPUAttachmentState > color_attachment_states)
GPUTexture * color_tex(int slot) const
FrameBuffer(const char *name)
virtual void clear(eGPUFrameBufferBits buffers, const float clear_col[4], float clear_depth, uint clear_stencil)=0
GPUAttachment attachments_[GPU_FB_MAX_ATTACHMENT]
void load_store_config_array(const GPULoadStore *load_store_actions, uint actions_len)
virtual void blit_to(eGPUFrameBufferBits planes, int src_slot, FrameBuffer *dst, int dst_slot, int dst_offset_x, int dst_offset_y)=0
void recursive_downsample(int max_lvl, void(*callback)(void *user_data, int level), void *user_data)
void attachment_set(GPUAttachmentType type, const GPUAttachment &new_attachment)
static GPUBackend * get()
virtual void mip_range_set(int min, int max)=0
eGPUTextureFormat format_get() const
GPUAttachmentType attachment_type(int slot) const
#define FRAMEBUFFER_STACK_DEPTH
static struct @002027377155033132125220001335025233275105143230 FrameBufferStack
GPUFrameBuffer * framebuffers[FRAMEBUFFER_STACK_DEPTH]
static void gpu_framebuffer_texture_attach_ex(GPUFrameBuffer *gpu_fb, GPUAttachment attachment, int slot)
static GPUFrameBuffer * gpu_offscreen_fb_get(GPUOffScreen *ofs)
@ GPU_FB_DEPTH_STENCIL_ATTACHMENT
@ GPU_FB_COLOR_ATTACHMENT0
@ GPU_FB_DEPTH_ATTACHMENT
#define GPU_FB_MAX_COLOR_ATTACHMENT
BLI_INLINE float fb(float length, float L)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
static void error(const char *str)
static void clear(Message &msg)
static Context * unwrap(GPUContext *ctx)
static GPUContext * wrap(Context *ctx)
int to_bytesize(const DataFormat format)
int to_component_len(eGPUTextureFormat format)
static constexpr int MAX_CTX_FB_LEN
struct GPUOffScreen::@141311027145026300165371311333106067022351123333 framebuffers[MAX_CTX_FB_LEN]