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
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_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.
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 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