Title: [279606] trunk/Source/ThirdParty/ANGLE
Revision
279606
Author
kpidding...@apple.com
Date
2021-07-06 12:33:10 -0700 (Tue, 06 Jul 2021)

Log Message

REGRESSION (r279466):  [Big Sur] webgl/1.0.3/conformance & webgl/2.0.0/conformance are failing
https://bugs.webkit.org/show_bug.cgi?id=227596
Provide Intel workaround for Big Sur systems. Atan and invariant have
issues on older systems, and require us to disable fastmath to produce correct results.

Reviewed by Kenneth Russell.

* include/platform/FeaturesMtl.h:
* src/compiler/translator/TranslatorMetalDirect.h:
(sh::TranslatorMetalReflection::reset):
* src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp:
(GenMetalTraverser::emitPostQualifier):
(GenMetalTraverser::visitUnary):
(GenMetalTraverser::visitAggregate):
* src/libANGLE/renderer/metal/DisplayMtl.mm:
(rx::DisplayMtl::initializeFeatures):
* src/libANGLE/renderer/metal/ProgramMtl.h:
(rx::ProgramMtl::getTranslatedShaderInfo const):
* src/libANGLE/renderer/metal/ProgramMtl.mm:
* src/libANGLE/renderer/metal/mtl_glslang_mtl_utils.h:
* src/libANGLE/renderer/metal/mtl_glslang_mtl_utils.mm:
(rx::mtl::GlslangGetMSL):
* src/libANGLE/renderer/metal/mtl_render_utils.h:
* src/libANGLE/renderer/metal/mtl_render_utils.mm:
(rx::mtl::TransformFeedbackUtils::createMslXfbLibrary):
(rx::mtl::TransformFeedbackUtils::getTransformFeedbackRenderPipeline):
* src/libANGLE/renderer/metal/mtl_utils.h:
* src/libANGLE/renderer/metal/mtl_utils.mm:
(rx::mtl::CreateShaderLibrary):

Modified Paths

Diff

Modified: trunk/Source/ThirdParty/ANGLE/ChangeLog (279605 => 279606)


--- trunk/Source/ThirdParty/ANGLE/ChangeLog	2021-07-06 19:30:34 UTC (rev 279605)
+++ trunk/Source/ThirdParty/ANGLE/ChangeLog	2021-07-06 19:33:10 UTC (rev 279606)
@@ -1,3 +1,35 @@
+2021-07-06  Kyle Piddington  <kpidding...@apple.com>
+
+        REGRESSION (r279466):  [Big Sur] webgl/1.0.3/conformance & webgl/2.0.0/conformance are failing
+        https://bugs.webkit.org/show_bug.cgi?id=227596
+        Provide Intel workaround for Big Sur systems. Atan and invariant have 
+        issues on older systems, and require us to disable fastmath to produce correct results. 
+
+        Reviewed by Kenneth Russell.
+
+        * include/platform/FeaturesMtl.h:
+        * src/compiler/translator/TranslatorMetalDirect.h:
+        (sh::TranslatorMetalReflection::reset):
+        * src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp:
+        (GenMetalTraverser::emitPostQualifier):
+        (GenMetalTraverser::visitUnary):
+        (GenMetalTraverser::visitAggregate):
+        * src/libANGLE/renderer/metal/DisplayMtl.mm:
+        (rx::DisplayMtl::initializeFeatures):
+        * src/libANGLE/renderer/metal/ProgramMtl.h:
+        (rx::ProgramMtl::getTranslatedShaderInfo const):
+        * src/libANGLE/renderer/metal/ProgramMtl.mm:
+        * src/libANGLE/renderer/metal/mtl_glslang_mtl_utils.h:
+        * src/libANGLE/renderer/metal/mtl_glslang_mtl_utils.mm:
+        (rx::mtl::GlslangGetMSL):
+        * src/libANGLE/renderer/metal/mtl_render_utils.h:
+        * src/libANGLE/renderer/metal/mtl_render_utils.mm:
+        (rx::mtl::TransformFeedbackUtils::createMslXfbLibrary):
+        (rx::mtl::TransformFeedbackUtils::getTransformFeedbackRenderPipeline):
+        * src/libANGLE/renderer/metal/mtl_utils.h:
+        * src/libANGLE/renderer/metal/mtl_utils.mm:
+        (rx::mtl::CreateShaderLibrary):
+
 2021-07-01  Ben Nham  <n...@apple.com>
 
         Unreviewed, reverting r279172.

