Blender V4.5
gpu_shader_builtin.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2005 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "BLI_utildefines.h"
10
11#include "GPU_shader.hh"
12
13#include "gpu_shader_private.hh"
14
15/* Cache of built-in shaders (each is created on first use). */
17
19{
20 switch (shader) {
21 case GPU_SHADER_TEXT:
22 return "gpu_shader_text";
24 return "gpu_shader_keyframe_shape";
26 return "gpu_shader_simple_lighting";
28 return "gpu_shader_3D_image";
30 return "gpu_shader_3D_image_color";
32 return "gpu_shader_2D_checker";
34 return "gpu_shader_2D_diag_stripes";
35 case GPU_SHADER_ICON:
36 return "gpu_shader_icon";
38 return "gpu_shader_2D_image_overlays_merge";
40 return "gpu_shader_2D_image_overlays_stereo_merge";
42 return "gpu_shader_2D_image_desaturate_color";
44 return "gpu_shader_2D_image_shuffle_color";
46 return "gpu_shader_2D_image_rect_color";
48 return "gpu_shader_icon_multi";
50 return "gpu_shader_3D_uniform_color";
52 return "gpu_shader_3D_flat_color";
54 return "gpu_shader_3D_smooth_color";
56 return "gpu_shader_3D_depth_only";
58 return "gpu_shader_3D_clipped_uniform_color";
60 return "gpu_shader_3D_polyline_uniform_color";
62 return "gpu_shader_3D_polyline_uniform_color_clipped";
64 return "gpu_shader_3D_polyline_flat_color";
66 return "gpu_shader_3D_polyline_smooth_color";
68 return "gpu_shader_3D_line_dashed_uniform_color";
70 return "gpu_shader_2D_point_uniform_size_uniform_color_aa";
72 return "gpu_shader_2D_point_uniform_size_uniform_color_outline_aa";
74 return "gpu_shader_3D_point_varying_size_varying_color";
76 return "gpu_shader_3D_point_uniform_size_uniform_color_aa";
78 return "gpu_shader_3D_point_flat_color";
80 return "gpu_shader_3D_point_uniform_color";
82 return "gpu_shader_2D_area_borders";
84 return "gpu_shader_2D_widget_base";
86 return "gpu_shader_2D_widget_base_inst";
88 return "gpu_shader_2D_widget_shadow";
90 return "gpu_shader_2D_node_socket";
92 return "gpu_shader_2D_node_socket_inst";
94 return "gpu_shader_2D_nodelink";
96 return "gpu_shader_2D_nodelink_inst";
98 return "gpu_shader_gpencil_stroke";
100 return "gpu_shader_sequencer_strips";
102 return "gpu_shader_sequencer_thumbs";
104 return "gpu_shader_index_2d_array_points";
106 return "gpu_shader_index_2d_array_lines";
108 return "gpu_shader_index_2d_array_tris";
109 default:
111 return "";
112 }
113}
114
116{
117 switch (shader) {
119 return "gpu_shader_3D_uniform_color_clipped";
121 return "gpu_shader_3D_flat_color_clipped";
123 return "gpu_shader_3D_smooth_color_clipped";
125 return "gpu_shader_3D_depth_only_clipped";
127 return "gpu_shader_3D_line_dashed_uniform_color_clipped";
129 return "gpu_shader_3D_point_uniform_size_uniform_color_aa_clipped";
131 return "gpu_shader_3D_polyline_uniform_color_clipped";
132 default:
133 BLI_assert_msg(false, "Clipped shader configuration not available.");
134 return "";
135 }
136}
137
139 eGPUShaderConfig sh_cfg)
140{
143
144#ifdef __GNUC__
145# pragma GCC diagnostic push
146# pragma GCC diagnostic ignored "-Warray-bounds"
147#endif
148 GPUShader **sh_p = &builtin_shaders[sh_cfg][shader];
149#ifdef __GNUC__
150# pragma GCC diagnostic pop
151#endif
152
153 if (*sh_p == nullptr) {
154 if (sh_cfg == GPU_SHADER_CFG_DEFAULT) {
155 /* Common case. */
157 if (ELEM(shader,
162 {
163 /* Set a default value for `lineSmooth`.
164 * Ideally this value should be set by the caller. */
165 GPU_shader_bind(*sh_p);
166 GPU_shader_uniform_1i(*sh_p, "lineSmooth", 1);
167 /* WORKAROUND: See is_polyline declaration. */
168 blender::gpu::unwrap(*sh_p)->is_polyline = true;
169 }
170 }
171 else if (sh_cfg == GPU_SHADER_CFG_CLIPPED) {
172 /* In rare cases geometry shaders calculate clipping themselves. */
173 const char *info_name_clipped = builtin_shader_create_info_name_clipped(shader);
174 if (!blender::StringRefNull(info_name_clipped).is_empty()) {
175 *sh_p = GPU_shader_create_from_info_name(info_name_clipped);
176 }
177 }
178 else {
179 BLI_assert(0);
180 }
181 }
182
183 return *sh_p;
184}
185
190
192{
193 /* Make sure non is bound before deleting. */
195 for (int i = 0; i < GPU_SHADER_CFG_LEN; i++) {
196 for (int j = 0; j < GPU_SHADER_BUILTIN_LEN; j++) {
197 if (builtin_shaders[i][j]) {
199 builtin_shaders[i][j] = nullptr;
200 }
201 }
202 }
203}
#define BLI_assert_unreachable()
Definition BLI_assert.h:93
#define BLI_assert(a)
Definition BLI_assert.h:46
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:53
#define ELEM(...)
void GPU_shader_uniform_1i(GPUShader *sh, const char *name, int value)
GPUShader * GPU_shader_create_from_info_name(const char *info_name)
void GPU_shader_bind(GPUShader *shader, const blender::gpu::shader::SpecializationConstants *constants_state=nullptr)
void GPU_shader_free(GPUShader *shader)
void GPU_shader_unbind()
@ GPU_SHADER_CFG_DEFAULT
@ GPU_SHADER_CFG_CLIPPED
#define GPU_SHADER_BUILTIN_LEN
eGPUBuiltinShader
@ GPU_SHADER_2D_DIAG_STRIPES
@ GPU_SHADER_SEQUENCER_THUMBS
@ GPU_SHADER_3D_SMOOTH_COLOR
@ GPU_SHADER_GPENCIL_STROKE
@ GPU_SHADER_INDEXBUF_TRIS
@ GPU_SHADER_2D_NODELINK_INST
@ GPU_SHADER_3D_LINE_DASHED_UNIFORM_COLOR
@ GPU_SHADER_3D_POLYLINE_SMOOTH_COLOR
@ GPU_SHADER_3D_POINT_VARYING_SIZE_VARYING_COLOR
@ GPU_SHADER_KEYFRAME_SHAPE
@ GPU_SHADER_3D_POLYLINE_UNIFORM_COLOR
@ GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA
@ GPU_SHADER_3D_POINT_FLAT_COLOR
@ GPU_SHADER_SEQUENCER_STRIPS
@ GPU_SHADER_2D_IMAGE_DESATURATE_COLOR
@ GPU_SHADER_3D_DEPTH_ONLY
@ GPU_SHADER_INDEXBUF_LINES
@ GPU_SHADER_TEXT
@ GPU_SHADER_3D_CLIPPED_UNIFORM_COLOR
@ GPU_SHADER_2D_CHECKER
@ GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA
@ GPU_SHADER_3D_UNIFORM_COLOR
@ GPU_SHADER_2D_IMAGE_RECT_COLOR
@ GPU_SHADER_3D_FLAT_COLOR
@ GPU_SHADER_2D_WIDGET_BASE_INST
@ GPU_SHADER_ICON_MULTI
@ GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR
@ GPU_SHADER_3D_IMAGE
@ GPU_SHADER_2D_IMAGE_OVERLAYS_STEREO_MERGE
@ GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_AA
@ GPU_SHADER_3D_POLYLINE_FLAT_COLOR
@ GPU_SHADER_SIMPLE_LIGHTING
@ GPU_SHADER_2D_NODE_SOCKET
@ GPU_SHADER_ICON
@ GPU_SHADER_2D_WIDGET_SHADOW
@ GPU_SHADER_3D_POINT_UNIFORM_COLOR
@ GPU_SHADER_2D_WIDGET_BASE
@ GPU_SHADER_2D_AREA_BORDERS
@ GPU_SHADER_3D_POLYLINE_CLIPPED_UNIFORM_COLOR
@ GPU_SHADER_INDEXBUF_POINTS
@ GPU_SHADER_2D_IMAGE_OVERLAYS_MERGE
@ GPU_SHADER_2D_NODE_SOCKET_INST
@ GPU_SHADER_2D_NODELINK
@ GPU_SHADER_3D_IMAGE_COLOR
#define GPU_SHADER_CFG_LEN
static const char * builtin_shader_create_info_name(eGPUBuiltinShader shader)
GPUShader * GPU_shader_get_builtin_shader_with_config(eGPUBuiltinShader shader, eGPUShaderConfig sh_cfg)
static GPUShader * builtin_shaders[GPU_SHADER_CFG_LEN][GPU_SHADER_BUILTIN_LEN]
GPUShader * GPU_shader_get_builtin_shader(eGPUBuiltinShader shader)
void GPU_shader_free_builtin_shaders()
static const char * builtin_shader_create_info_name_clipped(eGPUBuiltinShader shader)
static Context * unwrap(GPUContext *ctx)
i
Definition text_draw.cc:230