Blender V4.5
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
8
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_clip_control(bool enable);
98 static void set_blend(eGPUBlend value);
99
100 void set_state(const GPUState &state);
101 void set_mutable_state(const GPUStateMutable &state);
102
103 void texture_bind_apply();
104 void image_bind_apply();
105
106 MEM_CXX_CLASS_ALLOC_FUNCS("GLStateManager")
107};
108
109/* Fence synchronization primitive. */
110class GLFence : public Fence {
111 private:
112 GLsync gl_sync_ = 0;
113
114 public:
115 GLFence() : Fence(){};
116 ~GLFence();
117
118 void signal() override;
119 void wait() override;
120
121 MEM_CXX_CLASS_ALLOC_FUNCS("GLFence")
122};
123
124static inline GLbitfield to_gl(eGPUBarrier barrier_bits)
125{
126 GLbitfield barrier = 0;
127 if (barrier_bits & GPU_BARRIER_SHADER_IMAGE_ACCESS) {
128 barrier |= GL_SHADER_IMAGE_ACCESS_BARRIER_BIT;
129 }
130 if (barrier_bits & GPU_BARRIER_SHADER_STORAGE) {
131 barrier |= GL_SHADER_STORAGE_BARRIER_BIT;
132 }
133 if (barrier_bits & GPU_BARRIER_TEXTURE_FETCH) {
134 barrier |= GL_TEXTURE_FETCH_BARRIER_BIT;
135 }
136 if (barrier_bits & GPU_BARRIER_TEXTURE_UPDATE) {
137 barrier |= GL_TEXTURE_UPDATE_BARRIER_BIT;
138 }
139 if (barrier_bits & GPU_BARRIER_COMMAND) {
140 barrier |= GL_COMMAND_BARRIER_BIT;
141 }
142 if (barrier_bits & GPU_BARRIER_FRAMEBUFFER) {
143 barrier |= GL_FRAMEBUFFER_BARRIER_BIT;
144 }
145 if (barrier_bits & GPU_BARRIER_VERTEX_ATTRIB_ARRAY) {
146 barrier |= GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT;
147 }
148 if (barrier_bits & GPU_BARRIER_ELEMENT_ARRAY) {
149 barrier |= GL_ELEMENT_ARRAY_BARRIER_BIT;
150 }
151 if (barrier_bits & GPU_BARRIER_UNIFORM) {
152 barrier |= GL_UNIFORM_BARRIER_BIT;
153 }
154 if (barrier_bits & GPU_BARRIER_BUFFER_UPDATE) {
155 barrier |= GL_BUFFER_UPDATE_BARRIER_BIT;
156 }
157 return barrier;
158}
159
160} // namespace gpu
161} // namespace blender
unsigned int uint
eGPUBlend
Definition GPU_state.hh:84
eGPUWriteMask
Definition GPU_state.hh:16
eGPUProvokingVertex
Definition GPU_state.hh:141
eGPUFaceCullTest
Definition GPU_state.hh:135
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:127
eGPUDepthTest
Definition GPU_state.hh:110
eGPUStencilTest
Definition GPU_state.hh:120
Read Guarded memory(de)allocation.
unsigned long long int uint64_t
void signal() override
Definition gl_state.cc:674
void wait() override
Definition gl_state.cc:685
void texture_bind_temp(GLTexture *tex)
Definition gl_state.cc:488
GLFrameBuffer * active_fb
Definition gl_state.hh:32
void image_unbind(Texture *tex) override
Definition gl_state.cc:592
void image_bind(Texture *tex, int unit) override
Definition gl_state.cc:578
void apply_state() override
Definition gl_state.cc:54
void texture_unpack_row_length_set(uint len) override
Definition gl_state.cc:556
void issue_barrier(eGPUBarrier barrier_bits) override
Definition gl_state.cc:661
void texture_unbind_all() override
Definition gl_state.cc:517
void force_state() override
Definition gl_state.cc:66
void texture_bind(Texture *tex, GPUSamplerState sampler, int unit) override
Definition gl_state.cc:468
void image_unbind_all() override
Definition gl_state.cc:609
void texture_unbind(Texture *tex) override
Definition gl_state.cc:499
CCL_NAMESPACE_BEGIN ccl_device float invert(const float color, const float factor)
Definition invert.h:11
static GLenum to_gl(const GPUAttachmentType type)
uint len