Hash :
409bf134
        
        Author :
  
        
        Date :
2023-05-23T00:00:00
        
      
Metal: Adjust iOS and macCatalyst caps * Fix swapped iOS and macCatalyst versions for EXT_blend_func_extended and EXT_depth_clamp * Always use 13.1 as the lowest macCatalyst version Bug: angleproject:8121 Bug: angleproject:8047 Bug: angleproject:8015 Change-Id: I1f117de259d211cb8ce2463df59f8fee0e709ef5 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4568323 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
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
//
// 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.1, 13))
#else
    if (ANGLE_APPLE_AVAILABLE_XCI(10.13, 13.1, 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;
                    ANGLE_APPLE_ALLOW_DEPRECATED_BEGIN
                    if ([device supportsFeatureSet:static_cast<MTLFeatureSet>(macFamily2v1)])
                        gpuFamilySufficient = true;
                    ANGLE_APPLE_ALLOW_DEPRECATED_END
                }
#elif ANGLE_PLATFORM_IOS_FAMILY && !ANGLE_PLATFORM_IOS_FAMILY_SIMULATOR
                // 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 ANGLE_PLATFORM_IOS_FAMILY && ANGLE_PLATFORM_IOS_FAMILY_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