35 return &get_static_cache().get();
40 get_static_cache().release();
46 const char *name = static_shader_create_info_name_get(
eShaderType(
i));
48 if (name ==
nullptr) {
49 std::cerr <<
"EEVEE: Missing case for eShaderType(" <<
i
50 <<
") in static_shader_create_info_name_get().";
54 BLI_assert_msg(create_info !=
nullptr,
"EEVEE: Missing create info for static shader.");
81 bool block_until_ready)
83 std::lock_guard
lock(mutex_);
87 if (request_bits & bit) {
88 bool all_loaded =
true;
90 if (shaders_[shader].is_ready()) {
93 else if (block_until_ready) {
94 shaders_[shader].get();
97 shaders_[shader].ensure_compile_async();
107#define AS_SPAN(arr) Span<eShaderType>(arr, ARRAY_SIZE(arr))
268 int render_buffers_shadow_id,
269 int shadow_ray_count,
270 int shadow_ray_step_count,
271 bool use_split_indirect,
272 bool use_lightprobe_eval)
274 std::lock_guard
lock(mutex_);
277 {render_buffers_shadow_id,
279 shadow_ray_step_count,
281 use_lightprobe_eval},
295 for (
bool use_transmission : {
false,
true}) {
296 sp.
set_value(render_pass_shadow_id_index, render_buffers_shadow_id);
297 sp.
set_value(use_split_indirect_index, use_split_indirect);
298 sp.
set_value(use_lightprobe_eval_index, use_lightprobe_eval);
299 sp.
set_value(use_transmission_index, use_transmission);
300 sp.
set_value(shadow_ray_count_index, shadow_ray_count);
301 sp.
set_value(shadow_ray_step_count_index, shadow_ray_step_count);
303 specializations.
append({sh, sp});
310 if (specialization_handle) {
317 return specialization_handle == 0;
320const char *ShaderModule::static_shader_create_info_name_get(
eShaderType shader_type)
322 switch (shader_type) {
324 return "eevee_ambient_occlusion_pass";
326 return "eevee_film_copy_frag";
328 return "eevee_film_comp";
330 return "eevee_film_cryptomatte_post";
332 return "eevee_film_frag";
334 return "eevee_film_pass_convert_combined";
336 return "eevee_film_pass_convert_depth";
338 return "eevee_film_pass_convert_value";
340 return "eevee_film_pass_convert_color";
342 return "eevee_film_pass_convert_cryptomatte";
344 return "eevee_deferred_combine";
346 return "eevee_deferred_light_single";
348 return "eevee_deferred_light_double";
350 return "eevee_deferred_light_triple";
352 return "eevee_deferred_capture_eval";
354 return "eevee_deferred_planar_eval";
356 return "eevee_deferred_thickness_amend";
358 return "eevee_deferred_tile_classify";
360 return "eevee_hiz_debug";
362 return "eevee_hiz_update";
364 return "eevee_hiz_update_layer";
366 return "eevee_horizon_denoise";
368 return "eevee_horizon_resolve";
370 return "eevee_horizon_scan";
372 return "eevee_horizon_setup";
374 return "eevee_lookdev_display";
376 return "eevee_motion_blur_gather";
378 return "eevee_motion_blur_tiles_dilate";
380 return "eevee_motion_blur_tiles_flatten_rgba";
382 return "eevee_motion_blur_tiles_flatten_rg";
384 return "eevee_debug_surfels";
386 return "eevee_debug_irradiance_grid";
388 return "eevee_debug_gbuffer";
390 return "eevee_display_lightprobe_volume";
392 return "eevee_display_lightprobe_sphere";
394 return "eevee_display_lightprobe_planar";
396 return "eevee_depth_of_field_bokeh_lut";
398 return "eevee_depth_of_field_downsample";
400 return "eevee_depth_of_field_filter";
402 return "eevee_depth_of_field_gather_foreground_lut";
404 return "eevee_depth_of_field_gather_foreground_no_lut";
406 return "eevee_depth_of_field_gather_background_lut";
408 return "eevee_depth_of_field_gather_background_no_lut";
410 return "eevee_depth_of_field_hole_fill";
412 return "eevee_depth_of_field_reduce";
414 return "eevee_depth_of_field_resolve_no_lut";
416 return "eevee_depth_of_field_resolve_lut";
418 return "eevee_depth_of_field_setup";
420 return "eevee_depth_of_field_scatter";
422 return "eevee_depth_of_field_stabilize";
424 return "eevee_depth_of_field_tiles_dilate_minabs";
426 return "eevee_depth_of_field_tiles_dilate_minmax";
428 return "eevee_depth_of_field_tiles_flatten";
430 return "eevee_light_culling_debug";
432 return "eevee_light_culling_select";
434 return "eevee_light_culling_sort";
436 return "eevee_light_culling_tile";
438 return "eevee_light_culling_zbin";
440 return "eevee_light_shadow_setup";
442 return "eevee_ray_denoise_spatial";
444 return "eevee_ray_denoise_temporal";
446 return "eevee_ray_denoise_bilateral";
448 return "eevee_ray_generate";
450 return "eevee_ray_trace_fallback";
452 return "eevee_ray_trace_planar";
454 return "eevee_ray_trace_screen";
456 return "eevee_ray_tile_classify";
458 return "eevee_ray_tile_compact";
460 return "eevee_renderpass_clear";
462 return "eevee_lightprobe_volume_bounds";
464 return "eevee_lightprobe_volume_offset";
466 return "eevee_lightprobe_volume_ray";
468 return "eevee_lightprobe_volume_load";
470 return "eevee_lightprobe_volume_world";
472 return "eevee_lightprobe_sphere_convolve";
474 return "eevee_lightprobe_sphere_remap";
476 return "eevee_lightprobe_sphere_irradiance";
478 return "eevee_lightprobe_sphere_select";
480 return "eevee_lightprobe_sphere_sunlight";
482 return "eevee_shadow_clipmap_clear";
484 return "eevee_shadow_debug";
486 return "eevee_shadow_page_allocate";
488 return "eevee_shadow_page_clear";
490 return "eevee_shadow_page_defrag";
492 return "eevee_shadow_page_free";
494 return "eevee_shadow_page_mask";
496 return "eevee_shadow_tilemap_amend";
498 return "eevee_shadow_tilemap_bounds";
500 return "eevee_shadow_tilemap_finalize";
502 return "eevee_shadow_tilemap_rendermap";
504 return "eevee_shadow_tilemap_init";
506 return "eevee_shadow_tag_update";
508 return "eevee_shadow_tag_usage_opaque";
510 return "eevee_shadow_tag_usage_surfels";
512 return "eevee_shadow_tag_usage_transparent";
514 return "eevee_shadow_page_tile_clear";
516 return "eevee_shadow_page_tile_store";
518 return "eevee_shadow_tag_usage_volume";
520 return "eevee_shadow_view_visibility";
522 return "eevee_subsurface_convolve";
524 return "eevee_subsurface_setup";
526 return "eevee_surfel_cluster_build";
528 return "eevee_surfel_light";
530 return "eevee_surfel_list_build";
532 return "eevee_surfel_list_sort";
534 return "eevee_surfel_ray";
536 return "eevee_vertex_copy";
538 return "eevee_volume_integration";
540 return "eevee_volume_occupancy_convert";
542 return "eevee_volume_resolve";
544 return "eevee_volume_scatter";
546 return "eevee_volume_scatter_with_lights";
556 return shaders_[shader_type].get();
575 bool has_shader_to_rgba)
600 if (index_ == first_reserved_) {
601 index_ = last_reserved_ + 1;
617 bool transparent_shadows;
623 transparent_shadows);
642 info.
define(
"UNI_ATTR(a)",
"float4(0.0)");
658 info.
define(
"MAT_AMBIENT_OCCLUSION");
663 info.
define(
"MAT_TRANSPARENT");
677 int32_t closure_data_slots = 0;
679 info.
define(
"MAT_DIFFUSE");
685 closure_data_slots |= (1 << 2);
688 closure_data_slots |= (1 << 0);
692 info.
define(
"MAT_SUBSURFACE");
693 closure_data_slots |= (1 << 0);
696 info.
define(
"MAT_REFRACTION");
697 closure_data_slots |= (1 << 0);
700 info.
define(
"MAT_TRANSLUCENT");
701 closure_data_slots |= (1 << 0);
704 info.
define(
"MAT_REFLECTION");
705 closure_data_slots |= (1 << 1);
708 info.
define(
"MAT_CLEARCOAT");
709 closure_data_slots |= (1 << 2);
713 switch (closure_bin_count) {
717 info.
define(
"CLOSURE_BIN_COUNT",
"1");
720 info.
define(
"CLOSURE_BIN_COUNT",
"2");
723 info.
define(
"CLOSURE_BIN_COUNT",
"3");
731 switch (closure_bin_count) {
735 info.
define(
"GBUFFER_LAYER_MAX",
"1");
738 info.
define(
"GBUFFER_LAYER_MAX",
"2");
741 info.
define(
"GBUFFER_LAYER_MAX",
"3");
752 switch (closure_bin_count) {
758 info.
define(
"LIGHT_CLOSURE_EVAL_COUNT",
"1");
761 info.
define(
"LIGHT_CLOSURE_EVAL_COUNT",
"2");
764 info.
define(
"LIGHT_CLOSURE_EVAL_COUNT",
"3");
773 switch (geometry_type) {
776 info.
define(
"USE_BARYCENTRICS");
781 info.
define(
"USE_BARYCENTRICS");
792 std::stringstream global_vars;
793 switch (geometry_type) {
813 if (
input.name ==
"orco") {
815 global_vars <<
input.type <<
" " <<
input.name <<
";\n";
844 global_vars <<
input.type <<
" " <<
input.name <<
";\n";
860 !support_volume_attributes);
866 global_vars <<
"struct " << iface.
name <<
" {\n";
868 global_vars <<
" " <<
inout.type <<
" " <<
inout.name <<
";\n";
870 global_vars <<
"};\n";
876 std::stringstream attr_load;
877 attr_load <<
"void attrib_load()\n";
880 attr_load <<
"}\n\n";
882 std::stringstream vert_gen, frag_gen;
884 if (do_vertex_attrib_load) {
885 vert_gen << global_vars.str() << attr_load.str();
886 frag_gen <<
"void attrib_load() {}\n";
889 vert_gen <<
"void attrib_load() {}\n";
890 frag_gen << global_vars.str() << attr_load.str();
894 const bool use_vertex_displacement = !codegen.
displacement.empty() &&
898 vert_gen <<
"float3 nodetree_displacement()\n";
900 vert_gen << ((use_vertex_displacement) ? codegen.
displacement :
"return float3(0);\n");
911 info.
define(
"MAT_DISPLACEMENT_BUMP");
913 frag_gen <<
"float3 nodetree_displacement()\n";
919 frag_gen <<
"Closure nodetree_surface(float closure_rand)\n";
921 frag_gen <<
" closure_weights_reset(closure_rand);\n";
922 frag_gen << (!codegen.
surface.empty() ? codegen.
surface :
"return Closure(0);\n");
928 frag_gen <<
"float nodetree_thickness()\n";
935 frag_gen <<
"return 0.0;\n";
943 frag_gen <<
"float3 ob_scale;\n";
944 frag_gen <<
"ob_scale.x = length(drw_modelmat()[0].xyz);\n";
945 frag_gen <<
"ob_scale.y = length(drw_modelmat()[1].xyz);\n";
946 frag_gen <<
"ob_scale.z = length(drw_modelmat()[2].xyz);\n";
947 frag_gen <<
"float3 ls_dimensions = safe_rcp(abs(drw_object_infos().orco_mul.xyz));\n";
948 frag_gen <<
"float3 ws_dimensions = ob_scale * ls_dimensions;\n";
950 frag_gen <<
"return reduce_min(ws_dimensions);\n";
958 frag_gen <<
"Closure nodetree_volume()\n";
960 frag_gen <<
" closure_weights_reset(0.0);\n";
961 frag_gen << (!codegen.
volume.empty() ? codegen.
volume :
"return Closure(0);\n");
967 int reserved_attr_slots = 0;
970 switch (geometry_type) {
982 reserved_attr_slots = 2;
989 reserved_attr_slots = 1;
997 if (last_attr_index - reserved_attr_slots < 0) {
998 const char *material_name = (info.
name_.
c_str() + 2);
999 std::cerr <<
"Error: EEVEE: Material " << material_name <<
" uses too many attributes."
1007 switch (geometry_type) {
1009 switch (pipeline_type) {
1019 switch (pipeline_type) {
1101 bool transparent_shadows;
1107 transparent_shadows);
1110 bool is_prepass =
ELEM(pipeline_type,
1121 bool has_shadow_transparency = has_transparency && transparent_shadows;
1122 bool has_raytraced_transmission = blender_mat && (blender_mat->blend_flag &
MA_BL_SS_REFRACTION);
1124 bool can_use_default = (is_shadow_pass &&
1125 (!has_vertex_displacement && !has_shadow_transparency)) ||
1126 (is_prepass && (!has_vertex_displacement && !has_transparency &&
1127 !has_raytraced_transmission));
1128 if (can_use_default) {
1145 bool deferred_compilation,
1152 pipeline_type, geometry_type, displacement_type, thickness_type, blender_mat->
blend_flag);
1154 bool is_default_material = default_mat ==
nullptr;
1165 deferred_compilation,
1174 bool deferred_compilation)
1186 deferred_compilation,
General operations, lookup, etc. for materials.
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
MINLINE int count_bits_i(unsigned int n)
uint64_t GPU_material_uuid_get(GPUMaterial *mat)
GPUPass * GPU_material_get_pass(GPUMaterial *material)
bool GPU_material_flag_get(const GPUMaterial *mat, eGPUMaterialFlag flag)
@ GPU_MATFLAG_SHADER_TO_RGBA
@ GPU_MATFLAG_BARYCENTRIC
@ GPU_MATFLAG_TRANSLUCENT
@ GPU_MATFLAG_TRANSPARENT
Material * GPU_material_get_material(GPUMaterial *material)
GPUMaterial * 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)
const GPUUniformAttrList * GPU_material_uniform_attributes(const GPUMaterial *material)
bool GPU_material_has_displacement_output(GPUMaterial *mat)
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
int GPU_shader_get_constant(GPUShader *shader, const char *name)
bool GPU_shader_batch_specializations_is_ready(SpecializationBatchHandle &handle)
const blender::gpu::shader::SpecializationConstants & GPU_shader_get_default_constant_state(GPUShader *sh)
unsigned long long int uint64_t
constexpr const char * c_str() const
void append(const T &value)
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)
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)
GPUShader * static_shader_get(eShaderType shader_type)
static ShadowTechnique shadow_technique
#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 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 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 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
std::string material_functions
GPUShaderCreateInfo * create_info
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
ShaderModule * shader_module
void set_value(int index, uint32_t value)