// 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 setDataFasterThanImageUploadOn128bitFormats = {
        "setDataFasterThanImageUploadOn128bitFormats",
        FeatureCategory::D3DWorkarounds,
        "Set data faster than image upload on 128bit formats",
        &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 emulateClearViewAfterDualSourceBlending = {
        "emulateClearViewAfterDualSourceBlending", FeatureCategory::D3DWorkarounds,
        "On Sandybridge, calling ClearView after using dual source blending causes hardware to "
        "hang",
        &members, "https://bugzilla.mozilla.org/show_bug.cgi?id=1633628"};

    FeatureInfo scissoredClearArtifacts = {
        "scissoredClearArtifacts", FeatureCategory::D3DWorkarounds,
        "On Skylake, calling ClearView with a scissor rect that is not a multiple of 8x4 pixels "
        "causes corruption of pixels in the 8x4 pixel tiles along the edge which resembles a "
        "square wave",
        &members, "https://bugzilla.mozilla.org/show_bug.cgi?id=1817240"};

    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,
    };

    FeatureInfo disableRasterizerOrderViews = {
        "disableRasterizerOrderViews", FeatureCategory::D3DWorkarounds, "Disable ROVs for testing",
        &members, "http://anglebug.com/7279"};
};

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

}  // namespace angle

#endif  // ANGLE_PLATFORM_FEATURESD3D_H_
