Blender  V3.3
gl_state.hh
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2020 Blender Foundation. */
3 
8 #pragma once
9 
10 #include "MEM_guardedalloc.h"
11 
12 #include "BLI_utildefines.h"
13 
14 #include "gpu_state_private.hh"
15 
16 #include "glew-mx.h"
17 
18 namespace blender {
19 namespace gpu {
20 
21 class GLFrameBuffer;
22 class GLTexture;
23 
28 class GLStateManager : public StateManager {
29  public:
32 
33  private:
35  GPUState current_;
36  GPUStateMutable current_mutable_;
38  float line_width_range_[2];
39 
47  GLuint targets_[64] = {GL_TEXTURE_2D};
48  GLuint textures_[64] = {0};
49  GLuint samplers_[64] = {0};
50  uint64_t dirty_texture_binds_ = 0;
51 
52  GLuint images_[8] = {0};
53  GLenum formats_[8] = {0};
54  uint8_t dirty_image_binds_ = 0;
55 
56  public:
58 
59  void apply_state() override;
63  void force_state() override;
64 
65  void issue_barrier(eGPUBarrier barrier_bits) override;
66 
67  void texture_bind(Texture *tex, eGPUSamplerState sampler, int unit) override;
72  void texture_unbind(Texture *tex) override;
73  void texture_unbind_all() override;
74 
75  void image_bind(Texture *tex, int unit) override;
76  void image_unbind(Texture *tex) override;
77  void image_unbind_all() override;
78 
79  void texture_unpack_row_length_set(uint len) override;
80 
83 
84  private:
85  static void set_write_mask(eGPUWriteMask value);
86  static void set_depth_test(eGPUDepthTest value);
87  static void set_stencil_test(eGPUStencilTest test, eGPUStencilOp operation);
88  static void set_stencil_mask(eGPUStencilTest test, const GPUStateMutable state);
89  static void set_clip_distances(int new_dist_len, int old_dist_len);
90  static void set_logic_op(bool enable);
91  static void set_facing(bool invert);
92  static void set_backface_culling(eGPUFaceCullTest test);
93  static void set_provoking_vert(eGPUProvokingVertex vert);
94  static void set_shadow_bias(bool enable);
95  static void set_blend(eGPUBlend value);
96 
97  void set_state(const GPUState &state);
98  void set_mutable_state(const GPUStateMutable &state);
99 
100  void texture_bind_apply();
101  void image_bind_apply();
102 
103  MEM_CXX_CLASS_ALLOC_FUNCS("GLStateManager")
104 };
105 
106 static inline GLbitfield to_gl(eGPUBarrier barrier_bits)
107 {
108  GLbitfield barrier = 0;
109  if (barrier_bits & GPU_BARRIER_SHADER_IMAGE_ACCESS) {
110  barrier |= GL_SHADER_IMAGE_ACCESS_BARRIER_BIT;
111  }
112  if (barrier_bits & GPU_BARRIER_SHADER_STORAGE) {
113  barrier |= GL_SHADER_STORAGE_BARRIER_BIT;
114  }
115  if (barrier_bits & GPU_BARRIER_TEXTURE_FETCH) {
116  barrier |= GL_TEXTURE_FETCH_BARRIER_BIT;
117  }
118  if (barrier_bits & GPU_BARRIER_TEXTURE_UPDATE) {
119  barrier |= GL_TEXTURE_UPDATE_BARRIER_BIT;
120  }
121  if (barrier_bits & GPU_BARRIER_COMMAND) {
122  barrier |= GL_COMMAND_BARRIER_BIT;
123  }
124  if (barrier_bits & GPU_BARRIER_FRAMEBUFFER) {
125  barrier |= GL_FRAMEBUFFER_BARRIER_BIT;
126  }
127  if (barrier_bits & GPU_BARRIER_VERTEX_ATTRIB_ARRAY) {
128  barrier |= GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT;
129  }
130  if (barrier_bits & GPU_BARRIER_ELEMENT_ARRAY) {
131  barrier |= GL_ELEMENT_ARRAY_BARRIER_BIT;
132  }
133  return barrier;
134 }
135 
136 } // namespace gpu
137 } // namespace blender
unsigned int uint
Definition: BLI_sys_types.h:67
eGPUBlend
Definition: GPU_state.h:59
eGPUWriteMask
Definition: GPU_state.h:11
eGPUProvokingVertex
Definition: GPU_state.h:113
eGPUFaceCullTest
Definition: GPU_state.h:107
eGPUBarrier
Definition: GPU_state.h:24
@ GPU_BARRIER_COMMAND
Definition: GPU_state.h:26
@ GPU_BARRIER_SHADER_STORAGE
Definition: GPU_state.h:29
@ GPU_BARRIER_TEXTURE_FETCH
Definition: GPU_state.h:30
@ GPU_BARRIER_ELEMENT_ARRAY
Definition: GPU_state.h:33
@ GPU_BARRIER_SHADER_IMAGE_ACCESS
Definition: GPU_state.h:28
@ GPU_BARRIER_VERTEX_ATTRIB_ARRAY
Definition: GPU_state.h:32
@ GPU_BARRIER_TEXTURE_UPDATE
Definition: GPU_state.h:31
@ GPU_BARRIER_FRAMEBUFFER
Definition: GPU_state.h:27
eGPUStencilOp
Definition: GPU_state.h:99
eGPUDepthTest
Definition: GPU_state.h:82
eGPUStencilTest
Definition: GPU_state.h:92
eGPUSamplerState
Definition: GPU_texture.h:25
Read Guarded memory(de)allocation.
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Texture
void texture_bind_temp(GLTexture *tex)
Definition: gl_state.cc:466
GLFrameBuffer * active_fb
Definition: gl_state.hh:31
void image_unbind(Texture *tex) override
Definition: gl_state.cc:570
void image_bind(Texture *tex, int unit) override
Definition: gl_state.cc:556
void apply_state() override
Definition: gl_state.cc:57
void texture_unpack_row_length_set(uint len) override
Definition: gl_state.cc:534
void issue_barrier(eGPUBarrier barrier_bits) override
Definition: gl_state.cc:639
void texture_unbind_all() override
Definition: gl_state.cc:495
void texture_bind(Texture *tex, eGPUSamplerState sampler, int unit) override
Definition: gl_state.cc:447
void force_state() override
Definition: gl_state.cc:69
void image_unbind_all() override
Definition: gl_state.cc:587
void texture_unbind(Texture *tex) override
Definition: gl_state.cc:477
int len
Definition: draw_manager.c:108
depth_tx sampler(1, ImageType::FLOAT_2D, "combined_tx") .sampler(2
CCL_NAMESPACE_BEGIN ccl_device float invert(float color, float factor)
Definition: invert.h:8
static GLenum to_gl(const GPUAttachmentType type)
unsigned char uint8_t
Definition: stdint.h:78
unsigned __int64 uint64_t
Definition: stdint.h:90