Skip to content

Commit 0717eda

Browse files
committed
Merge pull request #107119 from DarioSamo/explicit-fp16
Optimize Mobile renderer by using FP16 explicitly.
2 parents a34d817 + 4627783 commit 0717eda

23 files changed

+940
-788
lines changed

drivers/d3d12/rendering_device_driver_d3d12.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5580,7 +5580,7 @@ uint64_t RenderingDeviceDriverD3D12::api_trait_get(ApiTrait p_trait) {
55805580

55815581
bool RenderingDeviceDriverD3D12::has_feature(Features p_feature) {
55825582
switch (p_feature) {
5583-
case SUPPORTS_FSR_HALF_FLOAT:
5583+
case SUPPORTS_HALF_FLOAT:
55845584
return shader_capabilities.native_16bit_ops && storage_buffer_capabilities.storage_buffer_16_bit_access_is_supported;
55855585
case SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS:
55865586
return true;

drivers/metal/rendering_device_driver_metal.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2725,7 +2725,7 @@ bool isArrayTexture(MTLTextureType p_type) {
27252725

27262726
bool RenderingDeviceDriverMetal::has_feature(Features p_feature) {
27272727
switch (p_feature) {
2728-
case SUPPORTS_FSR_HALF_FLOAT:
2728+
case SUPPORTS_HALF_FLOAT:
27292729
return true;
27302730
case SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS:
27312731
return true;

drivers/vulkan/rendering_device_driver_vulkan.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5888,7 +5888,7 @@ uint64_t RenderingDeviceDriverVulkan::api_trait_get(ApiTrait p_trait) {
58885888

58895889
bool RenderingDeviceDriverVulkan::has_feature(Features p_feature) {
58905890
switch (p_feature) {
5891-
case SUPPORTS_FSR_HALF_FLOAT:
5891+
case SUPPORTS_HALF_FLOAT:
58925892
return shader_capabilities.shader_float16_is_supported && physical_device_features.shaderInt16 && storage_buffer_capabilities.storage_buffer_16_bit_access_is_supported;
58935893
case SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS:
58945894
return true;

editor/plugins/shader_baker_export_plugin.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ bool ShaderBakerExportPlugin::_begin_customize_resources(const Ref<EditorExportP
130130
renderer_features.set_flag(RenderingShaderLibrary::FEATURE_VRS_BIT);
131131
}
132132

133+
// Both FP16 and FP32 variants should be included.
134+
renderer_features.set_flag(RenderingShaderLibrary::FEATURE_FP16_BIT);
135+
renderer_features.set_flag(RenderingShaderLibrary::FEATURE_FP32_BIT);
136+
133137
RendererSceneRenderRD::get_singleton()->enable_features(renderer_features);
134138

135139
// Included all shaders created by renderers and effects.

servers/rendering/renderer_rd/effects/fsr.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ FSR::FSR() {
4141
fsr_shader.initialize(fsr_upscale_modes);
4242

4343
FSRShaderVariant variant;
44-
if (RD::get_singleton()->has_feature(RD::SUPPORTS_FSR_HALF_FLOAT)) {
44+
if (RD::get_singleton()->has_feature(RD::SUPPORTS_HALF_FLOAT)) {
4545
variant = FSR_SHADER_VARIANT_NORMAL;
4646
} else {
4747
variant = FSR_SHADER_VARIANT_FALLBACK;

servers/rendering/renderer_rd/effects/fsr2.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ FSR2Effect::FSR2Effect() {
518518
capabilities.minimumSupportedShaderModel = FFX_SHADER_MODEL_5_1;
519519
capabilities.waveLaneCountMin = 32;
520520
capabilities.waveLaneCountMax = 32;
521-
capabilities.fp16Supported = RD::get_singleton()->has_feature(RD::Features::SUPPORTS_FSR_HALF_FLOAT);
521+
capabilities.fp16Supported = RD::get_singleton()->has_feature(RD::Features::SUPPORTS_HALF_FLOAT);
522522
capabilities.raytracingSupported = false;
523523

524524
String general_defines =

servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -694,14 +694,14 @@ void SceneShaderForwardClustered::init(const String p_defines) {
694694
actions.renames["EYE_OFFSET"] = "eye_offset";
695695

696696
//for light
697-
actions.renames["VIEW"] = "view";
698-
actions.renames["SPECULAR_AMOUNT"] = "specular_amount";
699-
actions.renames["LIGHT_COLOR"] = "light_color";
697+
actions.renames["VIEW"] = "view_highp";
698+
actions.renames["SPECULAR_AMOUNT"] = "specular_amount_highp";
699+
actions.renames["LIGHT_COLOR"] = "light_color_highp";
700700
actions.renames["LIGHT_IS_DIRECTIONAL"] = "is_directional";
701-
actions.renames["LIGHT"] = "light";
702-
actions.renames["ATTENUATION"] = "attenuation";
703-
actions.renames["DIFFUSE_LIGHT"] = "diffuse_light";
704-
actions.renames["SPECULAR_LIGHT"] = "specular_light";
701+
actions.renames["LIGHT"] = "light_highp";
702+
actions.renames["ATTENUATION"] = "attenuation_highp";
703+
actions.renames["DIFFUSE_LIGHT"] = "diffuse_light_highp";
704+
actions.renames["SPECULAR_LIGHT"] = "specular_light_highp";
705705

706706
actions.usage_defines["NORMAL"] = "#define NORMAL_USED\n";
707707
actions.usage_defines["TANGENT"] = "#define TANGENT_USED\n";

servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,14 @@ uint32_t RenderForwardMobile::get_pipeline_compilations(RS::PipelineSource p_sou
380380
}
381381

382382
void RenderForwardMobile::enable_features(BitField<FeatureBits> p_feature_bits) {
383+
if (p_feature_bits.has_flag(FEATURE_FP32_BIT)) {
384+
scene_shader.enable_fp32_shader_group();
385+
}
386+
387+
if (p_feature_bits.has_flag(FEATURE_FP16_BIT)) {
388+
scene_shader.enable_fp16_shader_group();
389+
}
390+
383391
if (p_feature_bits.has_flag(FEATURE_MULTIVIEW_BIT)) {
384392
scene_shader.enable_multiview_shader_group();
385393
}

servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp

Lines changed: 93 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -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

390390
uint64_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) {
446447
bool 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() {
476478
void 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+
833861
void 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

837871
bool 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

841875
SceneShaderForwardMobile::~SceneShaderForwardMobile() {

0 commit comments

Comments
 (0)