// GENERATED FILE - DO NOT EDIT.
// Generated by gen_features.py using data from mtl_features.json.
//
// 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.
//
// FeaturesMtl_autogen.h: Optional features for the Metal renderer.

#ifndef ANGLE_PLATFORM_FEATURESMTL_H_
#define ANGLE_PLATFORM_FEATURESMTL_H_

#include "platform/Feature.h"

namespace angle
{

struct FeaturesMtl : FeatureSetBase
{
    FeaturesMtl();
    ~FeaturesMtl();

    FeatureInfo hasBaseVertexInstancedDraw = {
        "hasBaseVertexInstancedDraw",
        FeatureCategory::MetalFeatures,
        "The renderer supports base vertex instanced draw",
        &members,
    };

    FeatureInfo hasExplicitMemBarrier = {
        "hasExplicitMemBarrier",
        FeatureCategory::MetalFeatures,
        "The renderer supports explicit memory barrier",
        &members,
    };

    FeatureInfo hasCheapRenderPass = {
        "hasCheapRenderPass",
        FeatureCategory::MetalFeatures,
        "The renderer can cheaply break a render pass.",
        &members,
    };

    FeatureInfo hasNonUniformDispatch = {
        "hasNonUniformDispatch",
        FeatureCategory::MetalFeatures,
        "The renderer supports non uniform compute shader dispatch's group size",
        &members,
    };

    FeatureInfo hasShaderStencilOutput = {
        "hasShaderStencilOutput",
        FeatureCategory::MetalFeatures,
        "The renderer supports stencil output from fragment shader",
        &members,
    };

    FeatureInfo hasTextureSwizzle = {
        "hasTextureSwizzle",
        FeatureCategory::MetalFeatures,
        "The renderer supports texture swizzle",
        &members,
    };

    FeatureInfo hasDepthAutoResolve = {
        "hasDepthAutoResolve",
        FeatureCategory::MetalFeatures,
        "The renderer supports MSAA depth auto resolve at the end of render pass",
        &members,
    };

    FeatureInfo hasStencilAutoResolve = {
        "hasStencilAutoResolve",
        FeatureCategory::MetalFeatures,
        "The renderer supports MSAA stencil auto resolve at the end of render pass",
        &members,
    };

    FeatureInfo hasEvents = {
        "hasEvents",
        FeatureCategory::MetalFeatures,
        "The renderer supports MTL(Shared)Event",
        &members,
    };

    FeatureInfo allowInlineConstVertexData = {
        "allowInlineConstVertexData",
        FeatureCategory::MetalFeatures,
        "The renderer supports using inline constant data for small client vertex data",
        &members,
    };

    FeatureInfo allowSeparateDepthStencilBuffers = {
        "allowSeparateDepthStencilBuffers",
        FeatureCategory::MetalFeatures,
        "Some Apple platforms such as iOS allows separate depth and stencil buffers, "
        "whereas others such as macOS don't",
        &members,
    };

    FeatureInfo allowRuntimeSamplerCompareMode = {
        "allowRuntimeSamplerCompareMode",
        FeatureCategory::MetalFeatures,
        "The renderer supports changing sampler's compare mode outside shaders",
        &members,
    };

    FeatureInfo allowSamplerCompareGradient = {
        "allowSamplerCompareGradient",
        FeatureCategory::MetalFeatures,
        "The renderer supports sample_compare with gradients",
        &members,
    };

    FeatureInfo allowSamplerCompareLod = {
        "allowSamplerCompareLod",
        FeatureCategory::MetalFeatures,
        "The renderer supports sample_compare with lod",
        &members,
    };

    FeatureInfo allowBufferReadWrite = {
        "allowBufferReadWrite",
        FeatureCategory::MetalFeatures,
        "The renderer supports buffer read and write in the same shader",
        &members,
    };

    FeatureInfo allowMultisampleStoreAndResolve = {
        "allowMultisampleStoreAndResolve",
        FeatureCategory::MetalFeatures,
        "The renderer supports MSAA store and resolve in the same pass",
        &members,
    };

    FeatureInfo allowGenMultipleMipsPerPass = {
        "allowGenMultipleMipsPerPass",
        FeatureCategory::MetalFeatures,
        "The renderer supports generating multiple mipmaps per pass",
        &members,
    };

