// 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_AUTOGEN_FEATURESMTL_H_
#define ANGLE_PLATFORM_AUTOGEN_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 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 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 allowRenderpassWithoutAttachment = {
        "allowRenderpassWithoutAttachment",
        FeatureCategory::MetalFeatures,
        "Allow creation of render passes without any attachments",
        &members,
    };

    FeatureInfo avoidStencilTextureSwizzle = {
        "avoidStencilTextureSwizzle",
        FeatureCategory::MetalFeatures,
        "Do not create swizzled views of stencil textures",
        &members,
    };

    FeatureInfo emulateAlphaToCoverage = {
        "emulateAlphaToCoverage",
        FeatureCategory::MetalWorkarounds,
        "Some GPUs ignore alpha-to-coverage when [[sample_mask]] is written",
        &members,
    };

    FeatureInfo writeHelperSampleMask = {
        "writeHelperSampleMask",
        FeatureCategory::MetalWorkarounds,
        "Some GPUs produce incorrect derivatives unless [[sample_mask]] is written",
        &members,
    };

    FeatureInfo preTransformTextureCubeGradDerivatives = {
        "preTransformTextureCubeGradDerivatives",
        FeatureCategory::MetalWorkarounds,
        "Apply a vendor-specific transformation to explicit cubemap derivatives",
        &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"
    };

    FeatureInfo alwaysUseStagedBufferUpdates = {
        "alwaysUseStagedBufferUpdates",
        FeatureCategory::MetalFeatures,
        "Always update buffers by copying the data to a staging buffer and then blitting it to the actual buffer",
        &members, "http://anglebug.com/7544"
    };

    FeatureInfo useShadowBuffersWhenAppropriate = {
        "useShadowBuffersWhenAppropriate",
        FeatureCategory::MetalFeatures,
        "On some architectures using a shadow buffer can be faster for certain size buffers",
        &members, "http://anglebug.com/7544"
    };

    FeatureInfo alwaysUseManagedStorageModeForBuffers = {
        "alwaysUseManagedStorageModeForBuffers",
        FeatureCategory::MetalFeatures,
        "Metal buffers can be managed, shared, or private. Sometimes managed is fastest",
        &members, "http://anglebug.com/7544"
    };

    FeatureInfo alwaysUseSharedStorageModeForBuffers = {
        "alwaysUseSharedStorageModeForBuffers",
        FeatureCategory::MetalFeatures,
        "Metal buffers can be managed, shared, or private. Sometimes shared is fastest",
        &members, "http://anglebug.com/7544"
    };

    FeatureInfo preferCpuForBuffersubdata = {
        "preferCpuForBuffersubdata",
        FeatureCategory::MetalFeatures,
        "Makes bufferSubData always update via CPU",
        &members, "http://anglebug.com/7544"
    };

    FeatureInfo disableProgrammableBlending = {
        "disableProgrammableBlending",
        FeatureCategory::MetalFeatures,
        "Disable programmable blending in order to test read_write pixel local storage textures",
        &members, "http://anglebug.com/7279"
    };

    FeatureInfo disableRWTextureTier2Support = {
        "disableRWTextureTier2Support",
        FeatureCategory::MetalFeatures,
        "Disable tier2 read_write textures in order to test tier1 support",
        &members, "http://anglebug.com/7279"
    };

    FeatureInfo disableRasterOrderGroups = {
        "disableRasterOrderGroups",
        FeatureCategory::MetalFeatures,
        "Disable raster order groups in order to test pixel local storage memory barriers",
        &members, "http://anglebug.com/7279"
    };

    FeatureInfo enableInMemoryMtlLibraryCache = {
        "enableInMemoryMtlLibraryCache",
        FeatureCategory::MetalFeatures,
        "Cache MTLLibrary objects in memory.",
        &members, "http://crbug.com/1385510"
    };

    FeatureInfo enableParallelMtlLibraryCompilation = {
        "enableParallelMtlLibraryCompilation",
        FeatureCategory::MetalFeatures,
        "Compile MTLLibrary in multiple threads.",
        &members, "http://crbug.com/1385510"
    };

    FeatureInfo alwaysPreferStagedTextureUploads = {
        "alwaysPreferStagedTextureUploads",
        FeatureCategory::MetalFeatures,
        "Always prefer to upload texture data via a staging buffer and avoid MTLTexture::replaceRegion.",
        &members, "http://crbug.com/1380790"
    };

    FeatureInfo disableStagedInitializationOfPackedTextureFormats = {
        "disableStagedInitializationOfPackedTextureFormats",
        FeatureCategory::MetalFeatures,
        "Staged GPU upload of some packed texture formats such as RGB9_E5 fail on Intel GPUs.",
        &members, "http://anglebug.com/8092"
    };

    FeatureInfo compileMetalShaders = {
        "compileMetalShaders",
        FeatureCategory::MetalFeatures,
        "Compiles metal shaders using command line tools and saves to BlobCache. "
        "Requires using --no-sandbox and disabling enableParallelMtlLibraryCompilation.",
        &members, "http://crbug.com/1423136"
    };

    FeatureInfo loadMetalShadersFromBlobCache = {
        "loadMetalShadersFromBlobCache",
        FeatureCategory::MetalFeatures,
        "Loads metal shaders from blob cache. Useful if compile_metal_shaders was used to "
        "generate shaders.",
        &members, "http://crbug.com/1423136"
    };

    FeatureInfo printMetalShaders = {
        "printMetalShaders",
        FeatureCategory::MetalFeatures,
        "Prints the source to a shader before it's compiled.",
        &members, "http://crbug.com/1423136"
    };

    FeatureInfo generateShareableShaders = {
        "generateShareableShaders",
        FeatureCategory::MetalFeatures,
        "Attempts to generate shaders that are shareable. More specifically, shaders"
        " end up with conditionals that are decided at run time via input parameters vs"
        " compile time. This results in bigger shaders.",
        &members, "http://crbug.com/1423136"
    };

    FeatureInfo disableMetalOnNvidia = {
        "disableMetalOnNvidia",
        FeatureCategory::MetalFeatures,
        "NVIDIA GPUs are unsupported due to scarcity of the hardware.",
        &members, "http://anglebug.com/8170"
    };

    FeatureInfo flushAfterStreamVertexData = {
        "flushAfterStreamVertexData",
        FeatureCategory::MetalFeatures,
        "Flush after calls to StreamVertexData to work around driver bugs.",
        &members,
    };

    FeatureInfo requireGpuFamily2 = {
        "requireGpuFamily2",
        FeatureCategory::MetalFeatures,
        "Mac GPU Family 2 is required to support all the features of OpenGL ES 2.0",
        &members, "http://anglebug.com/7952"
    };

    FeatureInfo requireMsl21 = {
        "requireMsl21",
        FeatureCategory::MetalFeatures,
        "MSL 2.1 is required to support all the features of OpenGL ES 2.0",
        &members, "http://anglebug.com/8258"
    };

    FeatureInfo rescopeGlobalVariables = {
        "rescopeGlobalVariables",
        FeatureCategory::MetalFeatures,
        "Rescope global variables that are only used in one function to be function-local.",
        &members, "http://anglebug.com/8311"
    };

    FeatureInfo alwaysResolveMultisampleRenderBuffers = {
        "alwaysResolveMultisampleRenderBuffers",
        FeatureCategory::MetalFeatures,
        "Always automatically resolve MSAA render buffers to single sampled texture.",
        &members, "http://crbug.com/1486094"
    };

    FeatureInfo injectAsmStatementIntoLoopBodies = {
        "injectAsmStatementIntoLoopBodies",
        FeatureCategory::MetalFeatures,
        "Inject asm("") statements into loop bodies to force all loops to be treated as "
        "having side effects and not optimized out.",
        &members, "http://crbug.com/1513738"
    };

};

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

}  // namespace angle

#endif  // ANGLE_PLATFORM_AUTOGEN_FEATURESMTL_H_
