Hash :
e22eb503
Author :
Date :
2022-08-22T11:46:53
Metal: Report Metal being available on iOS simulator Make Metal backend always available on iOS simulator. Currently the GPU family query is not useful as it does not return anything that would enable Metal ANGLE to be used. However, testing on iOS simulator is still useful. Bug: angleproject:7591 Change-Id: I0aa881bb7482fc63bbaa08d5efc10920b3c1af43 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3845154 Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
//
// Copyright 2022 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
#include "common/apple_platform_utils.h"
#include <Metal/Metal.h>
namespace angle
{
bool IsMetalRendererAvailable()
{
static bool queriedSystemDevice = false;
static bool gpuFamilySufficient = false;
// We only support macos 10.13+ and 11 for now. Since they are requirements for Metal 2.0.
#if TARGET_OS_SIMULATOR
if (ANGLE_APPLE_AVAILABLE_XCI(10.13, 13.0, 13))
#else
if (ANGLE_APPLE_AVAILABLE_XCI(10.13, 13.0, 11))
#endif
{
if (!queriedSystemDevice)
{
ANGLE_APPLE_OBJC_SCOPE
{
queriedSystemDevice = true;
auto device = [MTLCreateSystemDefaultDevice() ANGLE_APPLE_AUTORELEASE];
if (!device)
{
return false;
}
// -[MTLDevice supportsFamily] introduced in macOS 10.15, Catalyst 13.1, iOS 13.
#if defined(ANGLE_PLATFORM_MACOS) || defined(ANGLE_PLATFORM_MACCATALYST)
// Old Macs, such as MacBookPro11,4, cannot use ANGLE's Metal backend.
// This check can be removed once they are no longer supported.
if (ANGLE_APPLE_AVAILABLE_XCI(10.15, 13.1, 13))
{
if ([device supportsFamily:MTLGPUFamilyMac2])
gpuFamilySufficient = true;
}
else
{
// Hardcode constant to sidestep compiler errors. Call will
// return false on older macOS versions.
const NSUInteger macFamily2v1 = 10005;
if ([device supportsFeatureSet:static_cast<MTLFeatureSet>(macFamily2v1)])
gpuFamilySufficient = true;
}
#elif defined(ANGLE_PLATFORM_IOS) && !TARGET_OS_SIMULATOR
// A8 devices (iPad Mini 4, iPad Air 2) cannot use ANGLE's Metal backend.
// This check can be removed once they are no longer supported.
if (ANGLE_APPLE_AVAILABLE_XCI(10.15, 13.1, 13))
{
if ([device supportsFamily:MTLGPUFamilyApple3])
gpuFamilySufficient = true;
}
else
{
// Hardcode constant to sidestep compiler errors. Call will
// return false on older macOS versions.
const NSUInteger iosFamily3v1 = 4;
if ([device supportsFeatureSet:static_cast<MTLFeatureSet>(iosFamily3v1)])
gpuFamilySufficient = true;
}
#elif defined(ANGLE_PLATFORM_IOS) && TARGET_OS_SIMULATOR
// FIXME: Currently we do not have good simulator query, as it does not support
// the whole feature set needed for iOS.
gpuFamilySufficient = true;
#endif
}
}
return gpuFamilySufficient;
}
return false;
}
} // namespace angle