Blender V4.3
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
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;
42 bool srgb_ = false;
44 bool enabled_srgb_ = false;
45
46 public:
50 GLFrameBuffer(const char *name);
51
61 GLFrameBuffer(const char *name, GLContext *ctx, GLenum target, GLuint fbo, int w, int h);
62
64
65 void bind(bool enabled_srgb) override;
66
70 bool check(char err_out[256]) override;
71
73 const float clear_col[4],
74 float clear_depth,
75 uint clear_stencil) override;
76 void clear_multi(const float (*clear_cols)[4]) override;
78 eGPUDataFormat data_format,
79 const void *clear_value) override;
80
81 /* Attachment load-stores are currently no-op's in OpenGL. */
83
84 protected:
85 void subpass_transition_impl(const GPUAttachmentState depth_attachment_state,
86 Span<GPUAttachmentState> color_attachment_states) override;
87
88 public:
89 void read(eGPUFrameBufferBits planes,
91 const int area[4],
92 int channel_len,
93 int slot,
94 void *r_data) override;
95
99 void blit_to(eGPUFrameBufferBits planes,
100 int src_slot,
101 FrameBuffer *dst,
102 int dst_slot,
103 int dst_offset_x,
104 int dst_offset_y) override;
105
106 void apply_state();
107
108 private:
109 void init();
110 void update_attachments();
111 void update_drawbuffers();
112
113 MEM_CXX_CLASS_ALLOC_FUNCS("GLFrameBuffer");
114};
115
116/* -------------------------------------------------------------------- */
120static inline GLenum to_gl(const GPUAttachmentType type)
121{
122#define ATTACHMENT(X) \
123 case GPU_FB_##X: { \
124 return GL_##X; \
125 } \
126 ((void)0)
127
128 switch (type) {
129 ATTACHMENT(DEPTH_ATTACHMENT);
130 ATTACHMENT(DEPTH_STENCIL_ATTACHMENT);
131 ATTACHMENT(COLOR_ATTACHMENT0);
132 ATTACHMENT(COLOR_ATTACHMENT1);
133 ATTACHMENT(COLOR_ATTACHMENT2);
134 ATTACHMENT(COLOR_ATTACHMENT3);
135 ATTACHMENT(COLOR_ATTACHMENT4);
136 ATTACHMENT(COLOR_ATTACHMENT5);
137 ATTACHMENT(COLOR_ATTACHMENT6);
138 ATTACHMENT(COLOR_ATTACHMENT7);
139 default:
140 BLI_assert(0);
141 return GL_COLOR_ATTACHMENT0;
142 }
143#undef ATTACHMENT
144}
145
146static inline GLbitfield to_gl(const eGPUFrameBufferBits bits)
147{
148 GLbitfield mask = 0;
149 mask |= (bits & GPU_DEPTH_BIT) ? GL_DEPTH_BUFFER_BIT : 0;
150 mask |= (bits & GPU_STENCIL_BIT) ? GL_STENCIL_BUFFER_BIT : 0;
151 mask |= (bits & GPU_COLOR_BIT) ? GL_COLOR_BUFFER_BIT : 0;
152 return mask;
153}
154
157} // namespace blender::gpu
#define BLI_assert(a)
Definition BLI_assert.h:50
unsigned int uint
GPUAttachmentState
eGPUFrameBufferBits
@ 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
void clear(eGPUFrameBufferBits buffers, const float clear_col[4], float clear_depth, uint clear_stencil) override
bool check(char err_out[256]) override
void attachment_set_loadstore_op(GPUAttachmentType type, GPULoadStore ls) override
void read(eGPUFrameBufferBits planes, eGPUDataFormat format, const int area[4], int channel_len, int slot, void *r_data) 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
void blit_to(eGPUFrameBufferBits planes, int src_slot, FrameBuffer *dst, int dst_slot, int dst_offset_x, int dst_offset_y) override
#define ATTACHMENT(X)
@ GPU_FB_MAX_ATTACHMENT
#define GPU_FB_MAX_COLOR_ATTACHMENT
format
ccl_device_inline float4 mask(const int4 mask, const float4 a)
static GLenum to_gl(const GPUAttachmentType type)
char * buffers[2]