Blender V4.3
eevee_shadow_info.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "draw_defines.hh"
6#include "eevee_defines.hh"
7
9
10/* -------------------------------------------------------------------- */
14/* NOTE(Metal): As this is implemented using a fundamental data type, this needs to be specified
15 * explicitly as uint for code generation, as the MSLShaderGenerator needs to be able to
16 * distinguish between classes and fundamental types during code generation. */
17#define SHADOW_TILE_DATA_PACKED "uint"
18#define SHADOW_PAGE_PACKED "uint"
19
20GPU_SHADER_CREATE_INFO(eevee_shadow_clipmap_clear)
21 .do_static_compilation(true)
22 .local_group_size(SHADOW_CLIPMAP_GROUP_SIZE)
23 .storage_buf(0, Qualifier::WRITE, "ShadowTileMapClip", "tilemaps_clip_buf[]")
24 .push_constant(Type::INT, "tilemaps_clip_buf_len")
25 .additional_info("eevee_shared")
26 .compute_source("eevee_shadow_clipmap_clear_comp.glsl");
27
28GPU_SHADER_CREATE_INFO(eevee_shadow_tilemap_bounds)
29 .do_static_compilation(true)
30 .local_group_size(SHADOW_BOUNDS_GROUP_SIZE)
31 .storage_buf(LIGHT_BUF_SLOT, Qualifier::READ_WRITE, "LightData", "light_buf[]")
32 .storage_buf(LIGHT_CULL_BUF_SLOT, Qualifier::READ, "LightCullingData", "light_cull_buf")
33 .storage_buf(4, Qualifier::READ, "uint", "casters_id_buf[]")
34 .storage_buf(5, Qualifier::READ_WRITE, "ShadowTileMapData", "tilemaps_buf[]")
35 .storage_buf(6, Qualifier::READ, "ObjectBounds", "bounds_buf[]")
36 .storage_buf(7, Qualifier::READ_WRITE, "ShadowTileMapClip", "tilemaps_clip_buf[]")
37 .push_constant(Type::INT, "resource_len")
38 .typedef_source("draw_shader_shared.hh")
39 .additional_info("eevee_shared")
40 .compute_source("eevee_shadow_tilemap_bounds_comp.glsl");
41
42GPU_SHADER_CREATE_INFO(eevee_shadow_tilemap_init)
43 .do_static_compilation(true)
44 .local_group_size(SHADOW_TILEMAP_RES, SHADOW_TILEMAP_RES)
45 .storage_buf(0, Qualifier::READ_WRITE, "ShadowTileMapData", "tilemaps_buf[]")
46 .storage_buf(1, Qualifier::READ_WRITE, SHADOW_TILE_DATA_PACKED, "tiles_buf[]")
47 .storage_buf(2, Qualifier::READ_WRITE, "ShadowTileMapClip", "tilemaps_clip_buf[]")
48 .storage_buf(4, Qualifier::READ_WRITE, "uvec2", "pages_cached_buf[]")
49 .additional_info("eevee_shared")
50 .compute_source("eevee_shadow_tilemap_init_comp.glsl");
51
52GPU_SHADER_CREATE_INFO(eevee_shadow_tag_update)
53 .do_static_compilation(true)
54 .local_group_size(1, 1, 1)
55 .storage_buf(0, Qualifier::READ_WRITE, "ShadowTileMapData", "tilemaps_buf[]")
56 .storage_buf(1, Qualifier::READ_WRITE, SHADOW_TILE_DATA_PACKED, "tiles_buf[]")
57 .storage_buf(5, Qualifier::READ, "ObjectBounds", "bounds_buf[]")
58 .storage_buf(6, Qualifier::READ, "uint", "resource_ids_buf[]")
59 .additional_info("eevee_shared", "draw_view", "draw_view_culling")
60 .compute_source("eevee_shadow_tag_update_comp.glsl");
61
62GPU_SHADER_CREATE_INFO(eevee_shadow_tag_usage_opaque)
63 .do_static_compilation(true)
65 .storage_buf(5, Qualifier::READ_WRITE, "ShadowTileMapData", "tilemaps_buf[]")
66 .storage_buf(6, Qualifier::READ_WRITE, SHADOW_TILE_DATA_PACKED, "tiles_buf[]")
67 .push_constant(Type::IVEC2, "input_depth_extent")
68 .additional_info(
69 "eevee_shared", "draw_view", "draw_view_culling", "eevee_hiz_data", "eevee_light_data")
70 .compute_source("eevee_shadow_tag_usage_comp.glsl");
71
72GPU_SHADER_CREATE_INFO(eevee_shadow_tag_usage_surfels)
73 .do_static_compilation(true)
74 .local_group_size(SURFEL_GROUP_SIZE)
75 .storage_buf(6, Qualifier::READ_WRITE, "ShadowTileMapData", "tilemaps_buf[]")
76 .storage_buf(7, Qualifier::READ_WRITE, SHADOW_TILE_DATA_PACKED, "tiles_buf[]")
77 .push_constant(Type::INT, "directional_level")
78 .additional_info("eevee_shared",
79 "draw_view",
80 "draw_view_culling",
81 "eevee_light_data",
82 "eevee_global_ubo",
83 "eevee_surfel_common")
84 .compute_source("eevee_shadow_tag_usage_surfels_comp.glsl");
85
86GPU_SHADER_INTERFACE_INFO(eevee_shadow_tag_transparent_iface, "interp")
87 .smooth(Type::VEC3, "P")
88 .smooth(Type::VEC3, "vP");
89GPU_SHADER_INTERFACE_INFO(eevee_shadow_tag_transparent_flat_iface, "interp_flat")
90 .flat(Type::VEC3, "ls_aabb_min")
91 .flat(Type::VEC3, "ls_aabb_max");
92
93GPU_SHADER_CREATE_INFO(eevee_shadow_tag_usage_transparent)
94 .do_static_compilation(true)
95 .vertex_in(0, Type::VEC3, "pos")
96 .storage_buf(4, Qualifier::READ, "ObjectBounds", "bounds_buf[]")
97 .storage_buf(5, Qualifier::READ_WRITE, "ShadowTileMapData", "tilemaps_buf[]")
98 .storage_buf(6, Qualifier::READ_WRITE, SHADOW_TILE_DATA_PACKED, "tiles_buf[]")
99 .push_constant(Type::IVEC2, "fb_resolution")
100 .push_constant(Type::INT, "fb_lod")
101 .vertex_out(eevee_shadow_tag_transparent_iface)
102 .vertex_out(eevee_shadow_tag_transparent_flat_iface)
103 .additional_info("eevee_shared",
104 "draw_resource_id_varying",
105 "draw_view",
106 "draw_view_culling",
107 "draw_modelmat_new",
108 "eevee_hiz_data",
109 "eevee_light_data")
110 .vertex_source("eevee_shadow_tag_usage_vert.glsl")
111 .fragment_source("eevee_shadow_tag_usage_frag.glsl");
112
113GPU_SHADER_CREATE_INFO(eevee_shadow_tag_usage_volume)
114 .do_static_compilation(true)
116 .storage_buf(4, Qualifier::READ_WRITE, "ShadowTileMapData", "tilemaps_buf[]")
117 .storage_buf(5, Qualifier::READ_WRITE, SHADOW_TILE_DATA_PACKED, "tiles_buf[]")
118 .additional_info("eevee_volume_properties_data",
119 "eevee_shared",
120 "draw_view",
121 "draw_view_culling",
122 "eevee_hiz_data",
123 "eevee_light_data",
124 "eevee_sampling_data")
125 .compute_source("eevee_shadow_tag_usage_volume_comp.glsl");
126
127GPU_SHADER_CREATE_INFO(eevee_shadow_page_mask)
128 .do_static_compilation(true)
129 .local_group_size(SHADOW_TILEMAP_RES, SHADOW_TILEMAP_RES)
130 .push_constant(Type::INT, "max_view_per_tilemap")
131 .storage_buf(0, Qualifier::READ_WRITE, "ShadowTileMapData", "tilemaps_buf[]")
132 .storage_buf(1, Qualifier::READ_WRITE, SHADOW_TILE_DATA_PACKED, "tiles_buf[]")
133 .additional_info("eevee_shared")
134 .compute_source("eevee_shadow_page_mask_comp.glsl");
135
136GPU_SHADER_CREATE_INFO(eevee_shadow_page_free)
137 .do_static_compilation(true)
138 .local_group_size(SHADOW_TILEMAP_LOD0_LEN)
139 .storage_buf(0, Qualifier::READ_WRITE, "ShadowTileMapData", "tilemaps_buf[]")
140 .storage_buf(1, Qualifier::READ_WRITE, SHADOW_TILE_DATA_PACKED, "tiles_buf[]")
141 .storage_buf(2, Qualifier::READ_WRITE, "ShadowPagesInfoData", "pages_infos_buf")
142 .storage_buf(3, Qualifier::READ_WRITE, "uint", "pages_free_buf[]")
143 .storage_buf(4, Qualifier::READ_WRITE, "uvec2", "pages_cached_buf[]")
144 .additional_info("eevee_shared")
145 .compute_source("eevee_shadow_page_free_comp.glsl");
146
147GPU_SHADER_CREATE_INFO(eevee_shadow_page_defrag)
148 .do_static_compilation(true)
149 .local_group_size(1)
150 .typedef_source("draw_shader_shared.hh")
151 .storage_buf(1, Qualifier::READ_WRITE, SHADOW_TILE_DATA_PACKED, "tiles_buf[]")
152 .storage_buf(2, Qualifier::READ_WRITE, "ShadowPagesInfoData", "pages_infos_buf")
153 .storage_buf(3, Qualifier::READ_WRITE, "uint", "pages_free_buf[]")
154 .storage_buf(4, Qualifier::READ_WRITE, "uvec2", "pages_cached_buf[]")
155 .storage_buf(5, Qualifier::WRITE, "DispatchCommand", "clear_dispatch_buf")
156 .storage_buf(6, Qualifier::WRITE, "DrawCommand", "tile_draw_buf")
157 .storage_buf(7, Qualifier::READ_WRITE, "ShadowStatistics", "statistics_buf")
158 .additional_info("eevee_shared")
159 .compute_source("eevee_shadow_page_defrag_comp.glsl");
160
161GPU_SHADER_CREATE_INFO(eevee_shadow_page_allocate)
162 .do_static_compilation(true)
163 .local_group_size(SHADOW_TILEMAP_LOD0_LEN)
164 .typedef_source("draw_shader_shared.hh")
165 .storage_buf(0, Qualifier::READ_WRITE, "ShadowTileMapData", "tilemaps_buf[]")
166 .storage_buf(1, Qualifier::READ_WRITE, SHADOW_TILE_DATA_PACKED, "tiles_buf[]")
167 .storage_buf(2, Qualifier::READ_WRITE, "ShadowPagesInfoData", "pages_infos_buf")
168 .storage_buf(3, Qualifier::READ_WRITE, "uint", "pages_free_buf[]")
169 .storage_buf(4, Qualifier::READ_WRITE, "uvec2", "pages_cached_buf[]")
170 .storage_buf(6, Qualifier::READ_WRITE, "ShadowStatistics", "statistics_buf")
171 .additional_info("eevee_shared")
172 .compute_source("eevee_shadow_page_allocate_comp.glsl");
173
174GPU_SHADER_CREATE_INFO(eevee_shadow_tilemap_finalize)
175 .do_static_compilation(true)
176 .typedef_source("draw_shader_shared.hh")
177 .local_group_size(SHADOW_TILEMAP_RES, SHADOW_TILEMAP_RES)
178 .storage_buf(0, Qualifier::READ, "ShadowTileMapData", "tilemaps_buf[]")
179 .storage_buf(1, Qualifier::READ, SHADOW_TILE_DATA_PACKED, "tiles_buf[]")
180 .storage_buf(2, Qualifier::READ_WRITE, "ShadowPagesInfoData", "pages_infos_buf")
181 .storage_buf(3, Qualifier::READ_WRITE, "ShadowStatistics", "statistics_buf")
182 .storage_buf(4, Qualifier::WRITE, "ViewMatrices", "view_infos_buf[SHADOW_VIEW_MAX]")
183 .storage_buf(5, Qualifier::WRITE, "ShadowRenderView", "render_view_buf[SHADOW_VIEW_MAX]")
184 .storage_buf(6, Qualifier::READ, "ShadowTileMapClip", "tilemaps_clip_buf[]")
185 .image(0, GPU_R32UI, Qualifier::WRITE, ImageType::UINT_2D, "tilemaps_img")
186 .additional_info("eevee_shared")
187 .compute_source("eevee_shadow_tilemap_finalize_comp.glsl");
188
189GPU_SHADER_CREATE_INFO(eevee_shadow_tilemap_rendermap)
190 .do_static_compilation(true)
191 .typedef_source("draw_shader_shared.hh")
192 .local_group_size(SHADOW_TILEMAP_RES, SHADOW_TILEMAP_RES)
193 .storage_buf(0, Qualifier::READ_WRITE, "ShadowStatistics", "statistics_buf")
194 .storage_buf(1, Qualifier::READ, "ShadowRenderView", "render_view_buf[SHADOW_VIEW_MAX]")
195 .storage_buf(2, Qualifier::READ_WRITE, SHADOW_TILE_DATA_PACKED, "tiles_buf[]")
196 .storage_buf(3, Qualifier::READ_WRITE, "DispatchCommand", "clear_dispatch_buf")
197 .storage_buf(4, Qualifier::READ_WRITE, "DrawCommand", "tile_draw_buf")
198 .storage_buf(5, Qualifier::WRITE, SHADOW_PAGE_PACKED, "dst_coord_buf[SHADOW_RENDER_MAP_SIZE]")
199 .storage_buf(6, Qualifier::WRITE, SHADOW_PAGE_PACKED, "src_coord_buf[SHADOW_RENDER_MAP_SIZE]")
200 .storage_buf(7, Qualifier::WRITE, SHADOW_PAGE_PACKED, "render_map_buf[SHADOW_RENDER_MAP_SIZE]")
201 .additional_info("eevee_shared")
202 .compute_source("eevee_shadow_tilemap_rendermap_comp.glsl");
203
204GPU_SHADER_CREATE_INFO(eevee_shadow_tilemap_amend)
205 .do_static_compilation(true)
206 .local_group_size(SHADOW_TILEMAP_RES, SHADOW_TILEMAP_RES)
207 .image(0, GPU_R32UI, Qualifier::READ_WRITE, ImageType::UINT_2D, "tilemaps_img")
208 .storage_buf(LIGHT_CULL_BUF_SLOT, Qualifier::READ, "LightCullingData", "light_cull_buf")
209 .storage_buf(LIGHT_BUF_SLOT, Qualifier::READ_WRITE, "LightData", "light_buf[]")
210 /* The call bind_resources(lights) also uses LIGHT_ZBIN_BUF_SLOT and LIGHT_TILE_BUF_SLOT. */
211 .storage_buf(4, Qualifier::READ, "ShadowTileMapData", "tilemaps_buf[]")
212 .additional_info("eevee_shared", "draw_view")
213 .compute_source("eevee_shadow_tilemap_amend_comp.glsl");
214
215/* AtomicMin clear implementation. */
216GPU_SHADER_CREATE_INFO(eevee_shadow_page_clear)
217 .do_static_compilation(true)
219 .storage_buf(2, Qualifier::READ, "ShadowPagesInfoData", "pages_infos_buf")
220 .storage_buf(6, Qualifier::READ, SHADOW_PAGE_PACKED, "dst_coord_buf[SHADOW_RENDER_MAP_SIZE]")
221 .additional_info("eevee_shared")
222 .compute_source("eevee_shadow_page_clear_comp.glsl")
224 GPU_R32UI,
225 Qualifier::READ_WRITE,
226 ImageType::UINT_2D_ARRAY_ATOMIC,
227 "shadow_atlas_img");
228
229/* TBDR clear implementation. */
230GPU_SHADER_CREATE_INFO(eevee_shadow_page_tile_clear)
231 .do_static_compilation(true)
232 .define("PASS_CLEAR")
233 .additional_info("eevee_shared")
234 .builtins(BuiltinBits::VIEWPORT_INDEX | BuiltinBits::LAYER)
235 .storage_buf(8, Qualifier::READ, SHADOW_PAGE_PACKED, "src_coord_buf[SHADOW_RENDER_MAP_SIZE]")
236 .vertex_source("eevee_shadow_page_tile_vert.glsl")
237 .fragment_source("eevee_shadow_page_tile_frag.glsl")
238 .fragment_out(0, Type::FLOAT, "out_tile_depth", DualBlend::NONE, SHADOW_ROG_ID);
239
240#ifdef APPLE
241/* Metal supports USHORT which saves a bit of performance here. */
242# define PAGE_Z_TYPE Type::USHORT
243#else
244# define PAGE_Z_TYPE Type::UINT
245#endif
246
247/* Interface for passing precalculated values in accumulation vertex to frag. */
248GPU_SHADER_INTERFACE_INFO(eevee_shadow_page_tile_store_noperspective_iface, "interp_noperspective")
249 .no_perspective(Type::VEC2, "out_texel_xy");
250GPU_SHADER_INTERFACE_INFO(eevee_shadow_page_tile_store_flat_iface, "interp_flat")
251 .flat(PAGE_Z_TYPE, "out_page_z");
252
253#undef PAGE_Z_TYPE
254
255/* 2nd tile pass to store shadow depths in atlas. */
256GPU_SHADER_CREATE_INFO(eevee_shadow_page_tile_store)
257 .do_static_compilation(true)
258 .define("PASS_DEPTH_STORE")
259 .additional_info("eevee_shared")
260 .builtins(BuiltinBits::VIEWPORT_INDEX | BuiltinBits::LAYER)
261 .storage_buf(7, Qualifier::READ, SHADOW_PAGE_PACKED, "dst_coord_buf[SHADOW_RENDER_MAP_SIZE]")
262 .storage_buf(8, Qualifier::READ, SHADOW_PAGE_PACKED, "src_coord_buf[SHADOW_RENDER_MAP_SIZE]")
263 .subpass_in(0, Type::FLOAT, "in_tile_depth", SHADOW_ROG_ID)
265 GPU_R32UI,
266 Qualifier::READ_WRITE,
267 ImageType::UINT_2D_ARRAY,
268 "shadow_atlas_img")
269 .vertex_out(eevee_shadow_page_tile_store_noperspective_iface)
270 .vertex_out(eevee_shadow_page_tile_store_flat_iface)
271 .vertex_source("eevee_shadow_page_tile_vert.glsl")
272 .fragment_source("eevee_shadow_page_tile_frag.glsl");
273
274/* Custom visibility check pass. */
275GPU_SHADER_CREATE_INFO(eevee_shadow_view_visibility)
276 .do_static_compilation(true)
277 .typedef_source("eevee_defines.hh")
278 .typedef_source("eevee_shader_shared.hh")
279 .local_group_size(DRW_VISIBILITY_GROUP_SIZE)
280 .define("DRW_VIEW_LEN", STRINGIFY(DRW_VIEW_MAX))
281 .storage_buf(0, Qualifier::READ, "ObjectBounds", "bounds_buf[]")
282 .storage_buf(1, Qualifier::READ_WRITE, "uint", "visibility_buf[]")
283 .storage_buf(2, Qualifier::READ, "ShadowRenderView", "render_view_buf[SHADOW_VIEW_MAX]")
284 .push_constant(Type::INT, "resource_len")
285 .push_constant(Type::INT, "view_len")
286 .push_constant(Type::INT, "visibility_word_per_draw")
287 .compute_source("eevee_shadow_visibility_comp.glsl")
288 .additional_info("draw_view", "draw_view_culling", "draw_object_infos_new");
289
292/* -------------------------------------------------------------------- */
297 /* SHADOW_READ_ATOMIC macro indicating shadow functions should use `usampler2DArrayAtomic` as
298 * the atlas type. */
299 .define("SHADOW_READ_ATOMIC")
300 .builtins(BuiltinBits::TEXTURE_ATOMIC)
301 .sampler(SHADOW_ATLAS_TEX_SLOT, ImageType::UINT_2D_ARRAY_ATOMIC, "shadow_atlas_tx")
302 .sampler(SHADOW_TILEMAPS_TEX_SLOT, ImageType::UINT_2D, "shadow_tilemaps_tx");
303
304GPU_SHADER_CREATE_INFO(eevee_shadow_data_non_atomic)
305 .sampler(SHADOW_ATLAS_TEX_SLOT, ImageType::UINT_2D_ARRAY, "shadow_atlas_tx")
306 .sampler(SHADOW_TILEMAPS_TEX_SLOT, ImageType::UINT_2D, "shadow_tilemaps_tx");
307
310/* -------------------------------------------------------------------- */
314GPU_SHADER_CREATE_INFO(eevee_shadow_debug)
315 .do_static_compilation(true)
316 .additional_info("eevee_shared")
317 .storage_buf(5, Qualifier::READ, "ShadowTileMapData", "tilemaps_buf[]")
318 .storage_buf(6, Qualifier::READ, SHADOW_TILE_DATA_PACKED, "tiles_buf[]")
319 .fragment_out(0, Type::VEC4, "out_color_add", DualBlend::SRC_0)
320 .fragment_out(0, Type::VEC4, "out_color_mul", DualBlend::SRC_1)
321 .push_constant(Type::INT, "debug_mode")
322 .push_constant(Type::INT, "debug_tilemap_index")
323 .depth_write(DepthWrite::ANY)
324 .fragment_source("eevee_shadow_debug_frag.glsl")
325 .additional_info(
326 "draw_fullscreen", "draw_view", "eevee_hiz_data", "eevee_light_data", "eevee_shadow_data");
327
#define STRINGIFY(x)
#define DRW_VISIBILITY_GROUP_SIZE
#define DRW_VIEW_MAX
gbuf_header_tx eevee_shadow_data
#define SURFEL_GROUP_SIZE
#define SHADOW_TILEMAP_RES
#define LIGHT_BUF_SLOT
#define SHADOW_PAGE_CLEAR_GROUP_SIZE
#define SHADOW_CLIPMAP_GROUP_SIZE
#define SHADOW_TILEMAP_LOD0_LEN
#define SHADOW_DEPTH_SCAN_GROUP_SIZE
#define SHADOW_ATLAS_TEX_SLOT
#define SHADOW_BOUNDS_GROUP_SIZE
#define SHADOW_ATLAS_IMG_SLOT
#define LIGHT_CULL_BUF_SLOT
#define SHADOW_TILEMAPS_TEX_SLOT
#define SHADOW_ROG_ID
#define SHADOW_PAGE_PACKED
#define SHADOW_TILE_DATA_PACKED
SHADOW_TILEMAP_RES tiles_buf[] statistics_buf render_view_buf[SHADOW_VIEW_MAX] GPU_R32UI
#define PAGE_Z_TYPE
tilemaps_buf[] storage_buf(7, Qualifier::READ_WRITE, SHADOW_TILE_DATA_PACKED, "tiles_buf[]") .push_constant(Type smooth(Type::VEC3, "P") .smooth(Type flat(Type::VEC3, "ls_aabb_min") .flat(Type pos tilemaps_buf[] storage_buf(6, Qualifier::READ_WRITE, SHADOW_TILE_DATA_PACKED, "tiles_buf[]") .push_constant(Type VOLUME_GROUP_SIZE
#define GPU_SHADER_INTERFACE_INFO(_interface, _inst_name)
#define GPU_SHADER_CREATE_INFO(_info)