Modified: trunk/Source/ThirdParty/ANGLE/include/platform/FeaturesMtl.h (279605 => 279606)


--- trunk/Source/ThirdParty/ANGLE/include/platform/FeaturesMtl.h	2021-07-06 19:30:34 UTC (rev 279605)
+++ trunk/Source/ThirdParty/ANGLE/include/platform/FeaturesMtl.h	2021-07-06 19:33:10 UTC (rev 279606)
@@ -130,6 +130,10 @@
             "intel_explicit_bool_cast_workaround", FeatureCategory::MetalWorkarounds,
             "Insert explicit casts for float/double/unsigned/signed int on macOS 10.15 with Intel driver",
             &members};
+    Feature intelDisableFastMath = {
+            "intel_disable_fast_math", FeatureCategory::MetalWorkarounds,
+            "Disable fast math in atan and invariance cases when running below macOS 12.0",
+            &members};
 };
 
 }  // namespace angle

Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp (279605 => 279606)


--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp	2021-07-06 19:30:34 UTC (rev 279605)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp	2021-07-06 19:33:10 UTC (rev 279606)
@@ -979,6 +979,9 @@
     if (isInvariant)
     {
         mOut << " [[invariant]]";
+        TranslatorMetalReflection *reflection =
+            ((sh::TranslatorMetalDirect *)&mCompiler)->getTranslatorMetalReflection();
+        reflection->hasInvariance = true;
     }
 }
 
@@ -2136,6 +2139,12 @@
     else
     {
         const TOperator op = aggregateNode->getOp();
+        if(op == EOpAtan)
+        {
+            TranslatorMetalReflection *reflection =
+                ((sh::TranslatorMetalDirect *)&mCompiler)->getTranslatorMetalReflection();
+            reflection->hasAtan = true;
+        }
         switch (op)
         {
             case TOperator::EOpCallFunctionInAST:

Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect.h (279605 => 279606)


--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect.h	2021-07-06 19:30:34 UTC (rev 279605)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect.h	2021-07-06 19:33:10 UTC (rev 279606)
@@ -120,6 +120,8 @@
     {
         hasUBOs = false;
         hasFlatInput = false;
+        hasAtan = false;
+        hasInvariance = false;
         originalNames.clear();
         samplerBindings.clear();
         textureBindings.clear();
@@ -129,6 +131,8 @@
 
     bool hasUBOs = false;
     bool hasFlatInput = false;
+    bool hasAtan = false;
+    bool hasInvariance = false;
 
   private:
     originalNamesMap originalNames;

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/DisplayMtl.mm (279605 => 279606)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/DisplayMtl.mm	2021-07-06 19:30:34 UTC (rev 279605)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/DisplayMtl.mm	2021-07-06 19:33:10 UTC (rev 279606)
@@ -977,6 +977,7 @@
 
     ANGLE_FEATURE_CONDITION((&mFeatures), intelThinMipmapWorkaround, isIntel());
     ANGLE_FEATURE_CONDITION((&mFeatures), intelExplicitBoolCastWorkaround, isIntel() && GetMacOSVersion() < OSVersion(11, 0, 0));
+    ANGLE_FEATURE_CONDITION((&mFeatures), intelDisableFastMath, isIntel() && GetMacOSVersion() < OSVersion(12, 0, 0));
 
     angle::PlatformMethods *platform = ANGLEPlatformCurrent();
     platform->overrideFeaturesMtl(platform, &mFeatures);

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProgramMtl.h (279605 => 279606)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProgramMtl.h	2021-07-06 19:30:34 UTC (rev 279605)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProgramMtl.h	2021-07-06 19:33:10 UTC (rev 279606)
@@ -153,6 +153,9 @@
 
     std::array<uint32_t, mtl::kMaxShaderXFBs> getXfbBindings() const { return mXfbBindings; }
     std::string getTranslatedShaderSource(const gl::ShaderType shaderType) const { return mMslShaderTranslateInfo[shaderType].metalShaderSource; }
+    
+    mtl::TranslatedShaderInfo getTranslatedShaderInfo(const gl::ShaderType shaderType) const { return mMslShaderTranslateInfo[shaderType]; }
+    
     bool hasFlatAttribute();
     
     mtl::RenderPipelineCache *mMetalXfbRenderPipelineCache;

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProgramMtl.mm (279605 => 279606)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProgramMtl.mm	2021-07-06 19:30:34 UTC (rev 279605)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProgramMtl.mm	2021-07-06 19:33:10 UTC (rev 279606)
@@ -734,8 +734,9 @@
 
         // Convert to actual binary shader
         mtl::AutoObjCPtr<NSError *> err = nil;
+        bool disableFastMath = (context->getDisplay()->getFeatures().intelDisableFastMath.enabled && translatedMslInfo->hasInvariantOrAtan);
         translatedMslInfo->metalLibrary =
-            mtl::CreateShaderLibrary(mtlDevice, translatedMslInfo->metalShaderSource, substitutionMacros, &err);
+            mtl::CreateShaderLibrary(mtlDevice, translatedMslInfo->metalShaderSource, substitutionMacros, !disableFastMath, &err);
         if (err && !translatedMslInfo->metalLibrary)
         {
             std::ostringstream ss;
@@ -821,6 +822,7 @@
         {
             stream->writeInt<uint32_t>(uboBinding);
         }
+        stream->writeBool(mMslShaderTranslateInfo[shaderType].hasInvariantOrAtan);
     }
 }
 
@@ -840,6 +842,7 @@
         {
             uboBinding = stream->readInt<uint32_t>();
         }
+        mMslShaderTranslateInfo[shaderType].hasInvariantOrAtan = stream->readBool();
     }
 }
 

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_glslang_mtl_utils.h (279605 => 279606)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_glslang_mtl_utils.h	2021-07-06 19:30:34 UTC (rev 279605)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_glslang_mtl_utils.h	2021-07-06 19:33:10 UTC (rev 279606)
@@ -34,6 +34,7 @@
     std::array<uint32_t, kMaxGLUBOBindings> actualUBOBindings;
     std::array<uint32_t, kMaxShaderXFBs> actualXFBBindings;
     bool hasUBOArgumentBuffer;
