// GENERATED FILE - DO NOT EDIT.
// Generated by gen_features.py using data from d3d_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.
//
// FeaturesD3D_autogen.h: Features and workarounds for D3D driver bugs and other issues.

#ifndef ANGLE_PLATFORM_FEATURESD3D_H_
#define ANGLE_PLATFORM_FEATURESD3D_H_

#include "platform/Feature.h"

namespace angle
{

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

    FeatureInfo mrtPerfWorkaround = {
        "mrtPerfWorkaround",
        FeatureCategory::D3DWorkarounds,
        "Some drivers have a bug where they ignore null render targets",
        &members,
    };

    FeatureInfo setDataFasterThanImageUpload = {
        "setDataFasterThanImageUpload",
        FeatureCategory::D3DWorkarounds,
        "Set data faster than image upload",
        &members,
    };

    FeatureInfo zeroMaxLodWorkaround = {
        "zeroMaxLodWorkaround",
        FeatureCategory::D3DWorkarounds,
        "Missing an option to disable mipmaps on a mipmapped texture",
        &members,
    };

    FeatureInfo useInstancedPointSpriteEmulation = {
        "useInstancedPointSpriteEmulation",
        FeatureCategory::D3DWorkarounds,
        "Some D3D11 renderers do not support geometry shaders for pointsprite emulation",
        &members,
    };

    FeatureInfo depthStencilBlitExtraCopy = {
        "depthStencilBlitExtraCopy", FeatureCategory::D3DWorkarounds,
        "Bug in some drivers triggers a TDR when using CopySubresourceRegion from a staging "
        "texture to a depth/stencil",
        &members, "http://anglebug.com/1452"};

    FeatureInfo expandIntegerPowExpressions = {
        "expandIntegerPowExpressions",
        FeatureCategory::D3DWorkarounds,
        "The HLSL optimizer has a bug with optimizing 'pow' in certain integer-valued expressions",
        &members,
    };

    FeatureInfo flushAfterEndingTransformFeedback = {
        "flushAfterEndingTransformFeedback",
        FeatureCategory::D3DWorkarounds,
        "Some drivers sometimes write out-of-order results to StreamOut buffers when transform "
        "feedback is used to repeatedly write to the same buffer positions",
        &members,
    };

    FeatureInfo getDimensionsIgnoresBaseLevel = {
        "getDimensionsIgnoresBaseLevel",
        FeatureCategory::D3DWorkarounds,
        "Some drivers do not take into account the base level of the "
        "texture in the results of the HLSL GetDimensions builtin",
        &members,
    };

    FeatureInfo preAddTexelFetchOffsets = {
        "preAddTexelFetchOffsets",
        FeatureCategory::D3DWorkarounds,
        "HLSL's function texture.Load returns 0 when the parameter Location is negative, even if "
        "the sum of Offset and Location is in range",
        &members,
    };

    FeatureInfo emulateTinyStencilTextures = {
        "emulateTinyStencilTextures",
        FeatureCategory::D3DWorkarounds,
        "1x1 and 2x2 mips of depth/stencil textures aren't sampled correctly",
        &members,
    };

    FeatureInfo disableB5G6R5Support = {
        "disableB5G6R5Support",
        FeatureCategory::D3DWorkarounds,
        "Textures with the format "
        "DXGI_FORMAT_B5G6R5_UNORM have incorrect data",
        &members,
    };

    FeatureInfo rewriteUnaryMinusOperator = {
        "rewriteUnaryMinusOperator",
        FeatureCategory::D3DWorkarounds,
        "Evaluating unary minus operator on integer may get wrong answer in vertex shaders",
        &members,
    };

    FeatureInfo emulateIsnanFloat = {"emulateIsnanFloat", FeatureCategory::D3DWorkarounds,
                                     "Using isnan() on highp float will get wrong answer", &members,
                                     "https://crbug.com/650547"};

    FeatureInfo callClearTwice = {"callClearTwice", FeatureCategory::D3DWorkarounds,
                                  "Using clear() may not take effect", &members,
                                  "https://crbug.com/655534"};

    FeatureInfo useSystemMemoryForConstantBuffers = {
        "useSystemMemoryForConstantBuffers", FeatureCategory::D3DWorkarounds,
        "Copying from staging storage to constant buffer "
        "storage does not work",
        &members, "https://crbug.com/593024"};

    FeatureInfo selectViewInGeometryShader = {
        "selectViewInGeometryShader",
        FeatureCategory::D3DWorkarounds,
        "The viewport or render target slice will be selected in the geometry shader stage for "
        "the ANGLE_multiview extension",
        &members,
    };

    FeatureInfo addMockTextureNoRenderTarget = {
        "addMockTextureNoRenderTarget", FeatureCategory::D3DWorkarounds,
        "On some drivers when rendering with no render target, two bugs lead to incorrect behavior",
        &members, "http://anglebug.com/2152"};

    FeatureInfo skipVSConstantRegisterZero = {
        "skipVSConstantRegisterZero",
        FeatureCategory::D3DWorkarounds,
        "In specific cases the driver doesn't handle constant register zero correctly",
        &members,
    };

    FeatureInfo forceAtomicValueResolution = {
        "forceAtomicValueResolution", FeatureCategory::D3DWorkarounds,
        "On some drivers the return value from RWByteAddressBuffer.InterlockedAdd does not resolve "
        "when used in the .yzw components of a RWByteAddressBuffer.Store operation",
        &members, "http://anglebug.com/3246"};

    FeatureInfo allowClearForRobustResourceInit = {
        "allowClearForRobustResourceInit", FeatureCategory::D3DWorkarounds,
        "Some drivers corrupt texture data when clearing for robust resource initialization.",
        &members, "http://crbug.com/941620"};

    FeatureInfo allowTranslateUniformBlockToStructuredBuffer = {
        "allowTranslateUniformBlockToStructuredBuffer", FeatureCategory::D3DWorkarounds,
        "There is a slow fxc compile performance issue with dynamic uniform indexing if "
        "translating a uniform block with a large array member to cbuffer.",
        &members, "http://anglebug.com/3682"};

    FeatureInfo allowES3OnFL100 = {
        "allowES3OnFL100",
        FeatureCategory::D3DWorkarounds,
        "Allow ES3 on 10.0 devices",
        &members,
    };
};

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

}  // namespace angle

#endif  // ANGLE_PLATFORM_FEATURESD3D_H_
