Blender V4.3
gl_state.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
9#pragma once
10
11#include "MEM_guardedalloc.h"
12
13#include "BLI_utildefines.h"
14
15#include "gpu_state_private.hh"
16
17#include <epoxy/gl.h>
18
19namespace blender {
20namespace gpu {
21
22class GLFrameBuffer;
23class GLTexture;
24
30 public:
33
34 private:
36 GPUState current_;
37 GPUStateMutable current_mutable_;
39 float line_width_range_[2];
40
49 GLuint targets_[64] = {GL_TEXTURE_2D};
50 GLuint textures_[64] = {0};
51 GLuint samplers_[64] = {0};
52 uint64_t dirty_texture_binds_ = 0;
53
54 GLuint images_[8] = {0};
55 GLenum formats_[8] = {0};
56 uint8_t dirty_image_binds_ = 0;
57
58 public:
60
61 void apply_state() override;
65 void force_state() override;
66
67 void issue_barrier(eGPUBarrier barrier_bits) override;
68
69 void texture_bind(Texture *tex, GPUSamplerState sampler, int unit) override;
73 void texture_bind_temp(GLTexture *tex);
74 void texture_unbind(Texture *tex) override;
75 void texture_unbind_all() override;
76
77 void image_bind(Texture *tex, int unit) override;
78 void image_unbind(Texture *tex) override;
79 void image_unbind_all() override;
80
82
85
86 private:
87 static void set_write_mask(eGPUWriteMask value);
88 static void set_depth_test(eGPUDepthTest value);
89 static void set_stencil_test(eGPUStencilTest test, eGPUStencilOp operation);
90 static void set_stencil_mask(eGPUStencilTest test, const GPUStateMutable &state);
91 static void set_clip_distances(int new_dist_len, int old_dist_len);
92 static void set_logic_op(bool enable);
93 static void set_facing(bool invert);
94 static void set_backface_culling(eGPUFaceCullTest test);
95 static void set_provoking_vert(eGPUProvokingVertex vert);
96 static void set_shadow_bias(bool enable);
97 static void set_blend(eGPUBlend value);
98
99 void set_state(const GPUState &state);
100 void set_mutable_state(const GPUStateMutable &state);
101
102 void texture_bind_apply();
103 void image_bind_apply();
104
105 MEM_CXX_CLASS_ALLOC_FUNCS("GLStateManager")
106};
107
108/* Fence synchronization primitive. */
109class GLFence : public Fence {
110 private:
111 GLsync gl_sync_ = 0;
112
113 public:
114 GLFence() : Fence(){};
115 ~GLFence();
116
117 void signal() override;
118 void wait() override;
119
120 MEM_CXX_CLASS_ALLOC_FUNCS("GLFence")
121};
122
123static inline GLbitfield to_gl(eGPUBarrier barrier_bits)
124{
125 GLbitfield barrier = 0;
126 if (barrier_bits & GPU_BARRIER_SHADER_IMAGE_ACCESS) {
127 barrier |= GL_SHADER_IMAGE_ACCESS_BARRIER_BIT;
128 }
129 if (barrier_bits & GPU_BARRIER_SHADER_STORAGE) {
130 barrier |= GL_SHADER_STORAGE_BARRIER_BIT;
131 }
132 if (barrier_bits & GPU_BARRIER_TEXTURE_FETCH) {
133 barrier |= GL_TEXTURE_FETCH_BARRIER_BIT;
134 }
135 if (barrier_bits & GPU_BARRIER_TEXTURE_UPDATE) {
136 barrier |= GL_TEXTURE_UPDATE_BARRIER_BIT;
137 }
138 if (barrier_bits & GPU_BARRIER_COMMAND) {
139 barrier |= GL_COMMAND_BARRIER_BIT;
140 }
141 if (barrier_bits & GPU_BARRIER_FRAMEBUFFER) {
142 barrier |= GL_FRAMEBUFFER_BARRIER_BIT;
143 }
144 if (barrier_bits & GPU_BARRIER_VERTEX_ATTRIB_ARRAY) {
145 barrier |= GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT;
146 }
147 if (barrier_bits & GPU_BARRIER_ELEMENT_ARRAY) {
148 barrier |= GL_ELEMENT_ARRAY_BARRIER_BIT;
149 }
150 if (barrier_bits & GPU_BARRIER_UNIFORM) {
151 barrier |= GL_UNIFORM_BARRIER_BIT;
152 }
153 if (barrier_bits & GPU_BARRIER_BUFFER_UPDATE) {
154 barrier |= GL_BUFFER_UPDATE_BARRIER_BIT;
155 }
156 return barrier;
157}
158
159} // namespace gpu
160} // namespace blender
unsigned int uint
eGPUBlend
Definition GPU_state.hh:84
eGPUWriteMask
Definition GPU_state.hh:16
eGPUProvokingVertex
Definition GPU_state.hh:138
eGPUFaceCullTest
Definition GPU_state.hh:132
eGPUBarrier
Definition GPU_state.hh:29
@ GPU_BARRIER_COMMAND
Definition GPU_state.hh:46
@ GPU_BARRIER_SHADER_STORAGE
Definition GPU_state.hh:48
@ GPU_BARRIER_TEXTURE_FETCH
Definition GPU_state.hh:37
@ GPU_BARRIER_BUFFER_UPDATE
Definition GPU_state.hh:56
@ GPU_BARRIER_ELEMENT_ARRAY
Definition GPU_state.hh:52
@ GPU_BARRIER_UNIFORM
Definition GPU_state.hh:54
@ GPU_BARRIER_SHADER_IMAGE_ACCESS
Definition GPU_state.hh:35
@ GPU_BARRIER_VERTEX_ATTRIB_ARRAY
Definition GPU_state.hh:50
@ GPU_BARRIER_TEXTURE_UPDATE
Definition GPU_state.hh:39
@ GPU_BARRIER_FRAMEBUFFER
Definition GPU_state.hh:33
eGPUStencilOp
Definition GPU_state.hh:124
eGPUDepthTest
Definition GPU_state.hh:107
eGPUStencilTest
Definition GPU_state.hh:117
Read Guarded memory(de)allocation.
void signal() override
Definition gl_state.cc:651
void wait() override
Definition gl_state.cc:662
void texture_bind_temp(GLTexture *tex)
Definition gl_state.cc:465
GLFrameBuffer * active_fb
Definition gl_state.hh:32
void image_unbind(Texture *tex) override
Definition gl_state.cc:569
void image_bind(Texture *tex, int unit) override
Definition gl_state.cc:555
void apply_state() override
Definition gl_state.cc:54
void texture_unpack_row_length_set(uint len) override
Definition gl_state.cc:533
void issue_barrier(eGPUBarrier barrier_bits) override
Definition gl_state.cc:638
void texture_unbind_all() override
Definition gl_state.cc:494
void force_state() override
Definition gl_state.cc:66
void texture_bind(Texture *tex, GPUSamplerState sampler, int unit) override
Definition gl_state.cc:445
void image_unbind_all() override
Definition gl_state.cc:586
void texture_unbind(Texture *tex) override
Definition gl_state.cc:476
local_group_size(16, 16) .push_constant(Type local_group_size(16, 16) .push_constant(Type input_tx sampler(1, ImageType::FLOAT_2D, "matte_tx") .image(0
int len
CCL_NAMESPACE_BEGIN ccl_device float invert(float color, float factor)
Definition invert.h:9
static GLenum to_gl(const GPUAttachmentType type)
unsigned char uint8_t
Definition stdint.h:78
unsigned __int64 uint64_t
Definition stdint.h:90