Blender V4.5
GPU_framebuffer.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2005 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
24
25#pragma once
26
27#include "GPU_common_types.hh"
28#include "GPU_texture.hh"
29
30struct GPUTexture;
31
33 GPU_COLOR_BIT = (1 << 0),
34 GPU_DEPTH_BIT = (1 << 1),
35 GPU_STENCIL_BIT = (1 << 2),
36};
37
39
40/* Guaranteed by the spec and is never greater than 16 on any hardware or implementation. */
41constexpr static int GPU_MAX_VIEWPORTS = 16;
42
44 GPUTexture *tex;
45 int layer, mip;
46};
47
49struct GPUFrameBuffer;
50
51/* -------------------------------------------------------------------- */
54
59GPUFrameBuffer *GPU_framebuffer_create(const char *name);
60
65GPUFrameBuffer *GPU_framebuffer_active_get();
66
71GPUFrameBuffer *GPU_framebuffer_back_get();
72
74
75/* -------------------------------------------------------------------- */
78
83void GPU_framebuffer_free(GPUFrameBuffer *fb);
84
85#define GPU_FRAMEBUFFER_FREE_SAFE(fb) \
86 do { \
87 if (fb != nullptr) { \
88 GPU_framebuffer_free(fb); \
89 fb = nullptr; \
90 } \
91 } while (0)
92
94
95/* -------------------------------------------------------------------- */
98
105
110void GPU_backbuffer_bind(eGPUBackBuffer back_buffer_type);
111
115void GPU_framebuffer_bind(GPUFrameBuffer *fb);
116
120void GPU_framebuffer_bind_no_srgb(GPUFrameBuffer *fb);
121
127
129
130/* -------------------------------------------------------------------- */
133
139
140/* Empty bind point. */
141#define NULL_ATTACHMENT_COLOR \
142 { \
143 0.0, 0.0, 0.0, 0.0 \
144 }
145#define NULL_LOAD_STORE \
146 { \
147 GPU_LOADACTION_DONT_CARE, GPU_STOREACTION_DONT_CARE, NULL_ATTACHMENT_COLOR \
148 }
149
177void GPU_framebuffer_bind_loadstore(GPUFrameBuffer *fb,
178 const GPULoadStore *load_store_actions,
179 uint load_store_actions_len);
180#define GPU_framebuffer_bind_ex(_fb, ...) \
181 { \
182 GPULoadStore actions[] = __VA_ARGS__; \
183 GPU_framebuffer_bind_loadstore(_fb, actions, (sizeof(actions) / sizeof(GPULoadStore))); \
184 }
185
208 const GPUAttachmentState *attachment_states,
209 uint attachment_len);
210
211#define GPU_framebuffer_subpass_transition(_fb, ...) \
212 { \
213 GPUAttachmentState actions[] = __VA_ARGS__; \
214 GPU_framebuffer_subpass_transition_array( \
215 _fb, actions, (sizeof(actions) / sizeof(GPUAttachmentState))); \
216 }
217
219
220/* -------------------------------------------------------------------- */
223
243#define GPU_framebuffer_ensure_config(_fb, ...) \
244 do { \
245 if (*(_fb) == nullptr) { \
246 *(_fb) = GPU_framebuffer_create(#_fb); \
247 } \
248 GPUAttachment config[] = __VA_ARGS__; \
249 GPU_framebuffer_config_array(*(_fb), config, (sizeof(config) / sizeof(GPUAttachment))); \
250 } while (0)
251
258void GPU_framebuffer_config_array(GPUFrameBuffer *fb, const GPUAttachment *config, int config_len);
259
261#define GPU_ATTACHMENT_NONE \
262 { \
263 nullptr, -1, 0, \
264 }
265
266#define GPU_ATTACHMENT_LEAVE \
267 { \
268 nullptr, -1, -1, \
269 }
270
271#define GPU_ATTACHMENT_TEXTURE(_texture) \
272 { \
273 _texture, -1, 0, \
274 }
275
276#define GPU_ATTACHMENT_TEXTURE_MIP(_texture, _mip) \
277 { \
278 _texture, -1, _mip, \
279 }
280
281#define GPU_ATTACHMENT_TEXTURE_LAYER(_texture, _layer) \
282 { \
283 _texture, _layer, 0, \
284 }
285
286#define GPU_ATTACHMENT_TEXTURE_LAYER_MIP(_texture, _layer, _mip) \
287 { \
288 _texture, _layer, _mip, \
289 }
290
292
294#define GPU_ATTACHMENT_TEXTURE_CUBEFACE(_texture, _face) \
295 { \
296 _texture, _face, 0, \
297 }
298
299#define GPU_ATTACHMENT_TEXTURE_CUBEFACE_MIP(_texture, _face, _mip) \
300 { \
301 _texture, _face, _mip, \
302 }
303
312void GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *texture, int slot, int mip);
313
324 GPUFrameBuffer *fb, GPUTexture *texture, int slot, int layer, int mip);
325
336 GPUFrameBuffer *fb, GPUTexture *texture, int slot, int face, int mip);
337
344void GPU_framebuffer_texture_detach(GPUFrameBuffer *fb, GPUTexture *texture);
345
353bool GPU_framebuffer_check_valid(GPUFrameBuffer *fb, char err_out[256]);
354
356
357/* -------------------------------------------------------------------- */
364
369void GPU_framebuffer_default_size(GPUFrameBuffer *fb, int width, int height);
370
372
373/* -------------------------------------------------------------------- */
376
386void GPU_framebuffer_viewport_set(GPUFrameBuffer *fb, int x, int y, int width, int height);
387
396void GPU_framebuffer_multi_viewports_set(GPUFrameBuffer *gpu_fb,
397 const int viewport_rects[GPU_MAX_VIEWPORTS][4]);
398
403void GPU_framebuffer_viewport_get(GPUFrameBuffer *fb, int r_viewport[4]);
404
409void GPU_framebuffer_viewport_reset(GPUFrameBuffer *fb);
410
412
413/* -------------------------------------------------------------------- */
416
429void GPU_framebuffer_clear(GPUFrameBuffer *fb,
431 const float clear_col[4],
432 float clear_depth,
433 unsigned int clear_stencil);
434
440void GPU_framebuffer_clear_color(GPUFrameBuffer *fb, const float clear_col[4]);
441
447void GPU_framebuffer_clear_depth(GPUFrameBuffer *fb, float clear_depth);
448
454void GPU_framebuffer_clear_stencil(GPUFrameBuffer *fb, uint clear_stencil);
455
462void GPU_framebuffer_clear_color_depth(GPUFrameBuffer *fb,
463 const float clear_col[4],
464 float clear_depth);
465
472void GPU_framebuffer_clear_depth_stencil(GPUFrameBuffer *fb,
473 float clear_depth,
474 uint clear_stencil);
482 const float clear_col[4],
483 float clear_depth,
484 uint clear_stencil);
485
492void GPU_framebuffer_multi_clear(GPUFrameBuffer *fb, const float (*clear_colors)[4]);
493
501void GPU_clear_color(float red, float green, float blue, float alpha);
502
509void GPU_clear_depth(float depth);
510
512
513/* -------------------------------------------------------------------- */
516
517const char *GPU_framebuffer_get_name(GPUFrameBuffer *fb);
518
520
521/* -------------------------------------------------------------------- */
527
532#ifndef GPU_NO_USE_PY_REFERENCES
533void **GPU_framebuffer_py_reference_get(GPUFrameBuffer *fb);
534void GPU_framebuffer_py_reference_set(GPUFrameBuffer *fb, void **py_ref);
535#endif
536
542/* TODO(fclem): This has nothing to do with the GPU module and should be move to the pyGPU module.
543 */
544void GPU_framebuffer_push(GPUFrameBuffer *fb);
545GPUFrameBuffer *GPU_framebuffer_pop();
547
549
550/* -------------------------------------------------------------------- */
553
559bool GPU_framebuffer_bound(GPUFrameBuffer *fb);
560
566void GPU_framebuffer_read_depth(GPUFrameBuffer *fb,
567 int x,
568 int y,
569 int width,
570 int height,
571 eGPUDataFormat data_format,
572 void *r_data);
573
579void GPU_framebuffer_read_color(GPUFrameBuffer *fb,
580 int x,
581 int y,
582 int width,
583 int height,
584 int channels,
585 int slot,
586 eGPUDataFormat data_format,
587 void *r_data);
588
597 int x, int y, int width, int height, int channels, eGPUDataFormat data_format, void *r_data);
598
607void GPU_framebuffer_blit(GPUFrameBuffer *fb_read,
608 int read_slot,
609 GPUFrameBuffer *fb_write,
610 int write_slot,
611 eGPUFrameBufferBits blit_buffers);
612
622void GPU_framebuffer_recursive_downsample(GPUFrameBuffer *fb,
623 int max_level,
624 void (*per_level_callback)(void *user_data, int level),
625 void *user_data);
626
628
629/* -------------------------------------------------------------------- */
636
637struct GPUOffScreen;
638
649 int height,
650 bool with_depth_buffer,
652 eGPUTextureUsage usage,
653 bool clear,
654 char err_out[256]);
655
659void GPU_offscreen_free(GPUOffScreen *offscreen);
660
665/* TODO(fclem): Remove the `save` parameter and always save/restore. */
666void GPU_offscreen_bind(GPUOffScreen *offscreen, bool save);
667
673/* TODO(fclem): Remove the `save` parameter and always save/restore. */
674void GPU_offscreen_unbind(GPUOffScreen *offscreen, bool restore);
675
682void GPU_offscreen_read_color(GPUOffScreen *offscreen, eGPUDataFormat data_format, void *r_data);
687 GPUOffScreen *offscreen, eGPUDataFormat data_format, int x, int y, int w, int h, void *r_data);
688
692void GPU_offscreen_draw_to_screen(GPUOffScreen *offscreen, int x, int y);
693
697int GPU_offscreen_width(const GPUOffScreen *offscreen);
698
702int GPU_offscreen_height(const GPUOffScreen *offscreen);
703
708GPUTexture *GPU_offscreen_color_texture(const GPUOffScreen *offscreen);
709
714
720 GPUFrameBuffer **r_fb,
721 GPUTexture **r_color,
722 GPUTexture **r_depth);
723
unsigned int uint
#define ENUM_OPERATORS(_type, _max)
eGPUStoreOp
GPUAttachmentState
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()
eGPUFrameBufferBits
@ GPU_DEPTH_BIT
@ GPU_STENCIL_BIT
@ GPU_COLOR_BIT
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)
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)
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)
eGPUBackBuffer
@ GPU_BACKBUFFER_LEFT
@ GPU_BACKBUFFER_RIGHT
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)
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])
void GPU_offscreen_read_color(GPUOffScreen *offscreen, eGPUDataFormat data_format, void *r_data)
GPUFrameBuffer * GPU_framebuffer_pop()
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)
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)
eGPUDataFormat
eGPUTextureUsage
eGPUTextureFormat
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Definition btQuadWord.h:119
TEX_TEMPLATE DataVec texture(T, FltCoord, float=0.0f) RET
BLI_INLINE float fb(float length, float L)
format
static void clear(Message &msg)
Definition msgfmt.cc:213
GPUTexture * tex
eGPULoadOp load_action
eGPUStoreOp store_action
char * buffers[2]