@@ -381,14 +381,15 @@ RID SceneShaderForwardMobile::ShaderData::get_shader_variant(ShaderVersion p_sha
381381 if (version.is_valid ()) {
382382 MutexLock lock (SceneShaderForwardMobile::singleton_mutex);
383383 ERR_FAIL_NULL_V (SceneShaderForwardMobile::singleton, RID ());
384- return SceneShaderForwardMobile::singleton->shader .version_get_shader (version, p_shader_version + (p_ubershader ? SHADER_VERSION_MAX : 0 ));
384+ return SceneShaderForwardMobile::singleton->shader .version_get_shader (version, p_shader_version + (SceneShaderForwardMobile::singleton-> use_fp16 ? SHADER_VERSION_MAX * 2 : 0 ) + ( p_ubershader ? SHADER_VERSION_MAX : 0 ));
385385 } else {
386386 return RID ();
387387 }
388388}
389389
390390uint64_t SceneShaderForwardMobile::ShaderData::get_vertex_input_mask (ShaderVersion p_shader_version, bool p_ubershader) {
391391 // Vertex input masks require knowledge of the shader. Since querying the shader can be expensive due to high contention and the necessary mutex, we cache the result instead.
392+ // It is intentional for the range of the input masks to be different than the versions available in the shaders as it'll only ever use the regular variants or the FP16 ones.
392393 uint32_t input_mask_index = p_shader_version + (p_ubershader ? SHADER_VERSION_MAX : 0 );
393394 uint64_t input_mask = vertex_input_masks[input_mask_index].load (std::memory_order_relaxed);
394395 if (input_mask == 0 ) {
@@ -446,7 +447,8 @@ void SceneShaderForwardMobile::MaterialData::set_next_pass(RID p_pass) {
446447bool SceneShaderForwardMobile::MaterialData::update_parameters (const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty) {
447448 if (shader_data->version .is_valid ()) {
448449 MutexLock lock (SceneShaderForwardMobile::singleton_mutex);
449- return update_parameters_uniform_set (p_parameters, p_uniform_dirty, p_textures_dirty, shader_data->uniforms , shader_data->ubo_offsets .ptr (), shader_data->texture_uniforms , shader_data->default_texture_params , shader_data->ubo_size , uniform_set, SceneShaderForwardMobile::singleton->shader .version_get_shader (shader_data->version , 0 ), RenderForwardMobile::MATERIAL_UNIFORM_SET, true , true );
450+ RID base_shader = SceneShaderForwardMobile::singleton->shader .version_get_shader (shader_data->version , (SceneShaderForwardMobile::singleton->use_fp16 ? SHADER_VERSION_MAX * 2 : 0 ));
451+ return update_parameters_uniform_set (p_parameters, p_uniform_dirty, p_textures_dirty, shader_data->uniforms , shader_data->ubo_offsets .ptr (), shader_data->texture_uniforms , shader_data->default_texture_params , shader_data->ubo_size , uniform_set, base_shader, RenderForwardMobile::MATERIAL_UNIFORM_SET, true , true );
450452 } else {
451453 return false ;
452454 }
@@ -476,6 +478,9 @@ SceneShaderForwardMobile::SceneShaderForwardMobile() {
476478void SceneShaderForwardMobile::init (const String p_defines) {
477479 RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton ();
478480
481+ // Store whether the shader will prefer using the FP16 variant.
482+ use_fp16 = RD::get_singleton ()->has_feature (RD::SUPPORTS_HALF_FLOAT);
483+
479484 // Immutable samplers : create the shadow sampler to be passed when creating the pipeline.
480485 {
481486 RD::SamplerState sampler;
@@ -490,19 +495,26 @@ void SceneShaderForwardMobile::init(const String p_defines) {
490495
491496 {
492497 Vector<ShaderRD::VariantDefine> shader_versions;
493- for (uint32_t ubershader = 0 ; ubershader < 2 ; ubershader++) {
494- const String base_define = ubershader ? " \n #define UBERSHADER\n " : " " ;
495- shader_versions.push_back (ShaderRD::VariantDefine (SHADER_GROUP_BASE, base_define + " " , true )); // SHADER_VERSION_COLOR_PASS
496- shader_versions.push_back (ShaderRD::VariantDefine (SHADER_GROUP_BASE, base_define + " \n #define USE_LIGHTMAP\n " , true )); // SHADER_VERSION_LIGHTMAP_COLOR_PASS
497- shader_versions.push_back (ShaderRD::VariantDefine (SHADER_GROUP_BASE, base_define + " \n #define MODE_RENDER_DEPTH\n #define SHADOW_PASS\n " , true )); // SHADER_VERSION_SHADOW_PASS, should probably change this to MODE_RENDER_SHADOW because we don't have a depth pass here...
498- shader_versions.push_back (ShaderRD::VariantDefine (SHADER_GROUP_BASE, base_define + " \n #define MODE_RENDER_DEPTH\n #define MODE_DUAL_PARABOLOID\n #define SHADOW_PASS\n " , true )); // SHADER_VERSION_SHADOW_PASS_DP
499- shader_versions.push_back (ShaderRD::VariantDefine (SHADER_GROUP_BASE, base_define + " \n #define MODE_RENDER_DEPTH\n #define MODE_RENDER_MATERIAL\n " , true )); // SHADER_VERSION_DEPTH_PASS_WITH_MATERIAL
500-
501- // Multiview versions of our shaders.
502- shader_versions.push_back (ShaderRD::VariantDefine (SHADER_GROUP_MULTIVIEW, base_define + " \n #define USE_MULTIVIEW\n " , false )); // SHADER_VERSION_COLOR_PASS_MULTIVIEW
503- shader_versions.push_back (ShaderRD::VariantDefine (SHADER_GROUP_MULTIVIEW, base_define + " \n #define USE_MULTIVIEW\n #define USE_LIGHTMAP\n " , false )); // SHADER_VERSION_LIGHTMAP_COLOR_PASS_MULTIVIEW
504- shader_versions.push_back (ShaderRD::VariantDefine (SHADER_GROUP_MULTIVIEW, base_define + " \n #define USE_MULTIVIEW\n #define MODE_RENDER_DEPTH\n #define SHADOW_PASS\n " , false )); // SHADER_VERSION_SHADOW_PASS_MULTIVIEW
505- shader_versions.push_back (ShaderRD::VariantDefine (SHADER_GROUP_MULTIVIEW, base_define + " \n #define USE_MULTIVIEW\n #define MODE_RENDER_MOTION_VECTORS\n " , false )); // SHADER_VERSION_MOTION_VECTORS_MULTIVIEW
498+ for (uint32_t fp16 = 0 ; fp16 < 2 ; fp16++) {
499+ for (uint32_t ubershader = 0 ; ubershader < 2 ; ubershader++) {
500+ String base_define = fp16 ? " \n #define EXPLICIT_FP16\n " : " " ;
501+ int shader_group = fp16 ? SHADER_GROUP_FP16 : SHADER_GROUP_FP32;
502+ int shader_group_multiview = fp16 ? SHADER_GROUP_FP16_MULTIVIEW : SHADER_GROUP_FP32_MULTIVIEW;
503+ base_define += ubershader ? " \n #define UBERSHADER\n " : " " ;
504+
505+ bool default_enabled = (uint32_t (use_fp16) == fp16);
506+ shader_versions.push_back (ShaderRD::VariantDefine (shader_group, base_define + " " , default_enabled)); // SHADER_VERSION_COLOR_PASS
507+ shader_versions.push_back (ShaderRD::VariantDefine (shader_group, base_define + " \n #define USE_LIGHTMAP\n " , default_enabled)); // SHADER_VERSION_LIGHTMAP_COLOR_PASS
508+ shader_versions.push_back (ShaderRD::VariantDefine (shader_group, base_define + " \n #define MODE_RENDER_DEPTH\n #define SHADOW_PASS\n " , default_enabled)); // SHADER_VERSION_SHADOW_PASS, should probably change this to MODE_RENDER_SHADOW because we don't have a depth pass here...
509+ shader_versions.push_back (ShaderRD::VariantDefine (shader_group, base_define + " \n #define MODE_RENDER_DEPTH\n #define MODE_DUAL_PARABOLOID\n #define SHADOW_PASS\n " , default_enabled)); // SHADER_VERSION_SHADOW_PASS_DP
510+ shader_versions.push_back (ShaderRD::VariantDefine (shader_group, base_define + " \n #define MODE_RENDER_DEPTH\n #define MODE_RENDER_MATERIAL\n " , default_enabled)); // SHADER_VERSION_DEPTH_PASS_WITH_MATERIAL
511+
512+ // Multiview versions of our shaders.
513+ shader_versions.push_back (ShaderRD::VariantDefine (shader_group_multiview, base_define + " \n #define USE_MULTIVIEW\n " , false )); // SHADER_VERSION_COLOR_PASS_MULTIVIEW
514+ shader_versions.push_back (ShaderRD::VariantDefine (shader_group_multiview, base_define + " \n #define USE_MULTIVIEW\n #define USE_LIGHTMAP\n " , false )); // SHADER_VERSION_LIGHTMAP_COLOR_PASS_MULTIVIEW
515+ shader_versions.push_back (ShaderRD::VariantDefine (shader_group_multiview, base_define + " \n #define USE_MULTIVIEW\n #define MODE_RENDER_DEPTH\n #define SHADOW_PASS\n " , false )); // SHADER_VERSION_SHADOW_PASS_MULTIVIEW
516+ shader_versions.push_back (ShaderRD::VariantDefine (shader_group_multiview, base_define + " \n #define USE_MULTIVIEW\n #define MODE_RENDER_MOTION_VECTORS\n " , false )); // SHADER_VERSION_MOTION_VECTORS_MULTIVIEW
517+ }
506518 }
507519
508520 Vector<RD::PipelineImmutableSampler> immutable_samplers;
@@ -514,7 +526,7 @@ void SceneShaderForwardMobile::init(const String p_defines) {
514526 shader.initialize (shader_versions, p_defines, immutable_samplers);
515527
516528 if (RendererCompositorRD::get_singleton ()->is_xr_enabled ()) {
517- shader. enable_group (SHADER_GROUP_MULTIVIEW );
529+ enable_multiview_shader_group ( );
518530 }
519531 }
520532
@@ -536,21 +548,21 @@ void SceneShaderForwardMobile::init(const String p_defines) {
536548 actions.renames [" MAIN_CAM_INV_VIEW_MATRIX" ] = " scene_data.main_cam_inv_view_matrix" ;
537549
538550 actions.renames [" VERTEX" ] = " vertex" ;
539- actions.renames [" NORMAL" ] = " normal " ;
540- actions.renames [" TANGENT" ] = " tangent " ;
541- actions.renames [" BINORMAL" ] = " binormal " ;
551+ actions.renames [" NORMAL" ] = " normal_highp " ;
552+ actions.renames [" TANGENT" ] = " tangent_highp " ;
553+ actions.renames [" BINORMAL" ] = " binormal_highp " ;
542554 actions.renames [" POSITION" ] = " position" ;
543555 actions.renames [" UV" ] = " uv_interp" ;
544556 actions.renames [" UV2" ] = " uv2_interp" ;
545- actions.renames [" COLOR" ] = " color_interp " ;
557+ actions.renames [" COLOR" ] = " color_highp " ;
546558 actions.renames [" POINT_SIZE" ] = " gl_PointSize" ;
547559 actions.renames [" INSTANCE_ID" ] = " gl_InstanceIndex" ;
548560 actions.renames [" VERTEX_ID" ] = " gl_VertexIndex" ;
549561 actions.renames [" Z_CLIP_SCALE" ] = " z_clip_scale" ;
550562
551- actions.renames [" ALPHA_SCISSOR_THRESHOLD" ] = " alpha_scissor_threshold " ;
552- actions.renames [" ALPHA_HASH_SCALE" ] = " alpha_hash_scale " ;
553- actions.renames [" ALPHA_ANTIALIASING_EDGE" ] = " alpha_antialiasing_edge " ;
563+ actions.renames [" ALPHA_SCISSOR_THRESHOLD" ] = " alpha_scissor_threshold_highp " ;
564+ actions.renames [" ALPHA_HASH_SCALE" ] = " alpha_hash_scale_highp " ;
565+ actions.renames [" ALPHA_ANTIALIASING_EDGE" ] = " alpha_antialiasing_edge_highp " ;
554566 actions.renames [" ALPHA_TEXTURE_COORDINATE" ] = " alpha_texture_coordinate" ;
555567
556568 // builtins
@@ -567,36 +579,36 @@ void SceneShaderForwardMobile::init(const String p_defines) {
567579
568580 actions.renames [" FRAGCOORD" ] = " gl_FragCoord" ;
569581 actions.renames [" FRONT_FACING" ] = " gl_FrontFacing" ;
570- actions.renames [" NORMAL_MAP" ] = " normal_map " ;
571- actions.renames [" NORMAL_MAP_DEPTH" ] = " normal_map_depth " ;
572- actions.renames [" BENT_NORMAL_MAP" ] = " bent_normal_map " ;
573- actions.renames [" ALBEDO" ] = " albedo " ;
574- actions.renames [" ALPHA" ] = " alpha " ;
575- actions.renames [" PREMUL_ALPHA_FACTOR" ] = " premul_alpha " ;
576- actions.renames [" METALLIC" ] = " metallic " ;
577- actions.renames [" SPECULAR" ] = " specular " ;
578- actions.renames [" ROUGHNESS" ] = " roughness " ;
579- actions.renames [" RIM" ] = " rim " ;
580- actions.renames [" RIM_TINT" ] = " rim_tint " ;
581- actions.renames [" CLEARCOAT" ] = " clearcoat " ;
582- actions.renames [" CLEARCOAT_ROUGHNESS" ] = " clearcoat_roughness " ;
583- actions.renames [" ANISOTROPY" ] = " anisotropy " ;
584- actions.renames [" ANISOTROPY_FLOW" ] = " anisotropy_flow " ;
585- actions.renames [" SSS_STRENGTH" ] = " sss_strength " ;
586- actions.renames [" SSS_TRANSMITTANCE_COLOR" ] = " transmittance_color " ;
587- actions.renames [" SSS_TRANSMITTANCE_DEPTH" ] = " transmittance_depth " ;
588- actions.renames [" SSS_TRANSMITTANCE_BOOST" ] = " transmittance_boost " ;
589- actions.renames [" BACKLIGHT" ] = " backlight " ;
590- actions.renames [" AO" ] = " ao " ;
591- actions.renames [" AO_LIGHT_AFFECT" ] = " ao_light_affect " ;
592- actions.renames [" EMISSION" ] = " emission " ;
582+ actions.renames [" NORMAL_MAP" ] = " normal_map_highp " ;
583+ actions.renames [" NORMAL_MAP_DEPTH" ] = " normal_map_depth_highp " ;
584+ actions.renames [" BENT_NORMAL_MAP" ] = " bent_normal_map_highp " ;
585+ actions.renames [" ALBEDO" ] = " albedo_highp " ;
586+ actions.renames [" ALPHA" ] = " alpha_highp " ;
587+ actions.renames [" PREMUL_ALPHA_FACTOR" ] = " premul_alpha_highp " ;
588+ actions.renames [" METALLIC" ] = " metallic_highp " ;
589+ actions.renames [" SPECULAR" ] = " specular_highp " ;
590+ actions.renames [" ROUGHNESS" ] = " roughness_highp " ;
591+ actions.renames [" RIM" ] = " rim_highp " ;
592+ actions.renames [" RIM_TINT" ] = " rim_tint_highp " ;
593+ actions.renames [" CLEARCOAT" ] = " clearcoat_highp " ;
594+ actions.renames [" CLEARCOAT_ROUGHNESS" ] = " clearcoat_roughness_highp " ;
595+ actions.renames [" ANISOTROPY" ] = " anisotropy_highp " ;
596+ actions.renames [" ANISOTROPY_FLOW" ] = " anisotropy_flow_highp " ;
597+ actions.renames [" SSS_STRENGTH" ] = " sss_strength_highp " ;
598+ actions.renames [" SSS_TRANSMITTANCE_COLOR" ] = " transmittance_color_highp " ;
599+ actions.renames [" SSS_TRANSMITTANCE_DEPTH" ] = " transmittance_depth_highp " ;
600+ actions.renames [" SSS_TRANSMITTANCE_BOOST" ] = " transmittance_boost_highp " ;
601+ actions.renames [" BACKLIGHT" ] = " backlight_highp " ;
602+ actions.renames [" AO" ] = " ao_highp " ;
603+ actions.renames [" AO_LIGHT_AFFECT" ] = " ao_light_affect_highp " ;
604+ actions.renames [" EMISSION" ] = " emission_highp " ;
593605 actions.renames [" POINT_COORD" ] = " gl_PointCoord" ;
594606 actions.renames [" INSTANCE_CUSTOM" ] = " instance_custom" ;
595607 actions.renames [" SCREEN_UV" ] = " screen_uv" ;
596608 actions.renames [" DEPTH" ] = " gl_FragDepth" ;
597- actions.renames [" FOG" ] = " fog " ;
598- actions.renames [" RADIANCE" ] = " custom_radiance " ;
599- actions.renames [" IRRADIANCE" ] = " custom_irradiance " ;
609+ actions.renames [" FOG" ] = " fog_highp " ;
610+ actions.renames [" RADIANCE" ] = " custom_radiance_highp " ;
611+ actions.renames [" IRRADIANCE" ] = " custom_irradiance_highp " ;
600612 actions.renames [" BONE_INDICES" ] = " bone_attrib" ;
601613 actions.renames [" BONE_WEIGHTS" ] = " weight_attrib" ;
602614 actions.renames [" CUSTOM0" ] = " custom0_attrib" ;
@@ -617,14 +629,14 @@ void SceneShaderForwardMobile::init(const String p_defines) {
617629 actions.renames [" EYE_OFFSET" ] = " eye_offset" ;
618630
619631 // for light
620- actions.renames [" VIEW" ] = " view " ;
621- actions.renames [" SPECULAR_AMOUNT" ] = " specular_amount " ;
622- actions.renames [" LIGHT_COLOR" ] = " light_color " ;
632+ actions.renames [" VIEW" ] = " view_highp " ;
633+ actions.renames [" SPECULAR_AMOUNT" ] = " specular_amount_highp " ;
634+ actions.renames [" LIGHT_COLOR" ] = " light_color_highp " ;
623635 actions.renames [" LIGHT_IS_DIRECTIONAL" ] = " is_directional" ;
624- actions.renames [" LIGHT" ] = " light " ;
625- actions.renames [" ATTENUATION" ] = " attenuation " ;
626- actions.renames [" DIFFUSE_LIGHT" ] = " diffuse_light " ;
627- actions.renames [" SPECULAR_LIGHT" ] = " specular_light " ;
636+ actions.renames [" LIGHT" ] = " light_highp " ;
637+ actions.renames [" ATTENUATION" ] = " attenuation_highp " ;
638+ actions.renames [" DIFFUSE_LIGHT" ] = " diffuse_light_highp " ;
639+ actions.renames [" SPECULAR_LIGHT" ] = " specular_light_highp " ;
628640
629641 actions.usage_defines [" NORMAL" ] = " #define NORMAL_USED\n " ;
630642 actions.usage_defines [" TANGENT" ] = " #define TANGENT_USED\n " ;
@@ -749,7 +761,7 @@ void fragment() {
749761 material_storage->material_set_shader (default_material, default_shader);
750762
751763 MaterialData *md = static_cast <MaterialData *>(material_storage->material_get_data (default_material, RendererRD::MaterialStorage::SHADER_TYPE_3D));
752- default_shader_rd = shader.version_get_shader (md->shader_data ->version , SHADER_VERSION_COLOR_PASS);
764+ default_shader_rd = shader.version_get_shader (md->shader_data ->version , (use_fp16 ? SHADER_VERSION_MAX * 2 : 0 ) + SHADER_VERSION_COLOR_PASS);
753765
754766 default_material_shader_ptr = md->shader_data ;
755767 default_material_uniform_set = md->uniform_set ;
@@ -830,12 +842,34 @@ uint32_t SceneShaderForwardMobile::get_pipeline_compilations(RS::PipelineSource
830842 return pipeline_compilations[p_source];
831843}
832844
845+ void SceneShaderForwardMobile::enable_fp32_shader_group () {
846+ shader.enable_group (SHADER_GROUP_FP32);
847+
848+ if (is_multiview_shader_group_enabled ()) {
849+ enable_multiview_shader_group ();
850+ }
851+ }
852+
853+ void SceneShaderForwardMobile::enable_fp16_shader_group () {
854+ shader.enable_group (SHADER_GROUP_FP16);
855+
856+ if (is_multiview_shader_group_enabled ()) {
857+ enable_multiview_shader_group ();
858+ }
859+ }
860+
833861void SceneShaderForwardMobile::enable_multiview_shader_group () {
834- shader.enable_group (SHADER_GROUP_MULTIVIEW);
862+ if (shader.is_group_enabled (SHADER_GROUP_FP32)) {
863+ shader.enable_group (SHADER_GROUP_FP32_MULTIVIEW);
864+ }
865+
866+ if (shader.is_group_enabled (SHADER_GROUP_FP16)) {
867+ shader.enable_group (SHADER_GROUP_FP16_MULTIVIEW);
868+ }
835869}
836870
837871bool SceneShaderForwardMobile::is_multiview_shader_group_enabled () const {
838- return shader.is_group_enabled (SHADER_GROUP_MULTIVIEW );
872+ return shader.is_group_enabled (SHADER_GROUP_FP32_MULTIVIEW) || shader. is_group_enabled (SHADER_GROUP_FP16_MULTIVIEW );
839873}
840874
841875SceneShaderForwardMobile::~SceneShaderForwardMobile () {
0 commit comments