Blender V5.0
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];
41 uint texture_unpack_row_length_ = 0;
42
51 GLuint targets_[64] = {GL_TEXTURE_2D};
52 GLuint textures_[64] = {0};
53 GLuint samplers_[64] = {0};
54 uint64_t dirty_texture_binds_ = 0;
55
56 GLuint images_[8] = {0};
57 GLenum formats_[8] = {0};
58 uint8_t dirty_image_binds_ = 0;
59
60 public:
62
63 void apply_state() override;
67 void force_state() override;
68
69 void issue_barrier(GPUBarrier barrier_bits) override;
70
71 void texture_bind(Texture *tex, GPUSamplerState sampler, int unit) override;
75 void texture_bind_temp(GLTexture *tex);
76 void texture_unbind(Texture *tex) override;
77 void texture_unbind_all() override;
78
79 void image_bind(Texture *tex, int unit) override;
80 void image_unbind(Texture *tex) override;
81 void image_unbind_all() override;
82
85
93
94 private:
95 static void set_write_mask(GPUWriteMask value);
96 static void set_depth_test(GPUDepthTest value);
97 static void set_stencil_test(GPUStencilTest test, GPUStencilOp operation);
98 static void set_stencil_mask(GPUStencilTest test, const GPUStateMutable &state);
99 static void set_clip_distances(int new_dist_len, int old_dist_len);
100 static void set_logic_op(bool enable);
101 static void set_facing(bool invert);
102 static void set_backface_culling(GPUFaceCullTest test);
103 static void set_provoking_vert(GPUProvokingVertex vert);
104 static void set_shadow_bias(bool enable);
105 static void set_clip_control(bool enable);
106 static void set_blend(GPUBlend value);
107
108 void set_state(const GPUState &state);
109 void set_mutable_state(const GPUStateMutable &state);
110
111 void texture_bind_apply();
112 void image_bind_apply();
113
114 MEM_CXX_CLASS_ALLOC_FUNCS("GLStateManager")
115};
116
117/* Fence synchronization primitive. */
118class GLFence : public Fence {
119 private:
120 GLsync gl_sync_ = 0;
121
122 public:
123 GLFence() : Fence() {};
124 ~GLFence();
125
126 void signal() override;
127 void wait() override;
128
129 MEM_CXX_CLASS_ALLOC_FUNCS("GLFence")
130};
131
132static inline GLbitfield to_gl(GPUBarrier barrier_bits)
133{
134 GLbitfield barrier = 0;
135 if (barrier_bits & GPU_BARRIER_SHADER_IMAGE_ACCESS) {
136 barrier |= GL_SHADER_IMAGE_ACCESS_BARRIER_BIT;
137 }
138 if (barrier_bits & GPU_BARRIER_SHADER_STORAGE) {
139 barrier |= GL_SHADER_STORAGE_BARRIER_BIT;
140 }
141 if (barrier_bits & GPU_BARRIER_TEXTURE_FETCH) {
142 barrier |= GL_TEXTURE_FETCH_BARRIER_BIT;
143 }
144 if (barrier_bits & GPU_BARRIER_TEXTURE_UPDATE) {
145 barrier |= GL_TEXTURE_UPDATE_BARRIER_BIT;
146 }
147 if (barrier_bits & GPU_BARRIER_COMMAND) {
148 barrier |= GL_COMMAND_BARRIER_BIT;
149 }
150 if (barrier_bits & GPU_BARRIER_FRAMEBUFFER) {
151 barrier |= GL_FRAMEBUFFER_BARRIER_BIT;
152 }
153 if (barrier_bits & GPU_BARRIER_VERTEX_ATTRIB_ARRAY) {
154 barrier |= GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT;
155 }
156 if (barrier_bits & GPU_BARRIER_ELEMENT_ARRAY) {
157 barrier |= GL_ELEMENT_ARRAY_BARRIER_BIT;
158 }
159 if (barrier_bits & GPU_BARRIER_UNIFORM) {
160 barrier |= GL_UNIFORM_BARRIER_BIT;
161 }
162 if (barrier_bits & GPU_BARRIER_BUFFER_UPDATE) {
163 barrier |= GL_BUFFER_UPDATE_BARRIER_BIT;
164 }
165 return barrier;
166}
167
168} // namespace gpu
169} // namespace blender
unsigned int uint
GPUBarrier
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
GPUDepthTest
Definition GPU_state.hh:110
GPUBlend
Definition GPU_state.hh:84
GPUProvokingVertex
Definition GPU_state.hh:141
GPUStencilTest
Definition GPU_state.hh:120
GPUWriteMask
Definition GPU_state.hh:16
GPUFaceCullTest
Definition GPU_state.hh:135
GPUStencilOp
Definition GPU_state.hh:127
Read Guarded memory(de)allocation.
unsigned long long int uint64_t
void signal() override
Definition gl_state.cc:679
void wait() override
Definition gl_state.cc:690
void texture_bind_temp(GLTexture *tex)
Definition gl_state.cc:485
GLFrameBuffer * active_fb
Definition gl_state.hh:32
uint texture_unpack_row_length_get() const
Definition gl_state.cc:558
void image_unbind(Texture *tex) override
Definition gl_state.cc:595
void image_bind(Texture *tex, int unit) override
Definition gl_state.cc:580
void apply_state() override
Definition gl_state.cc:54
void texture_unpack_row_length_set(uint len) override
Definition gl_state.cc:553
void texture_unbind_all() override
Definition gl_state.cc:514
void issue_barrier(GPUBarrier barrier_bits) override
Definition gl_state.cc:666
void force_state() override
Definition gl_state.cc:65
void texture_bind(Texture *tex, GPUSamplerState sampler, int unit) override
Definition gl_state.cc:465
void image_unbind_all() override
Definition gl_state.cc:613
void texture_unbind(Texture *tex) override
Definition gl_state.cc:496
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