    FeatureInfo forceD24S8AsUnsupported = {
        "forceD24S8AsUnsupported",
        FeatureCategory::MetalFeatures,
        "Force Depth24Stencil8 format as unsupported.",
        &members,
    };

    FeatureInfo forceBufferGPUStorage = {
        "forceBufferGPUStorage",
        FeatureCategory::MetalFeatures,
        "On systems that support both buffer' memory allocation on GPU and shared memory (such as "
        "macOS), force using GPU memory allocation for buffers everytime or not.",
        &members,
    };

    FeatureInfo directMetalGeneration = {"directMetalGeneration", FeatureCategory::MetalFeatures,
                                         "Direct translation to Metal.", &members,
                                         "http://anglebug.com/5505"};

    FeatureInfo forceNonCSBaseMipmapGeneration = {
        "forceNonCSBaseMipmapGeneration",
        FeatureCategory::MetalFeatures,
        "Turn this feature on to disallow Compute Shader based mipmap generation. Compute Shader "
        "based mipmap generation might cause GPU hang on some older iOS devices.",
        &members,
    };

    FeatureInfo emulateTransformFeedback = {
        "emulateTransformFeedback",
        FeatureCategory::MetalFeatures,
        "Turn this on to allow transform feedback in Metal using a 2-pass VS for GLES3.",
        &members,
    };

    FeatureInfo rewriteRowMajorMatrices = {
        "rewriteRowMajorMatrices",
        FeatureCategory::MetalFeatures,
        "Rewrite row major matrices in shaders as column major.",
        &members,
    };

    FeatureInfo intelExplicitBoolCastWorkaround = {
        "intelExplicitBoolCastWorkaround",
        FeatureCategory::MetalWorkarounds,
        "Insert explicit casts for float/double/unsigned/signed int on macOS 10.15 with Intel "
        "driver",
        &members,
    };

    FeatureInfo intelDisableFastMath = {
        "intelDisableFastMath",
        FeatureCategory::MetalWorkarounds,
        "Disable fast math in atan and invariance cases when running below macOS 12.0",
        &members,
    };

    FeatureInfo multisampleColorFormatShaderReadWorkaround = {
        "multisampleColorFormatShaderReadWorkaround", FeatureCategory::MetalWorkarounds,
        "Add shaderRead usage to some multisampled texture formats", &members,
        "http://anglebug.com/7049"};

    FeatureInfo copyIOSurfaceToNonIOSurfaceForReadOptimization = {
        "copyIOSurfaceToNonIOSurfaceForReadOptimization", FeatureCategory::MetalWorkarounds,
        "some GPUs are faster to read an IOSurface texture by first copying the texture to a "
        "non-IOSurface texture",
        &members, "http://anglebug.com/7117 http://anglebug.com/7573"};

    FeatureInfo copyTextureToBufferForReadOptimization = {
        "copyTextureToBufferForReadOptimization", FeatureCategory::MetalWorkarounds,
        "some GPUs are faster to read a texture by first copying the texture to a buffer", &members,
        "http://anglebug.com/7117"};

    FeatureInfo limitMaxDrawBuffersForTesting = {
        "limitMaxDrawBuffersForTesting", FeatureCategory::MetalFeatures,
        "Used to check the backend works when the device's advertized limit is less than the "
        "code's limit",
        &members, "http://anglebug.com/7280"};

    FeatureInfo limitMaxColorTargetBitsForTesting = {
        "limitMaxColorTargetBitsForTesting", FeatureCategory::MetalFeatures,
        "Metal iOS has a limit on the number of color target bits per pixel.", &members,
        "http://anglebug.com/7280"};

    FeatureInfo preemptivelyStartProvokingVertexCommandBuffer = {
        "preemptivelyStartProvokingVertexCommandBuffer", FeatureCategory::MetalFeatures,
        "AMD Metal Drivers appear to have a bug this works around", &members,
        "http://anglebug.com/7635"};

    FeatureInfo uploadDataToIosurfacesWithStagingBuffers = {
        "uploadDataToIosurfacesWithStagingBuffers", FeatureCategory::MetalWorkarounds,
        "When uploading data to IOSurface-backed textures, use a staging buffer.", &members,
        "http://anglebug.com/7573"};
};

inline FeaturesMtl::FeaturesMtl()  = default;
inline FeaturesMtl::~FeaturesMtl() = default;

}  // namespace angle

#endif  // ANGLE_PLATFORM_FEATURESMTL_H_
