Blender V4.5
draw_shader.cc
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#include "draw_shader.hh"
10
11#include "GPU_batch.hh"
12#include "GPU_capabilities.hh"
13
16
17#include "DRW_render.hh"
18
19#define SHADER_CUSTOM_DATA_INTERP_MAX_DIMENSIONS 4
20
22{
23 switch (shader_type) {
25 return "subdiv_lines";
26
28 return "subdiv_lines_loose";
29
31 return "subdiv_tris_single_material";
32
34 return "subdiv_tris_multiple_materials";
35
37 return "subdiv_edge_fac";
38
40 return "subdiv_sculpt_data";
41
43 return "subdiv_patch_evaluation_verts";
44
46 return "subdiv_patch_evaluation_fvar";
47
49 return "subdiv_patch_evaluation_fdots";
50
52 return "subdiv_patch_evaluation_fdots_normals";
53
55 return "subdiv_patch_evaluation_verts_orcos";
56
58 return "subdiv_edituv_stretch_angle";
59
61 return "subdiv_edituv_stretch_area";
62
64 return "subdiv_normals_accumulate";
65
67 return "subdiv_normals_finalize";
68
70 return "subdiv_custom_normals_finalize";
71
73 return "subdiv_loop_normals";
74
76 break;
77
78 default:
79 break;
80 }
82 return "";
83}
84
86
88 static gpu::StaticShaderCache<ShaderCache> &get_static_cache()
89 {
90 static gpu::StaticShaderCache<ShaderCache> static_cache;
91 return static_cache;
92 }
93
94 public:
95 static ShaderCache &get()
96 {
97 return get_static_cache().get();
98 }
99 static void release()
100 {
101 get_static_cache().release();
102 }
103
104 gpu::StaticShader hair_refine = {"draw_hair_refine_compute"};
105 gpu::StaticShader debug_draw_display = {"draw_debug_draw_display"};
106 gpu::StaticShader draw_visibility_compute = {"draw_visibility_compute"};
107 gpu::StaticShader draw_view_finalize = {"draw_view_finalize"};
108 gpu::StaticShader draw_resource_finalize = {"draw_resource_finalize"};
109 gpu::StaticShader draw_command_generate = {"draw_command_generate"};
110
113
115 {
118 continue;
119 }
121 }
122
125 std::string info_name = "subdiv_custom_data_interp";
126 const char *dimension_names[] = {"_1d", "_2d", "_3d", "_4d"};
127 info_name += dimension_names[dimension];
128
129 switch (comp_type) {
130 case GPU_COMP_U16:
131 info_name += "_u16";
132 break;
133 case GPU_COMP_I32:
134 info_name += "_i32";
135 break;
136 case GPU_COMP_F32:
137 info_name += "_f32";
138 break;
139 default:
141 }
142
143 subdiv_custom_data_sh[dimension][comp_type] = {info_name};
144 }
145 }
146 }
147};
148
149} // namespace blender::draw::Shader
150
151using namespace blender::draw::Shader;
152
154{
156}
157
159{
160 /* TODO: Implement curves evaluation types (Bezier and Catmull Rom). */
162}
163
168
173
178
183
188
190{
192 return ShaderCache::get().subdiv_sh[uint(shader_type)].get();
193}
194
195GPUShader *DRW_shader_subdiv_custom_data_get(GPUVertCompType comp_type, int dimensions)
196{
197 BLI_assert(dimensions >= 1 && dimensions <= SHADER_CUSTOM_DATA_INTERP_MAX_DIMENSIONS);
198 if (comp_type == GPU_COMP_U16) {
199 BLI_assert(dimensions == 4);
200 }
202
203 return ShaderCache::get().subdiv_custom_data_sh[dimensions - 1][comp_type].get();
204}
205
#define BLI_assert_unreachable()
Definition BLI_assert.h:93
#define BLI_assert(a)
Definition BLI_assert.h:46
unsigned int uint
#define ELEM(...)
void GPU_shader_unbind()
GPUVertCompType
@ GPU_COMP_U16
@ GPU_COMP_MAX
@ GPU_COMP_F32
@ GPU_COMP_I32
constexpr const char * c_str() const
gpu::StaticShader draw_resource_finalize
gpu::StaticShader draw_visibility_compute
gpu::StaticShader draw_command_generate
gpu::StaticShader subdiv_sh[SUBDIVISION_MAX_SHADERS]
gpu::StaticShader subdiv_custom_data_sh[SHADER_CUSTOM_DATA_INTERP_MAX_DIMENSIONS][GPU_COMP_MAX]
ParticleRefineShader
static blender::StringRefNull get_subdiv_shader_info_name(SubdivShaderType shader_type)
GPUShader * DRW_shader_subdiv_custom_data_get(GPUVertCompType comp_type, int dimensions)
GPUShader * DRW_shader_draw_visibility_compute_get()
GPUShader * DRW_shader_subdiv_get(SubdivShaderType shader_type)
GPUShader * DRW_shader_hair_refine_get(ParticleRefineShader)
GPUShader * DRW_shader_draw_resource_finalize_get()
GPUShader * DRW_shader_curves_refine_get(blender::draw::CurvesEvalShader)
void DRW_shaders_free()
GPUShader * DRW_shader_draw_view_finalize_get()
GPUShader * DRW_shader_debug_draw_display_get()
#define SHADER_CUSTOM_DATA_INTERP_MAX_DIMENSIONS
GPUShader * DRW_shader_draw_command_generate_get()
constexpr int SUBDIVISION_MAX_SHADERS
SubdivShaderType
@ PATCH_EVALUATION_FACE_DOTS_WITH_NORMALS
i
Definition text_draw.cc:230