Blender V5.0
gl_framebuffer.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2020 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10
11#pragma once
12
13#include "MEM_guardedalloc.h"
14
16
17namespace blender::gpu {
18
19class GLStateManager;
20
24class GLFrameBuffer : public FrameBuffer {
25 /* For debugging purpose. */
26 friend class GLTexture;
27
28 private:
30 GLuint fbo_id_ = 0;
32 GLContext *context_ = nullptr;
34 GLStateManager *state_manager_ = nullptr;
36 GLenum gl_attachments_[GPU_FB_MAX_COLOR_ATTACHMENT] = {0};
40 bool immutable_ = false;
43 bool srgb_ = false;
45 bool enabled_srgb_ = false;
46
47 public:
51 GLFrameBuffer(const char *name);
52
62 GLFrameBuffer(const char *name, GLContext *ctx, GLenum target, GLuint fbo, int w, int h);
63
65
66 void bind(bool enabled_srgb) override;
67
71 bool check(char err_out[256]) override;
72
74 const float clear_col[4],
75 float clear_depth,
76 uint clear_stencil) override;
77 void clear_multi(const float (*clear_cols)[4]) override;
79 eGPUDataFormat data_format,
80 const void *clear_value) override;
81
82 /* Attachment load-stores are currently no-op's in OpenGL. */
84
85 protected:
86 void subpass_transition_impl(const GPUAttachmentState depth_attachment_state,
87 Span<GPUAttachmentState> color_attachment_states) override;
88
89 public:
90 void read(GPUFrameBufferBits planes,
92 const int area[4],
93 int channel_len,
94 int slot,
95 void *r_data) override;
96
100 void blit_to(GPUFrameBufferBits planes,
101 int src_slot,
102 FrameBuffer *dst,
103 int dst_slot,
104 int dst_offset_x,
105 int dst_offset_y) override;
106
107 void apply_state();
108
109 private:
110 void init();
111 void update_attachments();
112 void update_drawbuffers();
113
114 MEM_CXX_CLASS_ALLOC_FUNCS("GLFrameBuffer");
115};
116
117/* -------------------------------------------------------------------- */
120
121static inline GLenum to_gl(const GPUAttachmentType type)
122{
123#define ATTACHMENT(X) \
124 case GPU_FB_##X: { \
125 return GL_##X; \
126 } \
127 ((void)0)
128
129 switch (type) {
130 ATTACHMENT(DEPTH_ATTACHMENT);
131 ATTACHMENT(DEPTH_STENCIL_ATTACHMENT);
132 ATTACHMENT(COLOR_ATTACHMENT0);
133 ATTACHMENT(COLOR_ATTACHMENT1);
134 ATTACHMENT(COLOR_ATTACHMENT2);
135 ATTACHMENT(COLOR_ATTACHMENT3);
136 ATTACHMENT(COLOR_ATTACHMENT4);
137 ATTACHMENT(COLOR_ATTACHMENT5);
138 ATTACHMENT(COLOR_ATTACHMENT6);
139 ATTACHMENT(COLOR_ATTACHMENT7);
140 default:
141 BLI_assert(0);
142 return GL_COLOR_ATTACHMENT0;
143 }
144#undef ATTACHMENT
145}
146
147static inline GLbitfield to_gl(const GPUFrameBufferBits bits)
148{
149 GLbitfield mask = 0;
150 mask |= (bits & GPU_DEPTH_BIT) ? GL_DEPTH_BUFFER_BIT : 0;
151 mask |= (bits & GPU_STENCIL_BIT) ? GL_STENCIL_BUFFER_BIT : 0;
152 mask |= (bits & GPU_COLOR_BIT) ? GL_COLOR_BUFFER_BIT : 0;
153 return mask;
154}
155
157
158} // namespace blender::gpu
#define BLI_assert(a)
Definition BLI_assert.h:46
unsigned int uint
GPUAttachmentState
GPUFrameBufferBits
@ GPU_DEPTH_BIT
@ GPU_STENCIL_BIT
@ GPU_COLOR_BIT
eGPUDataFormat
Read Guarded memory(de)allocation.
void init()
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Definition btQuadWord.h:119
FrameBuffer(const char *name)
bool check(char err_out[256]) override
void attachment_set_loadstore_op(GPUAttachmentType type, GPULoadStore ls) override
void clear(GPUFrameBufferBits buffers, const float clear_col[4], float clear_depth, uint clear_stencil) override
void blit_to(GPUFrameBufferBits planes, int src_slot, FrameBuffer *dst, int dst_slot, int dst_offset_x, int dst_offset_y) override
void clear_multi(const float(*clear_cols)[4]) override
void subpass_transition_impl(const GPUAttachmentState depth_attachment_state, Span< GPUAttachmentState > color_attachment_states) override
GLFrameBuffer(const char *name)
void bind(bool enabled_srgb) override
void clear_attachment(GPUAttachmentType type, eGPUDataFormat data_format, const void *clear_value) override
#define ATTACHMENT(X)
@ GPU_FB_MAX_ATTACHMENT
#define GPU_FB_MAX_COLOR_ATTACHMENT
format
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
static GLenum to_gl(const GPUAttachmentType type)
const char * name
char * buffers[2]