37 return &get_static_cache().get();
42 get_static_cache().release();
50 if (
name ==
nullptr) {
51 std::cerr <<
"EEVEE: Missing case for eShaderType(" <<
i
52 <<
") in static_shader_create_info_name_get().";
56 BLI_assert_msg(create_info !=
nullptr,
"EEVEE: Missing create info for static shader.");
83 bool block_until_ready)
85 std::lock_guard
lock(mutex_);
89 if (request_bits & bit) {
90 bool all_loaded =
true;
92 if (shaders_[shader].is_ready()) {
95 else if (block_until_ready) {
96 shaders_[shader].get();
99 shaders_[shader].ensure_compile_async();
109#define AS_SPAN(arr) Span<eShaderType>(arr, ARRAY_SIZE(arr))
271 int render_buffers_shadow_id,
272 int shadow_ray_count,
273 int shadow_ray_step_count,
274 bool use_split_indirect,
275 bool use_lightprobe_eval)
277 std::lock_guard
lock(mutex_);
280 {render_buffers_shadow_id,
282 shadow_ray_step_count,
284 use_lightprobe_eval},
298 for (
bool use_transmission : {
false,
true}) {
299 sp.
set_value(render_pass_shadow_id_index, render_buffers_shadow_id);
300 sp.
set_value(use_split_indirect_index, use_split_indirect);
301 sp.
set_value(use_lightprobe_eval_index, use_lightprobe_eval);
302 sp.
set_value(use_transmission_index, use_transmission);
303 sp.
set_value(shadow_ray_count_index, shadow_ray_count);
304 sp.
set_value(shadow_ray_step_count_index, shadow_ray_step_count);
306 specializations.
append({sh, sp});
313 if (specialization_handle) {
320 return specialization_handle == 0;
323const char *ShaderModule::static_shader_create_info_name_get(
eShaderType shader_type)
325 switch (shader_type) {
327 return "eevee_ambient_occlusion_pass";
329 return "eevee_film_copy_frag";
331 return "eevee_film_comp";
333 return "eevee_film_cryptomatte_post";
335 return "eevee_film_frag";
337 return "eevee_film_pass_convert_combined";
339 return "eevee_film_pass_convert_depth";
341 return "eevee_film_pass_convert_value";
343 return "eevee_film_pass_convert_color";
345 return "eevee_film_pass_convert_cryptomatte";
347 return "eevee_deferred_combine";
349 return "eevee_deferred_light_single";
351 return "eevee_deferred_light_double";
353 return "eevee_deferred_light_triple";
355 return "eevee_deferred_aov_clear";
357 return "eevee_deferred_capture_eval";
359 return "eevee_deferred_planar_eval";
361 return "eevee_deferred_thickness_amend";
363 return "eevee_deferred_tile_classify";
365 return "eevee_hiz_debug";
367 return "eevee_hiz_update";
369 return "eevee_hiz_update_layer";
371 return "eevee_horizon_denoise";
373 return "eevee_horizon_resolve";
375 return "eevee_horizon_scan";
377 return "eevee_horizon_setup";
379 return "eevee_lookdev_display";
381 return "eevee_motion_blur_gather";
383 return "eevee_motion_blur_tiles_dilate";
385 return "eevee_motion_blur_tiles_flatten_rgba";
387 return "eevee_motion_blur_tiles_flatten_rg";
389 return "eevee_debug_surfels";
391 return "eevee_debug_irradiance_grid";
393 return "eevee_debug_gbuffer";
395 return "eevee_display_lightprobe_volume";
397 return "eevee_display_lightprobe_sphere";
399 return "eevee_display_lightprobe_planar";
401 return "eevee_depth_of_field_bokeh_lut";
403 return "eevee_depth_of_field_downsample";
405 return "eevee_depth_of_field_filter";
407 return "eevee_depth_of_field_gather_foreground_lut";
409 return "eevee_depth_of_field_gather_foreground_no_lut";
411 return "eevee_depth_of_field_gather_background_lut";
413 return "eevee_depth_of_field_gather_background_no_lut";
415 return "eevee_depth_of_field_hole_fill";
417 return "eevee_depth_of_field_reduce";
419 return "eevee_depth_of_field_resolve_no_lut";
421 return "eevee_depth_of_field_resolve_lut";
423 return "eevee_depth_of_field_setup";
425 return "eevee_depth_of_field_scatter";
427 return "eevee_depth_of_field_stabilize";
429 return "eevee_depth_of_field_tiles_dilate_minabs";
431 return "eevee_depth_of_field_tiles_dilate_minmax";
433 return "eevee_depth_of_field_tiles_flatten";
435 return "eevee_light_culling_debug";
437 return "eevee_light_culling_select";
439 return "eevee_light_culling_sort";
441 return "eevee_light_culling_tile";
443 return "eevee_light_culling_zbin";
445 return "eevee_light_shadow_setup";
447 return "eevee_ray_denoise_spatial";
449 return "eevee_ray_denoise_temporal";
451 return "eevee_ray_denoise_bilateral";
453 return "eevee_ray_generate";
455 return "eevee_ray_trace_fallback";
457 return "eevee_ray_trace_planar";
459 return "eevee_ray_trace_screen";
461 return "eevee_ray_tile_classify";
463 return "eevee_ray_tile_compact";
465 return "eevee_renderpass_clear";
467 return "eevee_lightprobe_volume_bounds";
469 return "eevee_lightprobe_volume_offset";
471 return "eevee_lightprobe_volume_ray";
473 return "eevee_lightprobe_volume_load";
475 return "eevee_lightprobe_volume_world";
477 return "eevee_lightprobe_sphere_convolve";
479 return "eevee_lightprobe_sphere_remap";
481 return "eevee_lightprobe_sphere_irradiance";
483 return "eevee_lightprobe_sphere_select";
485 return "eevee_lightprobe_sphere_sunlight";
487 return "eevee_shadow_clipmap_clear";
489 return "eevee_shadow_debug";
491 return "eevee_shadow_page_allocate";
493 return "eevee_shadow_page_clear";
495 return "eevee_shadow_page_defrag";
497 return "eevee_shadow_page_free";
499 return "eevee_shadow_page_mask";
501 return "eevee_shadow_tilemap_amend";
503 return "eevee_shadow_tilemap_bounds";
505 return "eevee_shadow_tilemap_finalize";
507 return "eevee_shadow_tilemap_rendermap";
509 return "eevee_shadow_tilemap_init";
511 return "eevee_shadow_tag_update";
513 return "eevee_shadow_tag_usage_opaque";
515 return "eevee_shadow_tag_usage_surfels";
517 return "eevee_shadow_tag_usage_transparent";
519 return "eevee_shadow_page_tile_clear";
521 return "eevee_shadow_page_tile_store";
523 return "eevee_shadow_tag_usage_volume";
525 return "eevee_shadow_view_visibility";
527 return "eevee_subsurface_convolve";
529 return "eevee_subsurface_setup";
531 return "eevee_surfel_cluster_build";
533 return "eevee_surfel_light";
535 return "eevee_surfel_list_build";
537 return "eevee_surfel_list_flatten";
539 return "eevee_surfel_list_prefix";
541 return "eevee_surfel_list_prepare";
543 return "eevee_surfel_list_sort";
545 return "eevee_surfel_ray";
547 return "eevee_vertex_copy";
549 return "eevee_volume_integration";
551 return "eevee_volume_occupancy_convert";
553 return "eevee_volume_resolve";
555 return "eevee_volume_scatter";
557 return "eevee_volume_scatter_with_lights";
567 return shaders_[shader_type].get();
586 bool has_shader_to_rgba)
608 if (index_ == first_reserved_) {
609 index_ = last_reserved_ + 1;
625 bool transparent_shadows;
631 transparent_shadows);
650 info.
define(
"UNI_ATTR(a)",
"float4(0.0)");
662 bool use_ao_node =
false;
668 info.
define(
"MAT_AMBIENT_OCCLUSION");
674 info.
define(
"MAT_TRANSPARENT");
689 info.
define(
"MAT_DIFFUSE");
692 info.
define(
"MAT_SUBSURFACE");
695 info.
define(
"MAT_REFRACTION");
698 info.
define(
"MAT_TRANSLUCENT");
701 info.
define(
"MAT_REFLECTION");
704 info.
define(
"MAT_CLEARCOAT");
707 info.
define(
"MAT_REFLECTION_COLORLESS");
710 info.
define(
"MAT_REFRACTION_COLORLESS");
716 switch (closure_bin_count) {
720 info.
define(
"CLOSURE_BIN_COUNT",
"1");
723 info.
define(
"CLOSURE_BIN_COUNT",
"2");
726 info.
define(
"CLOSURE_BIN_COUNT",
"3");
734 switch (closure_bin_count) {
738 info.
define(
"GBUFFER_LAYER_MAX",
"1");
741 info.
define(
"GBUFFER_LAYER_MAX",
"2");
744 info.
define(
"GBUFFER_LAYER_MAX",
"3");
751 if (closure_bin_count == 2) {
758 int closure_layer_count = 0;
760 closure_layer_count += 1;
763 closure_layer_count += 2;
766 closure_layer_count += colorless_reflection ? 1 : 2;
769 closure_layer_count += colorless_refraction ? 1 : 2;
772 closure_layer_count += 1;
775 closure_layer_count += colorless_reflection ? 1 : 2;
778 if (closure_layer_count <= 2) {
779 info.
define(
"GBUFFER_SIMPLE_CLOSURE_LAYOUT");
787 switch (closure_bin_count) {
793 info.
define(
"LIGHT_CLOSURE_EVAL_COUNT",
"1");
796 info.
define(
"LIGHT_CLOSURE_EVAL_COUNT",
"2");
799 info.
define(
"LIGHT_CLOSURE_EVAL_COUNT",
"3");
808 switch (geometry_type) {
811 info.
define(
"USE_BARYCENTRICS");
816 info.
define(
"USE_BARYCENTRICS");
827 std::stringstream global_vars;
828 switch (geometry_type) {
848 if (
input.name ==
"orco") {
850 global_vars <<
input.type <<
" " <<
input.name <<
";\n";
872 global_vars <<
input.type <<
" " <<
input.name <<
";\n";
888 !support_volume_attributes);
894 global_vars <<
"struct " << iface.
name <<
" {\n";
896 global_vars <<
" " <<
inout.type <<
" " <<
inout.name <<
";\n";
898 global_vars <<
"};\n";
904 const char *domain_type_frag =
"";
905 const char *domain_type_vert =
"";
906 switch (geometry_type) {
910 domain_type_vert =
"MeshVertex";
913 domain_type_frag = domain_type_vert =
"PointCloudPoint";
916 domain_type_frag = domain_type_vert =
"CurvesPoint";
921 domain_type_vert =
"WorldPoint";
924 domain_type_frag = domain_type_vert =
"VolumePoint";
928 std::stringstream attr_load;
931 attr_load <<
"}\n\n";
933 std::stringstream vert_gen, frag_gen;
935 if (do_vertex_attrib_load) {
936 vert_gen << global_vars.str() <<
"void attrib_load(" << domain_type_vert <<
" domain)"
938 frag_gen <<
"void attrib_load(" << domain_type_frag <<
" domain) {}\n";
941 vert_gen <<
"void attrib_load(" << domain_type_vert <<
" domain) {}\n";
942 frag_gen << global_vars.str() <<
"void attrib_load(" << domain_type_frag <<
" domain)"
951 vert_gen <<
"float3 nodetree_displacement()\n";
954 "return float3(0);\n");
958 if (use_vertex_displacement) {
959 dependencies.
append(
"eevee_geom_types_lib.glsl");
960 dependencies.
append(
"eevee_nodetree_lib.glsl");
964 info.
generated_sources.append({
"eevee_nodetree_vert_lib.glsl", dependencies, vert_gen.str()});
970 dependencies.
append(
"eevee_ambient_occlusion_lib.glsl");
972 dependencies.
append(
"eevee_geom_types_lib.glsl");
973 dependencies.
append(
"eevee_nodetree_lib.glsl");
976 frag_gen << graph.serialized;
977 dependencies.
extend(graph.dependencies);
982 info.
define(
"MAT_DISPLACEMENT_BUMP");
984 frag_gen <<
"float3 nodetree_displacement()\n";
991 frag_gen <<
"Closure nodetree_surface(float closure_rand)\n";
993 frag_gen <<
" closure_weights_reset(closure_rand);\n";
1001 frag_gen <<
"float nodetree_thickness()\n";
1008 frag_gen <<
"return 0.0;\n";
1016 frag_gen <<
"float3 ob_scale;\n";
1017 frag_gen <<
"ob_scale.x = length(drw_modelmat()[0].xyz);\n";
1018 frag_gen <<
"ob_scale.y = length(drw_modelmat()[1].xyz);\n";
1019 frag_gen <<
"ob_scale.z = length(drw_modelmat()[2].xyz);\n";
1020 frag_gen <<
"float3 ls_dimensions = safe_rcp(abs(drw_object_infos().orco_mul.xyz));\n";
1021 frag_gen <<
"float3 ws_dimensions = ob_scale * ls_dimensions;\n";
1023 frag_gen <<
"return reduce_min(ws_dimensions);\n";
1030 frag_gen <<
"}\n\n";
1032 frag_gen <<
"Closure nodetree_volume()\n";
1034 frag_gen <<
" closure_weights_reset(0.0);\n";
1037 frag_gen <<
"}\n\n";
1039 info.
generated_sources.append({
"eevee_nodetree_frag_lib.glsl", dependencies, frag_gen.str()});
1042 int reserved_attr_slots = 0;
1045 switch (geometry_type) {
1054 reserved_attr_slots = 2;
1061 reserved_attr_slots = 1;
1069 if (last_attr_index - reserved_attr_slots < 0) {
1070 const char *material_name = (info.
name_.
c_str() + 2);
1071 std::cerr <<
"Error: EEVEE: Material " << material_name <<
" uses too many attributes."
1079 switch (geometry_type) {
1081 switch (pipeline_type) {
1091 switch (pipeline_type) {
1173 bool transparent_shadows;
1179 transparent_shadows);
1182 bool is_prepass =
ELEM(pipeline_type,
1193 bool has_shadow_transparency = has_transparency && transparent_shadows;
1194 bool has_raytraced_transmission = blender_mat && (blender_mat->blend_flag &
MA_BL_SS_REFRACTION);
1196 bool can_use_default = (is_shadow_pass &&
1197 (!has_vertex_displacement && !has_shadow_transparency)) ||
1198 (is_prepass && (!has_vertex_displacement && !has_transparency &&
1199 !has_raytraced_transmission));
1200 if (can_use_default) {
1225 std::lock_guard
lock(tree_orig->runtime->shader_node_errors_mutex);
1226 tree_orig->runtime->shader_node_errors.lookup_or_add_default(
error.node->identifier)
1227 .add(
error.message);
1236 bool deferred_compilation,
1243 pipeline_type, geometry_type, displacement_type, thickness_type, blender_mat->
blend_flag);
1245 bool is_default_material = default_mat ==
nullptr;
1257 deferred_compilation,
1262 return material_from_tree.
material;
1268 bool deferred_compilation)
1281 deferred_compilation,
1285 return material_from_tree.
material;
General operations, lookup, etc. for materials.
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
bool DEG_is_active(const Depsgraph *depsgraph)
T * DEG_get_original(T *id)
uint64_t GPU_material_uuid_get(GPUMaterial *mat)
GPUPass * GPU_material_get_pass(GPUMaterial *material)
GPUMaterialFromNodeTreeResult GPU_material_from_nodetree(Material *ma, bNodeTree *ntree, ListBase *gpumaterials, const char *name, eGPUMaterialEngine engine, uint64_t shader_uuid, bool deferred_compilation, GPUCodegenCallbackFn callback, void *thunk, GPUMaterialPassReplacementCallbackFn pass_replacement_cb=nullptr)
bool GPU_material_flag_get(const GPUMaterial *mat, eGPUMaterialFlag flag)
@ GPU_MATFLAG_REFRACTION_MAYBE_COLORED
@ GPU_MATFLAG_SHADER_TO_RGBA
@ GPU_MATFLAG_REFLECTION_MAYBE_COLORED
@ 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)
int GPU_shader_get_constant(blender::gpu::Shader *shader, const char *name)
const blender::gpu::shader::SpecializationConstants & GPU_shader_get_default_constant_state(blender::gpu::Shader *sh)
SpecializationBatchHandle GPU_shader_batch_specializations(blender::Span< ShaderSpecialization > specializations, CompilationPriority priority=CompilationPriority::High)
const GPUShaderCreateInfo * GPU_shader_create_info_get(const char *info_name)
void GPU_shader_batch_specializations_cancel(SpecializationBatchHandle &handle)
int64_t SpecializationBatchHandle
bool GPU_shader_batch_specializations_is_ready(SpecializationBatchHandle &handle)
BPy_StructRNA * depsgraph
unsigned long long int uint64_t
constexpr const char * c_str() const
void append(const T &value)
void extend(Span< T > array)
SamplerSlots(eMaterialPipeline pipeline_type, eMaterialGeometry geometry_type, bool has_shader_to_rgba)
bool request_specializations(bool block_until_ready, int render_buffers_shadow_id, int shadow_ray_count, int shadow_ray_step_count, bool use_split_indirect, bool use_lightprobe_eval)
static void module_free()
void material_create_info_amend(GPUMaterial *mat, GPUCodegenOutput *codegen)
gpu::Shader * static_shader_get(eShaderType shader_type)
GPUMaterial * material_shader_get(::Material *blender_mat, bNodeTree *nodetree, eMaterialPipeline pipeline_type, eMaterialGeometry geometry_type, bool deferred_compilation, ::Material *default_mat)
static ShaderModule * module_get()
GPUMaterial * world_shader_get(::World *blender_world, bNodeTree *nodetree, eMaterialPipeline pipeline_type, bool deferred_compilation)
static ShadowTechnique shadow_technique
const DRWContext * DRW_context_get()
#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
static void error(const char *str)
@ 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 GPUPass * pass_replacement_cb(void *void_thunk, GPUMaterial *mat)
static eMaterialDisplacement to_displacement_type(int displacement_method)
@ DEFERRED_CAPTURE_SHADERS
@ DEFERRED_LIGHTING_SHADERS
@ IRRADIANCE_BAKE_SHADERS
@ DEFERRED_PLANAR_SHADERS
@ AMBIENT_OCCLUSION_SHADERS
gpu::StaticShader StaticShader
static bool geometry_type_has_surface(eMaterialGeometry geometry_type)
static void store_node_tree_errors(GPUMaterialFromNodeTreeResult &material_from_tree)
static eClosureBits shader_closure_bits_from_flag(const GPUMaterial *gpumat)
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 void codegen_callback(void *void_thunk, GPUMaterial *mat, GPUCodegenOutput *codegen)
static int to_gbuffer_bin_count(const eClosureBits closure_bits)
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
blender::Vector< GPUGraphOutput > material_functions
GPUGraphOutput displacement
GPUShaderCreateInfo * create_info
std::string serialized_or_default(std::string value) const
blender::Vector< blender::StringRefNull > dependencies
blender::Vector< Error > errors
Describe inputs & outputs, stage interfaces, resources and sources of a shader. If all data is correc...
Vector< StageInterfaceInfo * > vertex_out_interfaces_
GeneratedSourceList generated_sources
Self & builtins(BuiltinBits builtin)
Vector< VertIn > vertex_inputs_
Vector< Resource > batch_resources_
Vector< StringRefNull > additional_infos_
Self & additional_info(StringRefNull info_name)
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
ShaderModule * shader_module
void set_value(int index, uint32_t value)