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')