30ShaderModule *ShaderModule::g_shader_module =
nullptr;
34 if (g_shader_module ==
nullptr) {
38 return g_shader_module;
43 if (g_shader_module !=
nullptr) {
45 delete g_shader_module;
46 g_shader_module =
nullptr;
60 const char *name = static_shader_create_info_name_get(
eShaderType(i));
65 if (name ==
nullptr) {
66 std::cerr <<
"EEVEE: Missing case for eShaderType(" << i
67 <<
") in static_shader_create_info_name_get().";
70 BLI_assert_msg(create_info !=
nullptr,
"EEVEE: Missing create info for static shader.");
95 int shadow_ray_step_count)
104 for (
int i = 0; i < 3; i++) {
106 for (
bool use_split_indirect : {
false,
true}) {
107 for (
bool use_lightprobe_eval : {
false,
true}) {
108 for (
bool use_transmission : {
false,
true}) {
109 specializations.
append({sh,
110 {{
"render_pass_shadow_id", render_buffers_shadow_id},
111 {
"use_split_indirect", use_split_indirect},
112 {
"use_lightprobe_eval", use_lightprobe_eval},
113 {
"use_transmission", use_transmission},
114 {
"shadow_ray_count", shadow_ray_count},
115 {
"shadow_ray_step_count", shadow_ray_step_count}}});
126 if (compilation_handle_) {
130 shaders_[i] = shaders[i];
135 if (specialization_handle_) {
141 return compilation_handle_ == 0 && specialization_handle_ == 0;
144const char *ShaderModule::static_shader_create_info_name_get(
eShaderType shader_type)
146 switch (shader_type) {
148 return "eevee_ambient_occlusion_pass";
150 return "eevee_film_copy_frag";
152 return "eevee_film_comp";
154 return "eevee_film_cryptomatte_post";
156 return "eevee_film_frag";
158 return "eevee_film_pass_convert_combined";
160 return "eevee_film_pass_convert_depth";
162 return "eevee_film_pass_convert_value";
164 return "eevee_film_pass_convert_color";
166 return "eevee_film_pass_convert_cryptomatte";
168 return "eevee_deferred_combine";
170 return "eevee_deferred_light_single";
172 return "eevee_deferred_light_double";
174 return "eevee_deferred_light_triple";
176 return "eevee_deferred_capture_eval";
178 return "eevee_deferred_planar_eval";
180 return "eevee_deferred_thickness_amend";
182 return "eevee_deferred_tile_classify";
184 return "eevee_hiz_debug";
186 return "eevee_hiz_update";
188 return "eevee_hiz_update_layer";
190 return "eevee_horizon_denoise";
192 return "eevee_horizon_resolve";
194 return "eevee_horizon_scan";
196 return "eevee_horizon_setup";
198 return "eevee_lookdev_display";
200 return "eevee_motion_blur_gather";
202 return "eevee_motion_blur_tiles_dilate";
204 return "eevee_motion_blur_tiles_flatten_rgba";
206 return "eevee_motion_blur_tiles_flatten_rg";
208 return "eevee_debug_surfels";
210 return "eevee_debug_irradiance_grid";
212 return "eevee_debug_gbuffer";
214 return "eevee_display_lightprobe_volume";
216 return "eevee_display_lightprobe_sphere";
218 return "eevee_display_lightprobe_planar";
220 return "eevee_depth_of_field_bokeh_lut";
222 return "eevee_depth_of_field_downsample";
224 return "eevee_depth_of_field_filter";
226 return "eevee_depth_of_field_gather_foreground_lut";
228 return "eevee_depth_of_field_gather_foreground_no_lut";
230 return "eevee_depth_of_field_gather_background_lut";
232 return "eevee_depth_of_field_gather_background_no_lut";
234 return "eevee_depth_of_field_hole_fill";
236 return "eevee_depth_of_field_reduce";
238 return "eevee_depth_of_field_resolve_no_lut";
240 return "eevee_depth_of_field_resolve_lut";
242 return "eevee_depth_of_field_setup";
244 return "eevee_depth_of_field_scatter";
246 return "eevee_depth_of_field_stabilize";
248 return "eevee_depth_of_field_tiles_dilate_minabs";
250 return "eevee_depth_of_field_tiles_dilate_minmax";
252 return "eevee_depth_of_field_tiles_flatten";
254 return "eevee_light_culling_debug";
256 return "eevee_light_culling_select";
258 return "eevee_light_culling_sort";
260 return "eevee_light_culling_tile";
262 return "eevee_light_culling_zbin";
264 return "eevee_light_shadow_setup";
266 return "eevee_ray_denoise_spatial";
268 return "eevee_ray_denoise_temporal";
270 return "eevee_ray_denoise_bilateral";
272 return "eevee_ray_generate";
274 return "eevee_ray_trace_fallback";
276 return "eevee_ray_trace_planar";
278 return "eevee_ray_trace_screen";
280 return "eevee_ray_tile_classify";
282 return "eevee_ray_tile_compact";
284 return "eevee_renderpass_clear";
286 return "eevee_lightprobe_volume_bounds";
288 return "eevee_lightprobe_volume_offset";
290 return "eevee_lightprobe_volume_ray";
292 return "eevee_lightprobe_volume_load";
294 return "eevee_lightprobe_volume_world";
296 return "eevee_lightprobe_sphere_convolve";
298 return "eevee_lightprobe_sphere_remap";
300 return "eevee_lightprobe_sphere_irradiance";
302 return "eevee_lightprobe_sphere_select";
304 return "eevee_lightprobe_sphere_sunlight";
306 return "eevee_shadow_clipmap_clear";
308 return "eevee_shadow_debug";
310 return "eevee_shadow_page_allocate";
312 return "eevee_shadow_page_clear";
314 return "eevee_shadow_page_defrag";
316 return "eevee_shadow_page_free";
318 return "eevee_shadow_page_mask";
320 return "eevee_shadow_tilemap_amend";
322 return "eevee_shadow_tilemap_bounds";
324 return "eevee_shadow_tilemap_finalize";
326 return "eevee_shadow_tilemap_rendermap";
328 return "eevee_shadow_tilemap_init";
330 return "eevee_shadow_tag_update";
332 return "eevee_shadow_tag_usage_opaque";
334 return "eevee_shadow_tag_usage_surfels";
336 return "eevee_shadow_tag_usage_transparent";
338 return "eevee_shadow_page_tile_clear";
340 return "eevee_shadow_page_tile_store";
342 return "eevee_shadow_tag_usage_volume";
344 return "eevee_shadow_view_visibility";
346 return "eevee_subsurface_convolve";
348 return "eevee_subsurface_setup";
350 return "eevee_surfel_cluster_build";
352 return "eevee_surfel_light";
354 return "eevee_surfel_list_build";
356 return "eevee_surfel_list_sort";
358 return "eevee_surfel_ray";
360 return "eevee_vertex_copy";
362 return "eevee_volume_integration";
364 return "eevee_volume_occupancy_convert";
366 return "eevee_volume_resolve";
368 return "eevee_volume_scatter";
370 return "eevee_volume_scatter_with_lights";
381 if (shaders_[shader_type] ==
nullptr) {
382 const char *shader_name = static_shader_create_info_name_get(shader_type);
384 fprintf(stderr,
"EEVEE: error: Could not compile static shader \"%s\"\n", shader_name);
391 return shaders_[shader_type];
410 bool has_shader_to_rgba)
435 if (index_ == first_reserved_) {
436 index_ = last_reserved_ + 1;
452 bool transparent_shadows;
458 transparent_shadows);
469 if (resource_info.bind_type == ShaderCreateInfo::Resource::BindType::UNIFORM_BUFFER &&
477 info.
define(
"UNI_ATTR(a)",
"vec4(0.0)");
484 if (resource.bind_type == ShaderCreateInfo::Resource::BindType::SAMPLER) {
485 resource.slot = sampler_slots.
get();
493 info.
define(
"MAT_AMBIENT_OCCLUSION");
498 info.
define(
"MAT_TRANSPARENT");
512 int32_t closure_data_slots = 0;
514 info.
define(
"MAT_DIFFUSE");
520 closure_data_slots |= (1 << 2);
523 closure_data_slots |= (1 << 0);
527 info.
define(
"MAT_SUBSURFACE");
528 closure_data_slots |= (1 << 0);
531 info.
define(
"MAT_REFRACTION");
532 closure_data_slots |= (1 << 0);
535 info.
define(
"MAT_TRANSLUCENT");
536 closure_data_slots |= (1 << 0);
539 info.
define(
"MAT_REFLECTION");
540 closure_data_slots |= (1 << 1);
543 info.
define(
"MAT_CLEARCOAT");
544 closure_data_slots |= (1 << 2);
548 switch (closure_bin_count) {
552 info.
define(
"CLOSURE_BIN_COUNT",
"1");
555 info.
define(
"CLOSURE_BIN_COUNT",
"2");
558 info.
define(
"CLOSURE_BIN_COUNT",
"3");
566 switch (closure_bin_count) {
570 info.
define(
"GBUFFER_LAYER_MAX",
"1");
573 info.
define(
"GBUFFER_LAYER_MAX",
"2");
576 info.
define(
"GBUFFER_LAYER_MAX",
"3");
587 switch (closure_bin_count) {
593 info.
define(
"LIGHT_CLOSURE_EVAL_COUNT",
"1");
596 info.
define(
"LIGHT_CLOSURE_EVAL_COUNT",
"2");
599 info.
define(
"LIGHT_CLOSURE_EVAL_COUNT",
"3");
608 switch (geometry_type) {
611 info.
define(
"USE_BARYCENTRICS");
612 info.
builtins(BuiltinBits::BARYCENTRIC_COORD);
616 info.
define(
"USE_BARYCENTRICS");
624 std::stringstream global_vars;
625 switch (geometry_type) {
634 info.
sampler(sampler_slots.
get(), ImageType::FLOAT_3D, input.name, Frequency::BATCH);
645 if (input.name ==
"orco") {
647 global_vars << input.type <<
" " << input.name <<
";\n";
650 info.
sampler(sampler_slots.
get(), ImageType::FLOAT_BUFFER, input.name, Frequency::BATCH);
660 info.
sampler(sampler_slots.
get(), ImageType::FLOAT_3D, input.name, Frequency::BATCH);
676 global_vars << input.type <<
" " << input.name <<
";\n";
683 info.
sampler(sampler_slots.
get(), ImageType::FLOAT_3D, input.name, Frequency::BATCH);
696 global_vars <<
"struct " << iface.
name <<
" {\n";
697 for (
const auto &inout : iface.
inouts) {
698 global_vars <<
" " << inout.type <<
" " << inout.name <<
";\n";
700 global_vars <<
"};\n";
706 std::stringstream attr_load;
707 attr_load <<
"void attrib_load()\n";
710 attr_load <<
"}\n\n";
712 std::stringstream vert_gen, frag_gen, comp_gen;
714 if (do_vertex_attrib_load) {
715 vert_gen << global_vars.str() << attr_load.str();
716 frag_gen <<
"void attrib_load() {}\n";
719 vert_gen <<
"void attrib_load() {}\n";
720 frag_gen << global_vars.str() << attr_load.str();
724 const bool use_vertex_displacement = !codegen.
displacement.empty() &&
728 vert_gen <<
"vec3 nodetree_displacement()\n";
730 vert_gen << ((use_vertex_displacement) ? codegen.
displacement :
"return vec3(0);\n");
741 info.
define(
"MAT_DISPLACEMENT_BUMP");
743 frag_gen <<
"vec3 nodetree_displacement()\n";
749 frag_gen <<
"Closure nodetree_surface(float closure_rand)\n";
751 frag_gen <<
" closure_weights_reset(closure_rand);\n";
752 frag_gen << (!codegen.
surface.empty() ? codegen.
surface :
"return Closure(0);\n");
758 frag_gen <<
"float nodetree_thickness()\n";
765 frag_gen <<
"return 0.0;\n";
773 frag_gen <<
"vec3 ob_scale;\n";
774 frag_gen <<
"ob_scale.x = length(ModelMatrix[0].xyz);\n";
775 frag_gen <<
"ob_scale.y = length(ModelMatrix[1].xyz);\n";
776 frag_gen <<
"ob_scale.z = length(ModelMatrix[2].xyz);\n";
777 frag_gen <<
"vec3 ls_dimensions = safe_rcp(abs(OrcoTexCoFactors[1].xyz));\n";
778 frag_gen <<
"vec3 ws_dimensions = ob_scale * ls_dimensions;\n";
780 frag_gen <<
"return reduce_min(ws_dimensions);\n";
788 frag_gen <<
"Closure nodetree_volume()\n";
790 frag_gen <<
" closure_weights_reset(0.0);\n";
791 frag_gen << (!codegen.
volume.empty() ? codegen.
volume :
"return Closure(0);\n");
798 switch (geometry_type) {
819 switch (geometry_type) {
821 switch (pipeline_type) {
831 switch (pipeline_type) {
890 reinterpret_cast<ShaderModule *
>(thunk)->material_create_info_amend(mat, codegen);
905 bool transparent_shadows;
911 transparent_shadows);
914 bool is_prepass =
ELEM(pipeline_type,
925 bool has_shadow_transparency = has_transparency && transparent_shadows;
926 bool has_raytraced_transmission = blender_mat && (blender_mat->blend_flag &
MA_BL_SS_REFRACTION);
928 bool can_use_default = (is_shadow_pass &&
929 (!has_vertex_displacement && !has_shadow_transparency)) ||
930 (is_prepass && (!has_vertex_displacement && !has_transparency &&
931 !has_raytraced_transmission));
932 if (can_use_default) {
934 pipeline_type, geometry_type);
949 blender_mat, blender_mat->
nodetree, pipeline_type, geometry_type,
false);
956 bool deferred_compilation)
964 pipeline_type, geometry_type, displacement_type, thickness_type, blender_mat->
blend_flag);
966 bool is_default_material =
ELEM(
974 deferred_compilation,
987 bool defer_compilation = is_volume;
struct Material * BKE_material_default_surface(void)
struct Material * BKE_material_default_volume(void)
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
MINLINE int count_bits_i(unsigned int n)
#define DRW_SHADER_FREE_SAFE(shader)
bool GPU_use_parallel_compilation()
uint64_t GPU_material_uuid_get(GPUMaterial *mat)
void GPU_material_compile(GPUMaterial *mat)
GPUPass * GPU_material_get_pass(GPUMaterial *material)
void GPU_material_status_set(GPUMaterial *mat, eGPUMaterialStatus status)
bool GPU_material_flag_get(const GPUMaterial *mat, eGPUMaterialFlag flag)
GPUMaterial * GPU_material_from_nodetree(Scene *scene, Material *ma, bNodeTree *ntree, ListBase *gpumaterials, const char *name, eGPUMaterialEngine engine, uint64_t shader_uuid, bool is_volume_shader, bool is_lookdev, GPUCodegenCallbackFn callback, void *thunk, GPUMaterialPassReplacementCallbackFn pass_replacement_cb=nullptr)
@ GPU_MATFLAG_SHADER_TO_RGBA
@ GPU_MATFLAG_BARYCENTRIC
@ GPU_MATFLAG_TRANSLUCENT
@ GPU_MATFLAG_TRANSPARENT
Material * GPU_material_get_material(GPUMaterial *material)
const GPUUniformAttrList * GPU_material_uniform_attributes(const GPUMaterial *material)
bool GPU_material_has_displacement_output(GPUMaterial *mat)
blender::Vector< GPUShader * > GPU_shader_batch_finalize(BatchHandle &handle)
SpecializationBatchHandle GPU_shader_batch_specializations(blender::Span< ShaderSpecialization > specializations)
GPUShader * GPU_shader_create_from_info_name(const char *info_name)
bool GPU_shader_batch_is_ready(BatchHandle handle)
const GPUShaderCreateInfo * GPU_shader_create_info_get(const char *info_name)
BatchHandle GPU_shader_batch_create_from_infos(blender::Span< const GPUShaderCreateInfo * > infos)
bool GPU_shader_batch_specializations_is_ready(SpecializationBatchHandle &handle)
struct GPUShader GPUShader
void append(const T &value)
void reserve(const int64_t min_capacity)
SamplerSlots(eMaterialPipeline pipeline_type, eMaterialGeometry geometry_type, bool has_shader_to_rgba)
bool is_ready(bool block=false)
GPUMaterial * material_shader_get(::Material *blender_mat, bNodeTree *nodetree, eMaterialPipeline pipeline_type, eMaterialGeometry geometry_type, bool deferred_compilation)
static void module_free()
GPUMaterial * material_default_shader_get(eMaterialPipeline pipeline_type, eMaterialGeometry geometry_type)
void material_create_info_amend(GPUMaterial *mat, GPUCodegenOutput *codegen)
void precompile_specializations(int render_buffers_shadow_id, int shadow_ray_count, int shadow_ray_step_count)
GPUMaterial * world_shader_get(::World *blender_world, bNodeTree *nodetree, eMaterialPipeline pipeline_type)
static ShaderModule * module_get()
GPUShader * static_shader_get(eShaderType shader_type)
static ShadowTechnique shadow_technique
GPUMaterial * DRW_shader_from_world(World *wo, bNodeTree *ntree, eGPUMaterialEngine engine, const uint64_t shader_id, const bool is_volume_shader, bool deferred, GPUCodegenCallbackFn callback, void *thunk)
void DRW_shader_queue_optimize_material(GPUMaterial *mat)
GPUMaterial * DRW_shader_from_material(Material *ma, bNodeTree *ntree, eGPUMaterialEngine engine, const uint64_t shader_id, const bool is_volume_shader, bool deferred, GPUCodegenCallbackFn callback, void *thunk, GPUMaterialPassReplacementCallbackFn pass_replacement_cb)
#define MATERIAL_TEXTURE_RESERVED_SLOT_LAST_NO_EVAL
#define MATERIAL_TEXTURE_RESERVED_SLOT_LAST_HYBRID
#define MATERIAL_TEXTURE_RESERVED_SLOT_FIRST
#define MATERIAL_TEXTURE_RESERVED_SLOT_LAST_FORWARD
#define MATERIAL_TEXTURE_RESERVED_SLOT_LAST_WORLD
@ DOF_GATHER_BACKGROUND_LUT
@ SHADOW_TILEMAP_TAG_USAGE_SURFELS
@ SHADOW_TILEMAP_RENDERMAP
@ LIGHTPROBE_IRRADIANCE_RAY
@ DOF_TILES_DILATE_MINABS
@ SHADOW_TILEMAP_FINALIZE
@ DOF_TILES_DILATE_MINMAX
@ MOTION_BLUR_TILE_FLATTEN_RGBA
@ DEFERRED_THICKNESS_AMEND
@ SHADOW_TILEMAP_TAG_USAGE_OPAQUE
@ VOLUME_SCATTER_WITH_LIGHTS
@ MOTION_BLUR_TILE_FLATTEN_RG
@ DOF_GATHER_FOREGROUND_LUT
@ SPHERE_PROBE_IRRADIANCE
@ SHADOW_TILEMAP_TAG_USAGE_TRANSPARENT
@ FILM_PASS_CONVERT_COMBINED
@ FILM_PASS_CONVERT_CRYPTOMATTE
@ LIGHTPROBE_IRRADIANCE_LOAD
@ VOLUME_OCCUPANCY_CONVERT
@ SHADOW_TILEMAP_TAG_USAGE_VOLUME
@ MOTION_BLUR_TILE_DILATE
@ FILM_PASS_CONVERT_COLOR
@ LIGHTPROBE_IRRADIANCE_OFFSET
@ SHADOW_TILEMAP_TAG_UPDATE
@ FILM_PASS_CONVERT_VALUE
@ LIGHTPROBE_IRRADIANCE_WORLD
@ LIGHTPROBE_IRRADIANCE_BOUNDS
@ FILM_PASS_CONVERT_DEPTH
static eMaterialDisplacement to_displacement_type(int displacement_method)
static GPUPass * pass_replacement_cb(void *thunk, GPUMaterial *mat)
static bool geometry_type_has_surface(eMaterialGeometry geometry_type)
static void material_type_from_shader_uuid(uint64_t shader_uuid, eMaterialPipeline &pipeline_type, eMaterialGeometry &geometry_type, eMaterialDisplacement &displacement_type, eMaterialThickness &thickness_type, bool &transparent_shadows)
static uint64_t shader_uuid_from_material_type(eMaterialPipeline pipeline_type, eMaterialGeometry geometry_type, eMaterialDisplacement displacement_type=MAT_DISPLACEMENT_BUMP, eMaterialThickness thickness_type=MAT_THICKNESS_SPHERE, char blend_flags=0)
static eMaterialThickness to_thickness_type(int thickness_mode)
@ MAT_PIPE_PREPASS_FORWARD_VELOCITY
@ MAT_PIPE_VOLUME_MATERIAL
@ MAT_PIPE_PREPASS_DEFERRED
@ MAT_PIPE_PREPASS_OVERLAP
@ MAT_PIPE_PREPASS_PLANAR
@ MAT_PIPE_PREPASS_DEFERRED_VELOCITY
@ MAT_PIPE_VOLUME_OCCUPANCY
@ MAT_PIPE_PREPASS_FORWARD
static void codegen_callback(void *thunk, GPUMaterial *mat, GPUCodegenOutput *codegen)
unsigned __int64 uint64_t
std::string material_functions
GPUShaderCreateInfo * create_info
struct bNodeTree * nodetree
Describe inputs & outputs, stage interfaces, resources and sources of a shader. If all data is correc...
Vector< StageInterfaceInfo * > vertex_out_interfaces_
std::string fragment_source_generated
Self & builtins(BuiltinBits builtin)
Vector< VertIn > vertex_inputs_
Vector< Resource > batch_resources_
Vector< StringRefNull > additional_infos_
Self & additional_info(StringRefNull info_name)
std::string vertex_source_generated
Self & sampler(int slot, ImageType type, StringRefNull name, Frequency freq=Frequency::PASS, GPUSamplerState sampler=GPUSamplerState::internal_sampler())
Self & define(StringRefNull name, StringRefNull value="")
StringRefNull instance_name