Blender  V3.3
gl_framebuffer.hh
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2020 Blender Foundation. All rights reserved. */
3 
10 #pragma once
11 
12 #include "MEM_guardedalloc.h"
13 
14 #include "glew-mx.h"
15 
17 
18 namespace blender::gpu {
19 
20 class GLStateManager;
21 
25 class GLFrameBuffer : public FrameBuffer {
26  /* For debugging purpose. */
27  friend class GLTexture;
28 
29  private:
31  GLuint fbo_id_ = 0;
33  GLContext *context_ = nullptr;
35  GLStateManager *state_manager_ = nullptr;
37  GLenum gl_attachments_[GPU_FB_MAX_COLOR_ATTACHMENT];
39  bool immutable_;
41  bool srgb_;
43  bool enabled_srgb_ = false;
44 
45  public:
49  GLFrameBuffer(const char *name);
50 
60  GLFrameBuffer(const char *name, GLContext *ctx, GLenum target, GLuint fbo, int w, int h);
61 
63 
64  void bind(bool enabled_srgb) override;
65 
69  bool check(char err_out[256]) override;
70 
71  void clear(eGPUFrameBufferBits buffers,
72  const float clear_col[4],
73  float clear_depth,
74  uint clear_stencil) override;
75  void clear_multi(const float (*clear_cols)[4]) override;
77  eGPUDataFormat data_format,
78  const void *clear_value) override;
79 
80  /* Attachment load-stores are currently no-op's in OpenGL. */
82  eGPULoadOp /*load_action*/,
83  eGPUStoreOp /*store_action*/) override{};
84 
85  void read(eGPUFrameBufferBits planes,
87  const int area[4],
88  int channel_len,
89  int slot,
90  void *r_data) override;
91 
95  void blit_to(eGPUFrameBufferBits planes,
96  int src_slot,
97  FrameBuffer *dst,
98  int dst_slot,
99  int dst_offset_x,
100  int dst_offset_y) override;
101 
102  void apply_state();
103 
104  private:
105  void init();
106  void update_attachments();
107  void update_drawbuffers();
108 
109  MEM_CXX_CLASS_ALLOC_FUNCS("GLFrameBuffer");
110 };
111 
112 /* -------------------------------------------------------------------- */
116 static inline GLenum to_gl(const GPUAttachmentType type)
117 {
118 #define ATTACHMENT(X) \
119  case GPU_FB_##X: { \
120  return GL_##X; \
121  } \
122  ((void)0)
123 
124  switch (type) {
125  ATTACHMENT(DEPTH_ATTACHMENT);
126  ATTACHMENT(DEPTH_STENCIL_ATTACHMENT);
127  ATTACHMENT(COLOR_ATTACHMENT0);
128  ATTACHMENT(COLOR_ATTACHMENT1);
129  ATTACHMENT(COLOR_ATTACHMENT2);
130  ATTACHMENT(COLOR_ATTACHMENT3);
131  ATTACHMENT(COLOR_ATTACHMENT4);
132  ATTACHMENT(COLOR_ATTACHMENT5);
133  ATTACHMENT(COLOR_ATTACHMENT6);
134  ATTACHMENT(COLOR_ATTACHMENT7);
135  default:
136  BLI_assert(0);
137  return GL_COLOR_ATTACHMENT0;
138  }
139 #undef ATTACHMENT
140 }
141 
142 static inline GLbitfield to_gl(const eGPUFrameBufferBits bits)
143 {
144  GLbitfield mask = 0;
145  mask |= (bits & GPU_DEPTH_BIT) ? GL_DEPTH_BUFFER_BIT : 0;
146  mask |= (bits & GPU_STENCIL_BIT) ? GL_STENCIL_BUFFER_BIT : 0;
147  mask |= (bits & GPU_COLOR_BIT) ? GL_COLOR_BUFFER_BIT : 0;
148  return mask;
149 }
150 
153 } // namespace blender::gpu
#define BLI_assert(a)
Definition: BLI_assert.h:46
unsigned int uint
Definition: BLI_sys_types.h:67
eGPULoadOp
eGPUStoreOp
eGPUFrameBufferBits
@ GPU_DEPTH_BIT
@ GPU_STENCIL_BIT
@ GPU_COLOR_BIT
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
eGPUDataFormat
Definition: GPU_texture.h:170
Read Guarded memory(de)allocation.
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 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
GLFrameBuffer(const char *name)
void bind(bool enabled_srgb) override
void attachment_set_loadstore_op(GPUAttachmentType, eGPULoadOp, eGPUStoreOp) 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)
#define GPU_FB_MAX_COLOR_ATTACHMENT
format
Definition: logImageCore.h:38
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)
Definition: math_float4.h:513
static void area(int d1, int d2, int e1, int e2, float weights[2])
static GLenum to_gl(const GPUAttachmentType type)