+    bool hasInvariantOrAtan;
 };
 void MSLGetShaderSource(const gl::ProgramState &programState,
                         const gl::ProgramLinkedResources &resources,

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_glslang_mtl_utils.mm (279605 => 279606)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_glslang_mtl_utils.mm	2021-07-06 19:30:34 UTC (rev 279605)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_glslang_mtl_utils.mm	2021-07-06 19:33:10 UTC (rev 279606)
@@ -454,6 +454,7 @@
             GetAssignedSamplerBindings(reflection, originalSamplerBindings, structSamplers,
                                        &mslShaderInfoOut->at(type).actualSamplerBindings);
         }
+        (*mslShaderInfoOut)[type].hasInvariantOrAtan = reflection->hasAtan || reflection->hasInvariance;
     }
     return angle::Result::Continue;
 }

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_render_utils.h (279605 => 279606)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_render_utils.h	2021-07-06 19:30:34 UTC (rev 279605)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_render_utils.h	2021-07-06 19:33:10 UTC (rev 279606)
@@ -578,7 +578,8 @@
 
   private:
     AutoObjCPtr<id<MTLLibrary>> createMslXfbLibrary(ContextMtl *contextMtl,
-                                                    const std::string &translatedMsl);
+                                                    const std::string &translatedMsl,
+                                                    bool enableFastMath);
 };
 
 // RenderUtils: container class of various util classes above

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_render_utils.mm (279605 => 279606)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_render_utils.mm	2021-07-06 19:30:34 UTC (rev 279605)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_render_utils.mm	2021-07-06 19:33:10 UTC (rev 279606)
@@ -3046,17 +3046,17 @@
 
 AutoObjCPtr<id<MTLLibrary>> TransformFeedbackUtils::createMslXfbLibrary(
     ContextMtl *contextMtl,
-    const std::string &translatedMsl)
+    const std::string &translatedMsl,
+    bool enableFastMath)
 {
     ANGLE_MTL_OBJC_SCOPE
     {
         DisplayMtl *display     = contextMtl->getDisplay();
         id<MTLDevice> mtlDevice = display->getMetalDevice();
-
         // Convert to actual binary shader
         mtl::AutoObjCPtr<NSError *> err = nil;
         mtl::AutoObjCPtr<id<MTLLibrary>> mtlShaderLib =
-        mtl::CreateShaderLibrary(mtlDevice, translatedMsl, @{@"TRANSFORM_FEEDBACK_ENABLED": @"1"}, &err);
+        mtl::CreateShaderLibrary(mtlDevice, translatedMsl, @{@"TRANSFORM_FEEDBACK_ENABLED": @"1"}, enableFastMath, &err);
         if (err && !mtlShaderLib)
         {
             NSLog(@"%@", err.get());
@@ -3074,13 +3074,13 @@
 {
     const ProgramMtl *programMtl = mtl::GetImpl(contextMtl->getState().getProgram());
     RenderPipelineCache &cache   = *programMtl->mMetalXfbRenderPipelineCache;
-
+    bool disableFastMath = contextMtl->getDisplay()->getFeatures().intelDisableFastMath.enabled &&  programMtl->getTranslatedShaderInfo(gl::ShaderType::Vertex).hasInvariantOrAtan;
     if (!cache.getVertexShader())
     {
         // Pipeline cache not intialized, do it now:
         ANGLE_MTL_OBJC_SCOPE
         {
-            auto shaderLib = createMslXfbLibrary(contextMtl, programMtl->getTranslatedShaderSource(gl::ShaderType::Vertex));
+            auto shaderLib = createMslXfbLibrary(contextMtl, programMtl->getTranslatedShaderSource(gl::ShaderType::Vertex), !disableFastMath);
             // Non specialized constants provided, use default creation function.
             EnsureVertexShaderOnlyPipelineCacheInitialized(contextMtl, SHADER_ENTRY_NAME, shaderLib,
                                                            &cache);

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.h (279605 => 279606)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.h	2021-07-06 19:30:34 UTC (rev 279605)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.h	2021-07-06 19:33:10 UTC (rev 279606)
@@ -88,6 +88,7 @@
 AutoObjCPtr<id<MTLLibrary>> CreateShaderLibrary(id<MTLDevice> metalDevice,
                                                 const std::string &source,
                                                 NSDictionary<NSString *, NSObject *> * substitutionDictionary,
+                                                bool enableFastMath,
                                                 AutoObjCPtr<NSError *> *error);
 
 AutoObjCPtr<id<MTLLibrary>> CreateShaderLibrary(id<MTLDevice> metalDevice,
@@ -98,6 +99,7 @@
                                                 const char *source,
                                                 size_t sourceLen,
                                                 NSDictionary<NSString *, NSObject *> * substitutionDictionary,
+                                                bool enableFastMath,
                                                 AutoObjCPtr<NSError *> *error);
 
 AutoObjCPtr<id<MTLLibrary>> CreateShaderLibraryFromBinary(id<MTLDevice> metalDevice,

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.mm (279605 => 279606)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.mm	2021-07-06 19:30:34 UTC (rev 279605)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.mm	2021-07-06 19:33:10 UTC (rev 279606)
@@ -560,9 +560,10 @@
 AutoObjCPtr<id<MTLLibrary>> CreateShaderLibrary(id<MTLDevice> metalDevice,
                                                 const std::string &source,
                                                 NSDictionary<NSString *, NSObject *> * substitutionMacros,
+                                                bool enableFastMath,
                                                 AutoObjCPtr<NSError *> *error)
 {
-    return CreateShaderLibrary(metalDevice, source.c_str(), source.size(), substitutionMacros, error);
+    return CreateShaderLibrary(metalDevice, source.c_str(), source.size(), substitutionMacros, enableFastMath, error);
 }
 
 AutoObjCPtr<id<MTLLibrary>> CreateShaderLibrary(id<MTLDevice> metalDevice,
@@ -569,7 +570,7 @@
                                                 const std::string &source,
                                                 AutoObjCPtr<NSError *> *error)
 {
-    return CreateShaderLibrary(metalDevice, source.c_str(), source.size(),@{}, error);
+    return CreateShaderLibrary(metalDevice, source.c_str(), source.size(),@{}, true, error);
 }
 
 AutoObjCPtr<id<MTLLibrary>> CreateShaderLibrary(id<MTLDevice> metalDevice,
@@ -576,6 +577,7 @@
                                                 const char *source,
                                                 size_t sourceLen,
                                                 NSDictionary<NSString *, NSObject *> * substitutionMacros,
+                                                bool enableFastMath,
                                                 AutoObjCPtr<NSError *> *errorOut)
 {
     ANGLE_MTL_OBJC_SCOPE
@@ -596,6 +598,8 @@
         options.fastMathEnabled = false;
 #endif
         options.languageVersion = GetUserSetOrHighestMSLVersion(options.languageVersion);
+        // TODO(jcunningham): workaround for intel driver not preserving invariance on all shaders
+        options.fastMathEnabled &= enableFastMath;
         options.preprocessorMacros = substitutionMacros;
         auto library = [metalDevice newLibraryWithSource:nsSource options:options error:&nsError];
         if (angle::GetEnvironmentVar(kANGLEPrintMSLEnv)[0] == '1')
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to