diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index d3cac4963f..538031bd6c 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -5,6 +5,8 @@ A new header is inserted each time a *tag* is created. ## v1.22.1 (currently main branch) +- Metal: Shaders now use `half` floating-point arithmetic when possible for improved performance. [⚠️ **Recompile Materials**] + ## v1.22.0 - engine: Changed UBOs layout [⚠️ **Material breakage**]. diff --git a/libs/filamat/src/GLSLPostProcessor.cpp b/libs/filamat/src/GLSLPostProcessor.cpp index 23332f491f..0f38cd3594 100644 --- a/libs/filamat/src/GLSLPostProcessor.cpp +++ b/libs/filamat/src/GLSLPostProcessor.cpp @@ -441,6 +441,13 @@ std::shared_ptr GLSLPostProcessor::createOptimizer( registerSizePasses(*optimizer, config); } else if (optimization == MaterialBuilder::Optimization::PERFORMANCE) { registerPerformancePasses(*optimizer, config); + // Metal doesn't support relaxed precision, but does have support for float16 math operations. + if (config.targetApi == MaterialBuilder::TargetApi::METAL) { + optimizer->RegisterPass(CreateConvertRelaxedToHalfPass()); + optimizer->RegisterPass(CreateSimplificationPass()); + optimizer->RegisterPass(CreateRedundancyEliminationPass()); + optimizer->RegisterPass(CreateAggressiveDCEPass()); + } } return optimizer; diff --git a/libs/filamat/src/GLSLPostProcessor.h b/libs/filamat/src/GLSLPostProcessor.h index 90d4fd263a..df6a3c8ad9 100644 --- a/libs/filamat/src/GLSLPostProcessor.h +++ b/libs/filamat/src/GLSLPostProcessor.h @@ -51,6 +51,7 @@ public: struct Config { filament::Variant variant; + MaterialBuilder::TargetApi targetApi; filament::backend::ShaderType shaderType; filament::backend::ShaderModel shaderModel; filament::MaterialDomain domain; diff --git a/libs/filamat/src/MaterialBuilder.cpp b/libs/filamat/src/MaterialBuilder.cpp index c67e38fd23..30310a76ba 100644 --- a/libs/filamat/src/MaterialBuilder.cpp +++ b/libs/filamat/src/MaterialBuilder.cpp @@ -727,6 +727,7 @@ bool MaterialBuilder::generateShaders(JobSystem& jobSystem, const std::vector