Blender  V3.3
gl_texture.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 
8 #pragma once
9 
10 #include "MEM_guardedalloc.h"
11 
12 #include "BLI_assert.h"
13 
14 #include "gpu_texture_private.hh"
15 
16 #include "glew-mx.h"
17 
18 struct GPUFrameBuffer;
19 
20 namespace blender {
21 namespace gpu {
22 
23 class GLTexture : public Texture {
24  friend class GLStateManager;
25  friend class GLFrameBuffer;
26 
27  private:
29  static GLuint samplers_[GPU_SAMPLER_MAX];
30 
32  GLenum target_ = -1;
34  GLuint tex_id_ = 0;
36  struct GPUFrameBuffer *framebuffer_ = nullptr;
38  /* TODO(fclem): How do we ensure thread safety here? */
39  bool is_bound_ = false;
41  bool has_pixels_ = false;
42 
43  public:
44  GLTexture(const char *name);
45  ~GLTexture();
46 
47  void update_sub(
48  int mip, int offset[3], int extent[3], eGPUDataFormat type, const void *data) override;
49 
56  void generate_mipmap() override;
57  void copy_to(Texture *dst) override;
58  void clear(eGPUDataFormat format, const void *data) override;
59  void swizzle_set(const char swizzle_mask[4]) override;
60  void stencil_texture_mode_set(bool use_stencil) override;
61  void mip_range_set(int min, int max) override;
62  void *read(int mip, eGPUDataFormat type) override;
63 
64  void check_feedback_loop();
65 
66  /* TODO(fclem): Legacy. Should be removed at some point. */
67  uint gl_bindcode_get() const override;
68 
69  static void samplers_init();
70  static void samplers_free();
71  static void samplers_update();
72 
73  protected:
75  bool init_internal() override;
77  bool init_internal(GPUVertBuf *vbo) override;
79  bool init_internal(const GPUTexture *src, int mip_offset, int layer_offset) override;
80 
81  private:
82  bool proxy_check(int mip);
83  void update_sub_direct_state_access(
84  int mip, int offset[3], int extent[3], GLenum gl_format, GLenum gl_type, const void *data);
85  GPUFrameBuffer *framebuffer_get();
86 
87  MEM_CXX_CLASS_ALLOC_FUNCS("GLTexture")
88 };
89 
91 {
92  /* You can add any of the available type to this list
93  * For available types see GPU_texture.h */
94  switch (format) {
95  /* Formats texture & renderbuffer */
96  case GPU_RGBA8UI:
97  return GL_RGBA8UI;
98  case GPU_RGBA8I:
99  return GL_RGBA8I;
100  case GPU_RGBA8:
101  return GL_RGBA8;
102  case GPU_RGBA32UI:
103  return GL_RGBA32UI;
104  case GPU_RGBA32I:
105  return GL_RGBA32I;
106  case GPU_RGBA32F:
107  return GL_RGBA32F;
108  case GPU_RGBA16UI:
109  return GL_RGBA16UI;
110  case GPU_RGBA16I:
111  return GL_RGBA16I;
112  case GPU_RGBA16F:
113  return GL_RGBA16F;
114  case GPU_RGBA16:
115  return GL_RGBA16;
116  case GPU_RG8UI:
117  return GL_RG8UI;
118  case GPU_RG8I:
119  return GL_RG8I;
120  case GPU_RG8:
121  return GL_RG8;
122  case GPU_RG32UI:
123  return GL_RG32UI;
124  case GPU_RG32I:
125  return GL_RG32I;
126  case GPU_RG32F:
127  return GL_RG32F;
128  case GPU_RG16UI:
129  return GL_RG16UI;
130  case GPU_RG16I:
131  return GL_RG16I;
132  case GPU_RG16F:
133  return GL_RG16F;
134  case GPU_RG16:
135  return GL_RG16;
136  case GPU_R8UI:
137  return GL_R8UI;
138  case GPU_R8I:
139  return GL_R8I;
140  case GPU_R8:
141  return GL_R8;
142  case GPU_R32UI:
143  return GL_R32UI;
144  case GPU_R32I:
145  return GL_R32I;
146  case GPU_R32F:
147  return GL_R32F;
148  case GPU_R16UI:
149  return GL_R16UI;
150  case GPU_R16I:
151  return GL_R16I;
152  case GPU_R16F:
153  return GL_R16F;
154  case GPU_R16:
155  return GL_R16;
156  /* Special formats texture & renderbuffer */
157  case GPU_RGB10_A2:
158  return GL_RGB10_A2;
159  case GPU_R11F_G11F_B10F:
160  return GL_R11F_G11F_B10F;
162  return GL_DEPTH32F_STENCIL8;
164  return GL_DEPTH24_STENCIL8;
165  case GPU_SRGB8_A8:
166  return GL_SRGB8_ALPHA8;
167  /* Texture only format */
168  case GPU_RGB16F:
169  return GL_RGB16F;
170  /* Special formats texture only */
171  case GPU_SRGB8_A8_DXT1:
172  return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
173  case GPU_SRGB8_A8_DXT3:
174  return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
175  case GPU_SRGB8_A8_DXT5:
176  return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
177  case GPU_RGBA8_DXT1:
178  return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
179  case GPU_RGBA8_DXT3:
180  return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
181  case GPU_RGBA8_DXT5:
182  return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
183  /* Depth Formats */
185  return GL_DEPTH_COMPONENT32F;
187  return GL_DEPTH_COMPONENT24;
189  return GL_DEPTH_COMPONENT16;
190  default:
191  BLI_assert_msg(0, "Texture format incorrect or unsupported");
192  return 0;
193  }
194 }
195 
197 {
198  switch (type) {
199  case GPU_TEXTURE_1D:
200  return GL_TEXTURE_1D;
202  return GL_TEXTURE_1D_ARRAY;
203  case GPU_TEXTURE_2D:
204  return GL_TEXTURE_2D;
206  return GL_TEXTURE_2D_ARRAY;
207  case GPU_TEXTURE_3D:
208  return GL_TEXTURE_3D;
209  case GPU_TEXTURE_CUBE:
210  return GL_TEXTURE_CUBE_MAP;
212  return GL_TEXTURE_CUBE_MAP_ARRAY_ARB;
213  case GPU_TEXTURE_BUFFER:
214  return GL_TEXTURE_BUFFER;
215  default:
216  BLI_assert(0);
217  return GL_TEXTURE_1D;
218  }
219 }
220 
222 {
223  switch (type) {
224  case GPU_TEXTURE_1D:
225  return GL_PROXY_TEXTURE_1D;
227  return GL_PROXY_TEXTURE_1D_ARRAY;
228  case GPU_TEXTURE_2D:
229  return GL_PROXY_TEXTURE_2D;
231  return GL_PROXY_TEXTURE_2D_ARRAY;
232  case GPU_TEXTURE_3D:
233  return GL_PROXY_TEXTURE_3D;
234  case GPU_TEXTURE_CUBE:
235  return GL_PROXY_TEXTURE_CUBE_MAP;
237  return GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB;
238  case GPU_TEXTURE_BUFFER:
239  default:
240  BLI_assert(0);
241  return GL_TEXTURE_1D;
242  }
243 }
244 
245 inline GLenum swizzle_to_gl(const char swizzle)
246 {
247  switch (swizzle) {
248  default:
249  case 'x':
250  case 'r':
251  return GL_RED;
252  case 'y':
253  case 'g':
254  return GL_GREEN;
255  case 'z':
256  case 'b':
257  return GL_BLUE;
258  case 'w':
259  case 'a':
260  return GL_ALPHA;
261  case '0':
262  return GL_ZERO;
263  case '1':
264  return GL_ONE;
265  }
266 }
267 
269 {
270  switch (format) {
271  case GPU_DATA_FLOAT:
272  return GL_FLOAT;
273  case GPU_DATA_INT:
274  return GL_INT;
275  case GPU_DATA_UINT:
276  return GL_UNSIGNED_INT;
277  case GPU_DATA_UBYTE:
278  return GL_UNSIGNED_BYTE;
279  case GPU_DATA_UINT_24_8:
280  return GL_UNSIGNED_INT_24_8;
282  return GL_UNSIGNED_INT_2_10_10_10_REV;
284  return GL_UNSIGNED_INT_10F_11F_11F_REV;
285  default:
286  BLI_assert_msg(0, "Unhandled data format");
287  return GL_FLOAT;
288  }
289 }
290 
295 {
296  /* You can add any of the available type to this list
297  * For available types see GPU_texture.h */
298  switch (format) {
299  case GPU_R8I:
300  case GPU_R8UI:
301  case GPU_R16I:
302  case GPU_R16UI:
303  case GPU_R32I:
304  case GPU_R32UI:
305  return GL_RED_INTEGER;
306  case GPU_RG8I:
307  case GPU_RG8UI:
308  case GPU_RG16I:
309  case GPU_RG16UI:
310  case GPU_RG32I:
311  case GPU_RG32UI:
312  return GL_RG_INTEGER;
313  case GPU_RGBA8I:
314  case GPU_RGBA8UI:
315  case GPU_RGBA16I:
316  case GPU_RGBA16UI:
317  case GPU_RGBA32I:
318  case GPU_RGBA32UI:
319  return GL_RGBA_INTEGER;
320  case GPU_R8:
321  case GPU_R16:
322  case GPU_R16F:
323  case GPU_R32F:
324  return GL_RED;
325  case GPU_RG8:
326  case GPU_RG16:
327  case GPU_RG16F:
328  case GPU_RG32F:
329  return GL_RG;
330  case GPU_R11F_G11F_B10F:
331  case GPU_RGB16F:
332  return GL_RGB;
333  case GPU_RGBA8:
334  case GPU_SRGB8_A8:
335  case GPU_RGBA16:
336  case GPU_RGBA16F:
337  case GPU_RGBA32F:
338  case GPU_RGB10_A2:
339  return GL_RGBA;
342  return GL_DEPTH_STENCIL;
346  return GL_DEPTH_COMPONENT;
347  case GPU_SRGB8_A8_DXT1:
348  return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
349  case GPU_SRGB8_A8_DXT3:
350  return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
351  case GPU_SRGB8_A8_DXT5:
352  return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
353  case GPU_RGBA8_DXT1:
354  return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
355  case GPU_RGBA8_DXT3:
356  return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
357  case GPU_RGBA8_DXT5:
358  return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
359  default:
360  BLI_assert_msg(0, "Texture format incorrect or unsupported\n");
361  return 0;
362  }
363 }
364 
368 inline GLenum channel_len_to_gl(int channel_len)
369 {
370  switch (channel_len) {
371  case 1:
372  return GL_RED;
373  case 2:
374  return GL_RG;
375  case 3:
376  return GL_RGB;
377  case 4:
378  return GL_RGBA;
379  default:
380  BLI_assert_msg(0, "Wrong number of texture channels");
381  return GL_RED;
382  }
383 }
384 
385 } // namespace gpu
386 } // namespace blender
#define BLI_assert(a)
Definition: BLI_assert.h:46
#define BLI_assert_msg(a, msg)
Definition: BLI_assert.h:53
unsigned int uint
Definition: BLI_sys_types.h:67
struct GPUFrameBuffer GPUFrameBuffer
_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
struct GPUTexture GPUTexture
Definition: GPU_texture.h:17
eGPUDataFormat
Definition: GPU_texture.h:170
@ GPU_DATA_UINT_24_8
Definition: GPU_texture.h:175
@ GPU_DATA_INT
Definition: GPU_texture.h:172
@ GPU_DATA_10_11_11_REV
Definition: GPU_texture.h:176
@ GPU_DATA_UBYTE
Definition: GPU_texture.h:174
@ GPU_DATA_UINT
Definition: GPU_texture.h:173
@ GPU_DATA_2_10_10_10_REV
Definition: GPU_texture.h:177
@ GPU_DATA_FLOAT
Definition: GPU_texture.h:171
static const int GPU_SAMPLER_MAX
Definition: GPU_texture.h:52
eGPUTextureFormat
Definition: GPU_texture.h:83
@ GPU_R16UI
Definition: GPU_texture.h:111
@ GPU_RG16F
Definition: GPU_texture.h:103
@ GPU_DEPTH32F_STENCIL8
Definition: GPU_texture.h:119
@ GPU_R16I
Definition: GPU_texture.h:112
@ GPU_SRGB8_A8
Definition: GPU_texture.h:121
@ GPU_DEPTH24_STENCIL8
Definition: GPU_texture.h:120
@ GPU_RGB10_A2
Definition: GPU_texture.h:117
@ GPU_R32I
Definition: GPU_texture.h:109
@ GPU_RG8UI
Definition: GPU_texture.h:95
@ GPU_R16F
Definition: GPU_texture.h:113
@ GPU_SRGB8_A8_DXT5
Definition: GPU_texture.h:151
@ GPU_RG8I
Definition: GPU_texture.h:96
@ GPU_RG16I
Definition: GPU_texture.h:102
@ GPU_RG32UI
Definition: GPU_texture.h:98
@ GPU_RGBA32F
Definition: GPU_texture.h:90
@ GPU_RG8
Definition: GPU_texture.h:97
@ GPU_RG32I
Definition: GPU_texture.h:99
@ GPU_SRGB8_A8_DXT1
Definition: GPU_texture.h:149
@ GPU_RG16
Definition: GPU_texture.h:104
@ GPU_RGBA32UI
Definition: GPU_texture.h:88
@ GPU_R8I
Definition: GPU_texture.h:106
@ GPU_R16
Definition: GPU_texture.h:114
@ GPU_RG16UI
Definition: GPU_texture.h:101
@ GPU_RGBA8I
Definition: GPU_texture.h:86
@ GPU_RGBA8_DXT1
Definition: GPU_texture.h:152
@ GPU_RGBA8UI
Definition: GPU_texture.h:85
@ GPU_RGBA16UI
Definition: GPU_texture.h:91
@ GPU_RGBA16I
Definition: GPU_texture.h:92
@ GPU_R8UI
Definition: GPU_texture.h:105
@ GPU_RGBA16
Definition: GPU_texture.h:94
@ GPU_SRGB8_A8_DXT3
Definition: GPU_texture.h:150
@ GPU_RGBA8_DXT3
Definition: GPU_texture.h:153
@ GPU_RG32F
Definition: GPU_texture.h:100
@ GPU_R8
Definition: GPU_texture.h:107
@ GPU_DEPTH_COMPONENT24
Definition: GPU_texture.h:166
@ GPU_RGB16F
Definition: GPU_texture.h:127
@ GPU_R32UI
Definition: GPU_texture.h:108
@ GPU_RGBA32I
Definition: GPU_texture.h:89
@ GPU_RGBA8_DXT5
Definition: GPU_texture.h:154
@ GPU_DEPTH_COMPONENT32F
Definition: GPU_texture.h:165
@ GPU_DEPTH_COMPONENT16
Definition: GPU_texture.h:167
@ GPU_R11F_G11F_B10F
Definition: GPU_texture.h:118
@ GPU_RGBA8
Definition: GPU_texture.h:87
struct GPUVertBuf GPUVertBuf
Read Guarded memory(de)allocation.
GLTexture(const char *name)
Definition: gl_texture.cc:27
void copy_to(Texture *dst) override
Definition: gl_texture.cc:371
void swizzle_set(const char swizzle_mask[4]) override
Definition: gl_texture.cc:445
bool init_internal() override
Definition: gl_texture.cc:47
void clear(eGPUDataFormat format, const void *data) override
Definition: gl_texture.cc:347
static void samplers_free()
Definition: gl_texture.cc:586
uint gl_bindcode_get() const override
Definition: gl_texture.cc:736
void * read(int mip, eGPUDataFormat type) override
Definition: gl_texture.cc:399
static void samplers_update()
Definition: gl_texture.cc:567
static void samplers_init()
Definition: gl_texture.cc:511
void mip_range_set(int min, int max) override
Definition: gl_texture.cc:473
void stencil_texture_mode_set(bool use_stencil) override
Definition: gl_texture.cc:460
void generate_mipmap() override
Definition: gl_texture.cc:311
void update_sub(int mip, int offset[3], int extent[3], eGPUDataFormat type, const void *data) override
Definition: gl_texture.cc:242
SyclQueue void void * src
depth_tx normal_tx diffuse_light_tx specular_light_tx volume_light_tx environment_tx ambient_occlusion_tx aov_value_tx in_weight_img GPU_RGBA16F
depth_tx normal_tx diffuse_light_tx specular_light_tx volume_light_tx environment_tx ambient_occlusion_tx aov_value_tx GPU_R32F
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
format
Definition: logImageCore.h:38
GLenum to_gl_target(eGPUTextureType type)
Definition: gl_texture.hh:196
GLenum to_gl_internal_format(eGPUTextureFormat format)
Definition: gl_texture.hh:90
GLenum to_gl_proxy(eGPUTextureType type)
Definition: gl_texture.hh:221
GLenum to_gl_data_format(eGPUTextureFormat format)
Definition: gl_texture.hh:294
GLenum swizzle_to_gl(const char swizzle)
Definition: gl_texture.hh:245
GLenum channel_len_to_gl(int channel_len)
Definition: gl_texture.hh:368
static GLenum to_gl(const GPUAttachmentType type)
#define min(a, b)
Definition: sort.c:35
float max