// Copyright (c) 2015-2016 The Khronos Group Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Test capability dependencies for enums.

#include <tuple>
#include <vector>

#include "gmock/gmock.h"
#include "source/enum_set.h"
#include "test/unit_spirv.h"

namespace spvtools {
namespace {

using spvtest::ElementsIn;
using ::testing::Combine;
using ::testing::Eq;
using ::testing::TestWithParam;
using ::testing::Values;
using ::testing::ValuesIn;

// A test case for mapping an enum to a capability mask.
struct EnumCapabilityCase {
  spv_operand_type_t type;
  uint32_t value;
  CapabilitySet expected_capabilities;
};

// Test fixture for testing EnumCapabilityCases.
using EnumCapabilityTest =
    TestWithParam<std::tuple<spv_target_env, EnumCapabilityCase>>;

TEST_P(EnumCapabilityTest, Sample) {
  const auto env = std::get<0>(GetParam());
  const auto context = spvContextCreate(env);
  const AssemblyGrammar grammar(context);
  spv_operand_desc entry;

  ASSERT_EQ(SPV_SUCCESS,
            grammar.lookupOperand(std::get<1>(GetParam()).type,
                                  std::get<1>(GetParam()).value, &entry));
  const auto cap_set = grammar.filterCapsAgainstTargetEnv(
      entry->capabilities, entry->numCapabilities);

  EXPECT_THAT(ElementsIn(cap_set),
              Eq(ElementsIn(std::get<1>(GetParam()).expected_capabilities)))
      << " capability value " << std::get<1>(GetParam()).value;
  spvContextDestroy(context);
}

#define CASE0(TYPE, VALUE)                            \
  {                                                   \
    SPV_OPERAND_TYPE_##TYPE, uint32_t(Spv##VALUE), {} \
  }
#define CASE1(TYPE, VALUE, CAP)                                    \
  {                                                                \
    SPV_OPERAND_TYPE_##TYPE, uint32_t(Spv##VALUE), CapabilitySet { \
      SpvCapability##CAP                                           \
    }                                                              \
  }
#define CASE2(TYPE, VALUE, CAP1, CAP2)                             \
  {                                                                \
    SPV_OPERAND_TYPE_##TYPE, uint32_t(Spv##VALUE), CapabilitySet { \
      SpvCapability##CAP1, SpvCapability##CAP2                     \
    }                                                              \
  }
#define CASE3(TYPE, VALUE, CAP1, CAP2, CAP3)                        \
  {                                                                 \
    SPV_OPERAND_TYPE_##TYPE, uint32_t(Spv##VALUE), CapabilitySet {  \
      SpvCapability##CAP1, SpvCapability##CAP2, SpvCapability##CAP3 \
    }                                                               \
  }
#define CASE4(TYPE, VALUE, CAP1, CAP2, CAP3, CAP4)                   \
  {                                                                  \
    SPV_OPERAND_TYPE_##TYPE, uint32_t(Spv##VALUE), CapabilitySet {   \
      SpvCapability##CAP1, SpvCapability##CAP2, SpvCapability##CAP3, \
          SpvCapability##CAP4                                        \
    }                                                                \
  }
#define CASE5(TYPE, VALUE, CAP1, CAP2, CAP3, CAP4, CAP5)             \
  {                                                                  \
    SPV_OPERAND_TYPE_##TYPE, uint32_t(Spv##VALUE), CapabilitySet {   \
      SpvCapability##CAP1, SpvCapability##CAP2, SpvCapability##CAP3, \
          SpvCapability##CAP4, SpvCapability##CAP5                   \
    }                                                                \
  }

// See SPIR-V Section 3.3 Execution Model
INSTANTIATE_TEST_SUITE_P(
    ExecutionModel, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE1(EXECUTION_MODEL, ExecutionModelVertex, Shader),
                CASE1(EXECUTION_MODEL, ExecutionModelTessellationControl,
                      Tessellation),
                CASE1(EXECUTION_MODEL, ExecutionModelTessellationEvaluation,
                      Tessellation),
                CASE1(EXECUTION_MODEL, ExecutionModelGeometry, Geometry),
                CASE1(EXECUTION_MODEL, ExecutionModelFragment, Shader),
                CASE1(EXECUTION_MODEL, ExecutionModelGLCompute, Shader),
                CASE1(EXECUTION_MODEL, ExecutionModelKernel, Kernel),
            })));

// See SPIR-V Section 3.4 Addressing Model
INSTANTIATE_TEST_SUITE_P(
    AddressingModel, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE0(ADDRESSING_MODEL, AddressingModelLogical),
                CASE1(ADDRESSING_MODEL, AddressingModelPhysical32, Addresses),
                CASE1(ADDRESSING_MODEL, AddressingModelPhysical64, Addresses),
            })));

// See SPIR-V Section 3.5 Memory Model
INSTANTIATE_TEST_SUITE_P(
    MemoryModel, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE1(MEMORY_MODEL, MemoryModelSimple, Shader),
                CASE1(MEMORY_MODEL, MemoryModelGLSL450, Shader),
                CASE1(MEMORY_MODEL, MemoryModelOpenCL, Kernel),
            })));

// See SPIR-V Section 3.6 Execution Mode
INSTANTIATE_TEST_SUITE_P(
    ExecutionMode, EnumCapabilityTest,
    Combine(
        Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
        ValuesIn(std::vector<EnumCapabilityCase>{
            CASE1(EXECUTION_MODE, ExecutionModeInvocations, Geometry),
            CASE1(EXECUTION_MODE, ExecutionModeSpacingEqual, Tessellation),
            CASE1(EXECUTION_MODE, ExecutionModeSpacingFractionalEven,
                  Tessellation),
            CASE1(EXECUTION_MODE, ExecutionModeSpacingFractionalOdd,
                  Tessellation),
            CASE1(EXECUTION_MODE, ExecutionModeVertexOrderCw, Tessellation),
            CASE1(EXECUTION_MODE, ExecutionModeVertexOrderCcw, Tessellation),
            CASE1(EXECUTION_MODE, ExecutionModePixelCenterInteger, Shader),
            CASE1(EXECUTION_MODE, ExecutionModeOriginUpperLeft, Shader),
            CASE1(EXECUTION_MODE, ExecutionModeOriginLowerLeft, Shader),
            CASE1(EXECUTION_MODE, ExecutionModeEarlyFragmentTests, Shader),
            CASE1(EXECUTION_MODE, ExecutionModePointMode, Tessellation),
            CASE1(EXECUTION_MODE, ExecutionModeXfb, TransformFeedback),
            CASE1(EXECUTION_MODE, ExecutionModeDepthReplacing, Shader),
            CASE1(EXECUTION_MODE, ExecutionModeDepthGreater, Shader),
            CASE1(EXECUTION_MODE, ExecutionModeDepthLess, Shader),
            CASE1(EXECUTION_MODE, ExecutionModeDepthUnchanged, Shader),
            CASE0(EXECUTION_MODE, ExecutionModeLocalSize),
            CASE1(EXECUTION_MODE, ExecutionModeLocalSizeHint, Kernel),
            CASE1(EXECUTION_MODE, ExecutionModeInputPoints, Geometry),
            CASE1(EXECUTION_MODE, ExecutionModeInputLines, Geometry),
            CASE1(EXECUTION_MODE, ExecutionModeInputLinesAdjacency, Geometry),
            CASE2(EXECUTION_MODE, ExecutionModeTriangles, Geometry,
                  Tessellation),
            CASE1(EXECUTION_MODE, ExecutionModeInputTrianglesAdjacency,
                  Geometry),
            CASE1(EXECUTION_MODE, ExecutionModeQuads, Tessellation),
            CASE1(EXECUTION_MODE, ExecutionModeIsolines, Tessellation),
            CASE3(EXECUTION_MODE, ExecutionModeOutputVertices, Geometry,
                  Tessellation, MeshShadingNV),
            CASE2(EXECUTION_MODE, ExecutionModeOutputPoints, Geometry,
                  MeshShadingNV),
            CASE1(EXECUTION_MODE, ExecutionModeOutputLineStrip, Geometry),
            CASE1(EXECUTION_MODE, ExecutionModeOutputTriangleStrip, Geometry),
            CASE1(EXECUTION_MODE, ExecutionModeVecTypeHint, Kernel),
            CASE1(EXECUTION_MODE, ExecutionModeContractionOff, Kernel),
        })));

INSTANTIATE_TEST_SUITE_P(
    ExecutionModeV11, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE1(EXECUTION_MODE, ExecutionModeInitializer, Kernel),
                CASE1(EXECUTION_MODE, ExecutionModeFinalizer, Kernel),
                CASE1(EXECUTION_MODE, ExecutionModeSubgroupSize,
                      SubgroupDispatch),
                CASE1(EXECUTION_MODE, ExecutionModeSubgroupsPerWorkgroup,
                      SubgroupDispatch)})));

// See SPIR-V Section 3.7 Storage Class
INSTANTIATE_TEST_SUITE_P(
    StorageClass, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE0(STORAGE_CLASS, StorageClassUniformConstant),
                CASE1(STORAGE_CLASS, StorageClassUniform, Shader),
                CASE1(STORAGE_CLASS, StorageClassOutput, Shader),
                CASE0(STORAGE_CLASS, StorageClassWorkgroup),
                CASE0(STORAGE_CLASS, StorageClassCrossWorkgroup),
                CASE2(STORAGE_CLASS, StorageClassPrivate, Shader,
                      VectorComputeINTEL),
                CASE0(STORAGE_CLASS, StorageClassFunction),
                CASE1(STORAGE_CLASS, StorageClassGeneric,
                      GenericPointer),  // Bug 14287
                CASE1(STORAGE_CLASS, StorageClassPushConstant, Shader),
                CASE1(STORAGE_CLASS, StorageClassAtomicCounter, AtomicStorage),
                CASE0(STORAGE_CLASS, StorageClassImage),
            })));

// See SPIR-V Section 3.8 Dim
INSTANTIATE_TEST_SUITE_P(
    Dim, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE2(DIMENSIONALITY, Dim1D, Sampled1D, Image1D),
                CASE3(DIMENSIONALITY, Dim2D, Kernel, Shader, ImageMSArray),
                CASE0(DIMENSIONALITY, Dim3D),
                CASE2(DIMENSIONALITY, DimCube, Shader, ImageCubeArray),
                CASE2(DIMENSIONALITY, DimRect, SampledRect, ImageRect),
                CASE2(DIMENSIONALITY, DimBuffer, SampledBuffer, ImageBuffer),
                CASE1(DIMENSIONALITY, DimSubpassData, InputAttachment),
            })));

// See SPIR-V Section 3.9 Sampler Addressing Mode
INSTANTIATE_TEST_SUITE_P(
    SamplerAddressingMode, EnumCapabilityTest,
    Combine(
        Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
        ValuesIn(std::vector<EnumCapabilityCase>{
            CASE1(SAMPLER_ADDRESSING_MODE, SamplerAddressingModeNone, Kernel),
            CASE1(SAMPLER_ADDRESSING_MODE, SamplerAddressingModeClampToEdge,
                  Kernel),
            CASE1(SAMPLER_ADDRESSING_MODE, SamplerAddressingModeClamp, Kernel),
            CASE1(SAMPLER_ADDRESSING_MODE, SamplerAddressingModeRepeat, Kernel),
            CASE1(SAMPLER_ADDRESSING_MODE, SamplerAddressingModeRepeatMirrored,
                  Kernel),
        })));

// See SPIR-V Section 3.10 Sampler Filter Mode
INSTANTIATE_TEST_SUITE_P(
    SamplerFilterMode, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE1(SAMPLER_FILTER_MODE, SamplerFilterModeNearest, Kernel),
                CASE1(SAMPLER_FILTER_MODE, SamplerFilterModeLinear, Kernel),
            })));

// See SPIR-V Section 3.11 Image Format
INSTANTIATE_TEST_SUITE_P(
    ImageFormat, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                // clang-format off
        CASE0(SAMPLER_IMAGE_FORMAT, ImageFormatUnknown),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba32f, Shader),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba16f, Shader),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR32f, Shader),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba8, Shader),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba8Snorm, Shader),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg32f, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg16f, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR11fG11fB10f, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR16f, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba16, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgb10A2, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg16, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg8, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR16, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR8, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba16Snorm, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg16Snorm, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg8Snorm, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR16Snorm, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR8Snorm, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba32i, Shader),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba16i, Shader),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba8i, Shader),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR32i, Shader),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg32i, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg16i, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg8i, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR16i, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR8i, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba32ui, Shader),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba16ui, Shader),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba8ui, Shader),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgba8ui, Shader),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRgb10a2ui, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg32ui, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg16ui, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatRg8ui, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR16ui, StorageImageExtendedFormats),
        CASE1(SAMPLER_IMAGE_FORMAT, ImageFormatR8ui, StorageImageExtendedFormats),
                // clang-format on
            })));

// See SPIR-V Section 3.12 Image Channel Order
INSTANTIATE_TEST_SUITE_P(
    ImageChannelOrder, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderR, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderA, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderRG, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderRA, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderRGB, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderRGBA, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderBGRA, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderARGB, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderIntensity, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderLuminance, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderRx, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderRGx, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderRGBx, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderDepth, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderDepthStencil,
                      Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrdersRGB, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrdersRGBx, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrdersRGBA, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrdersBGRA, Kernel),
                CASE1(IMAGE_CHANNEL_ORDER, ImageChannelOrderABGR, Kernel),
            })));

// See SPIR-V Section 3.13 Image Channel Data Type
INSTANTIATE_TEST_SUITE_P(
    ImageChannelDataType, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                // clang-format off
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeSnormInt8, Kernel),
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeSnormInt16, Kernel),
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnormInt8, Kernel),
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnormInt16, Kernel),
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnormShort565, Kernel),
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnormShort555, Kernel),
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnormInt101010, Kernel),
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeSignedInt8, Kernel),
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeSignedInt16, Kernel),
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeSignedInt32, Kernel),
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnsignedInt8, Kernel),
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnsignedInt16, Kernel),
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnsignedInt32, Kernel),
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeHalfFloat, Kernel),
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeFloat, Kernel),
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnormInt24, Kernel),
                CASE1(IMAGE_CHANNEL_DATA_TYPE, ImageChannelDataTypeUnormInt101010_2, Kernel),
                // clang-format on
            })));

// See SPIR-V Section 3.14 Image Operands
INSTANTIATE_TEST_SUITE_P(
    ImageOperands, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                // clang-format off
                CASE0(OPTIONAL_IMAGE, ImageOperandsMaskNone),
                CASE1(OPTIONAL_IMAGE, ImageOperandsBiasMask, Shader),
                CASE0(OPTIONAL_IMAGE, ImageOperandsLodMask),
                CASE0(OPTIONAL_IMAGE, ImageOperandsGradMask),
                CASE0(OPTIONAL_IMAGE, ImageOperandsConstOffsetMask),
                CASE1(OPTIONAL_IMAGE, ImageOperandsOffsetMask, ImageGatherExtended),
                CASE1(OPTIONAL_IMAGE, ImageOperandsConstOffsetsMask, ImageGatherExtended),
                CASE0(OPTIONAL_IMAGE, ImageOperandsSampleMask),
                CASE1(OPTIONAL_IMAGE, ImageOperandsMinLodMask, MinLod),
                // clang-format on
            })));

// See SPIR-V Section 3.17 Linkage Type
INSTANTIATE_TEST_SUITE_P(
    LinkageType, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE1(LINKAGE_TYPE, LinkageTypeExport, Linkage),
                CASE1(LINKAGE_TYPE, LinkageTypeImport, Linkage),
            })));

// See SPIR-V Section 3.18 Access Qualifier
INSTANTIATE_TEST_SUITE_P(
    AccessQualifier, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE1(ACCESS_QUALIFIER, AccessQualifierReadOnly, Kernel),
                CASE1(ACCESS_QUALIFIER, AccessQualifierWriteOnly, Kernel),
                CASE1(ACCESS_QUALIFIER, AccessQualifierReadWrite, Kernel),
            })));

// See SPIR-V Section 3.19 Function Parameter Attribute
INSTANTIATE_TEST_SUITE_P(
    FunctionParameterAttribute, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                // clang-format off
                CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttributeZext, Kernel),
                CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttributeSext, Kernel),
                CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttributeByVal, Kernel),
                CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttributeSret, Kernel),
                CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttributeNoAlias, Kernel),
                CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttributeNoCapture, Kernel),
                CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttributeNoWrite, Kernel),
                CASE1(FUNCTION_PARAMETER_ATTRIBUTE, FunctionParameterAttributeNoReadWrite, Kernel),
                // clang-format on
            })));

// See SPIR-V Section 3.20 Decoration
INSTANTIATE_TEST_SUITE_P(
    Decoration, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE1(DECORATION, DecorationRelaxedPrecision, Shader),
                // DecorationSpecId handled below.
                CASE1(DECORATION, DecorationBlock, Shader),
                CASE1(DECORATION, DecorationBufferBlock, Shader),
                CASE1(DECORATION, DecorationRowMajor, Matrix),
                CASE1(DECORATION, DecorationColMajor, Matrix),
                CASE1(DECORATION, DecorationArrayStride, Shader),
                CASE1(DECORATION, DecorationMatrixStride, Matrix),  // Bug 15234
                CASE1(DECORATION, DecorationGLSLShared, Shader),
                CASE1(DECORATION, DecorationGLSLPacked, Shader),
                CASE1(DECORATION, DecorationCPacked, Kernel),
                CASE0(DECORATION, DecorationBuiltIn),  // Bug 15248
                // Value 12 placeholder
                CASE1(DECORATION, DecorationNoPerspective, Shader),
                CASE1(DECORATION, DecorationFlat, Shader),
                CASE1(DECORATION, DecorationPatch, Tessellation),
                CASE1(DECORATION, DecorationCentroid, Shader),
                CASE1(DECORATION, DecorationSample,
                      SampleRateShading),  // Bug 15234
                CASE1(DECORATION, DecorationInvariant, Shader),
                CASE0(DECORATION, DecorationRestrict),
                CASE0(DECORATION, DecorationAliased),
                CASE0(DECORATION, DecorationVolatile),
                CASE1(DECORATION, DecorationConstant, Kernel),
                CASE0(DECORATION, DecorationCoherent),
                CASE0(DECORATION, DecorationNonWritable),
                CASE0(DECORATION, DecorationNonReadable),
                CASE1(DECORATION, DecorationUniform, Shader),
                // Value 27 is an intentional gap in the spec numbering.
                CASE1(DECORATION, DecorationSaturatedConversion, Kernel),
                CASE1(DECORATION, DecorationStream, GeometryStreams),
                CASE1(DECORATION, DecorationLocation, Shader),
                CASE1(DECORATION, DecorationComponent, Shader),
                CASE1(DECORATION, DecorationIndex, Shader),
                CASE1(DECORATION, DecorationBinding, Shader),
                CASE1(DECORATION, DecorationDescriptorSet, Shader),
                CASE1(DECORATION, DecorationOffset, Shader),  // Bug 15268
                CASE1(DECORATION, DecorationXfbBuffer, TransformFeedback),
                CASE1(DECORATION, DecorationXfbStride, TransformFeedback),
                CASE1(DECORATION, DecorationFuncParamAttr, Kernel),
                CASE1(DECORATION, DecorationFPFastMathMode, Kernel),
                CASE1(DECORATION, DecorationLinkageAttributes, Linkage),
                CASE1(DECORATION, DecorationNoContraction, Shader),
                CASE1(DECORATION, DecorationInputAttachmentIndex,
                      InputAttachment),
                CASE1(DECORATION, DecorationAlignment, Kernel),
            })));

#if 0
// SpecId has different requirements in v1.0 and v1.1:
INSTANTIATE_TEST_SUITE_P(DecorationSpecIdV10, EnumCapabilityTest,
                        Combine(Values(SPV_ENV_UNIVERSAL_1_0),
                                ValuesIn(std::vector<EnumCapabilityCase>{CASE1(
                                    DECORATION, DecorationSpecId, Shader)})));
#endif

INSTANTIATE_TEST_SUITE_P(
    DecorationV11, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE2(DECORATION, DecorationSpecId, Shader, Kernel),
                CASE1(DECORATION, DecorationMaxByteOffset, Addresses)})));

// See SPIR-V Section 3.21 BuiltIn
INSTANTIATE_TEST_SUITE_P(
    BuiltIn, EnumCapabilityTest,
    Combine(
        Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
        ValuesIn(std::vector<EnumCapabilityCase>{
            // clang-format off
            CASE1(BUILT_IN, BuiltInPosition, Shader),
            CASE1(BUILT_IN, BuiltInPointSize, Shader),
            // 2 is an intentional gap in the spec numbering.
            CASE1(BUILT_IN, BuiltInClipDistance, ClipDistance),  // Bug 1407, 15234
            CASE1(BUILT_IN, BuiltInCullDistance, CullDistance),  // Bug 1407, 15234
            CASE1(BUILT_IN, BuiltInVertexId, Shader),
            CASE1(BUILT_IN, BuiltInInstanceId, Shader),
            CASE5(BUILT_IN, BuiltInPrimitiveId, Geometry, Tessellation,
                  RayTracingNV, RayTracingKHR, MeshShadingNV),
            CASE2(BUILT_IN, BuiltInInvocationId, Geometry, Tessellation),
            CASE3(BUILT_IN, BuiltInLayer, Geometry, ShaderViewportIndexLayerEXT, MeshShadingNV),
            CASE3(BUILT_IN, BuiltInViewportIndex, MultiViewport, ShaderViewportIndexLayerEXT, MeshShadingNV),  // Bug 15234
            CASE1(BUILT_IN, BuiltInTessLevelOuter, Tessellation),
            CASE1(BUILT_IN, BuiltInTessLevelInner, Tessellation),
            CASE1(BUILT_IN, BuiltInTessCoord, Tessellation),
            CASE1(BUILT_IN, BuiltInPatchVertices, Tessellation),
            CASE1(BUILT_IN, BuiltInFragCoord, Shader),
            CASE1(BUILT_IN, BuiltInPointCoord, Shader),
            CASE1(BUILT_IN, BuiltInFrontFacing, Shader),
            CASE1(BUILT_IN, BuiltInSampleId, SampleRateShading),  // Bug 15234
            CASE1(BUILT_IN, BuiltInSamplePosition, SampleRateShading), // Bug 15234
            CASE1(BUILT_IN, BuiltInSampleMask, Shader),  // Bug 15234, Issue 182
            // Value 21 intentionally missing
            CASE1(BUILT_IN, BuiltInFragDepth, Shader),
            CASE1(BUILT_IN, BuiltInHelperInvocation, Shader),
            CASE0(BUILT_IN, BuiltInNumWorkgroups),
            CASE0(BUILT_IN, BuiltInWorkgroupSize),
            CASE0(BUILT_IN, BuiltInWorkgroupId),
            CASE0(BUILT_IN, BuiltInLocalInvocationId),
            CASE0(BUILT_IN, BuiltInGlobalInvocationId),
            CASE0(BUILT_IN, BuiltInLocalInvocationIndex),
            CASE1(BUILT_IN, BuiltInWorkDim, Kernel),
            CASE1(BUILT_IN, BuiltInGlobalSize, Kernel),
            CASE1(BUILT_IN, BuiltInEnqueuedWorkgroupSize, Kernel),
            CASE1(BUILT_IN, BuiltInGlobalOffset, Kernel),
            CASE1(BUILT_IN, BuiltInGlobalLinearId, Kernel),
            // Value 35 intentionally missing
            CASE2(BUILT_IN, BuiltInSubgroupSize, Kernel, SubgroupBallotKHR),
            CASE1(BUILT_IN, BuiltInSubgroupMaxSize, Kernel),
            CASE1(BUILT_IN, BuiltInNumSubgroups, Kernel),
            CASE1(BUILT_IN, BuiltInNumEnqueuedSubgroups, Kernel),
            CASE1(BUILT_IN, BuiltInSubgroupId, Kernel),
            CASE2(BUILT_IN, BuiltInSubgroupLocalInvocationId, Kernel, SubgroupBallotKHR),
            CASE1(BUILT_IN, BuiltInVertexIndex, Shader),
            CASE1(BUILT_IN, BuiltInInstanceIndex, Shader),
            // clang-format on
        })));

INSTANTIATE_TEST_SUITE_P(
    BuiltInV1_5, EnumCapabilityTest,
    Combine(
        Values(SPV_ENV_UNIVERSAL_1_5),
        ValuesIn(std::vector<EnumCapabilityCase>{
            // SPIR-V 1.5 adds new capabilities to enable these two builtins.
            CASE4(BUILT_IN, BuiltInLayer, Geometry, ShaderLayer,
                  ShaderViewportIndexLayerEXT, MeshShadingNV),
            CASE4(BUILT_IN, BuiltInViewportIndex, MultiViewport,
                  ShaderViewportIndex, ShaderViewportIndexLayerEXT,
                  MeshShadingNV),
        })));

// See SPIR-V Section 3.22 Selection Control
INSTANTIATE_TEST_SUITE_P(
    SelectionControl, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE0(SELECTION_CONTROL, SelectionControlMaskNone),
                CASE0(SELECTION_CONTROL, SelectionControlFlattenMask),
                CASE0(SELECTION_CONTROL, SelectionControlDontFlattenMask),
            })));

// See SPIR-V Section 3.23 Loop Control
INSTANTIATE_TEST_SUITE_P(
    LoopControl, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE0(LOOP_CONTROL, LoopControlMaskNone),
                CASE0(LOOP_CONTROL, LoopControlUnrollMask),
                CASE0(LOOP_CONTROL, LoopControlDontUnrollMask),
            })));

INSTANTIATE_TEST_SUITE_P(
    LoopControlV11, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE0(LOOP_CONTROL, LoopControlDependencyInfiniteMask),
                CASE0(LOOP_CONTROL, LoopControlDependencyLengthMask),
            })));

// See SPIR-V Section 3.24 Function Control
INSTANTIATE_TEST_SUITE_P(
    FunctionControl, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE0(FUNCTION_CONTROL, FunctionControlMaskNone),
                CASE0(FUNCTION_CONTROL, FunctionControlInlineMask),
                CASE0(FUNCTION_CONTROL, FunctionControlDontInlineMask),
                CASE0(FUNCTION_CONTROL, FunctionControlPureMask),
                CASE0(FUNCTION_CONTROL, FunctionControlConstMask),
            })));

// See SPIR-V Section 3.25 Memory Semantics <id>
INSTANTIATE_TEST_SUITE_P(
    MemorySemantics, EnumCapabilityTest,
    Combine(
        Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
        ValuesIn(std::vector<EnumCapabilityCase>{
            CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsMaskNone),
            CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsAcquireMask),
            CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsReleaseMask),
            CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsAcquireReleaseMask),
            CASE0(MEMORY_SEMANTICS_ID,
                  MemorySemanticsSequentiallyConsistentMask),
            CASE1(MEMORY_SEMANTICS_ID, MemorySemanticsUniformMemoryMask,
                  Shader),
            CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsSubgroupMemoryMask),
            CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsWorkgroupMemoryMask),
            CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsCrossWorkgroupMemoryMask),
            CASE1(MEMORY_SEMANTICS_ID, MemorySemanticsAtomicCounterMemoryMask,
                  AtomicStorage),  // Bug 15234
            CASE0(MEMORY_SEMANTICS_ID, MemorySemanticsImageMemoryMask),
        })));

// See SPIR-V Section 3.26 Memory Access
INSTANTIATE_TEST_SUITE_P(
    MemoryAccess, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE0(OPTIONAL_MEMORY_ACCESS, MemoryAccessMaskNone),
                CASE0(OPTIONAL_MEMORY_ACCESS, MemoryAccessVolatileMask),
                CASE0(OPTIONAL_MEMORY_ACCESS, MemoryAccessAlignedMask),
                CASE0(OPTIONAL_MEMORY_ACCESS, MemoryAccessNontemporalMask),
            })));

// See SPIR-V Section 3.27 Scope <id>
INSTANTIATE_TEST_SUITE_P(
    Scope, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
                   SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE0(SCOPE_ID, ScopeCrossDevice),
                CASE0(SCOPE_ID, ScopeDevice),
                CASE0(SCOPE_ID, ScopeWorkgroup),
                CASE0(SCOPE_ID, ScopeSubgroup),
                CASE0(SCOPE_ID, ScopeInvocation),
                CASE1(SCOPE_ID, ScopeQueueFamilyKHR, VulkanMemoryModelKHR),
            })));

// See SPIR-V Section 3.28 Group Operation
INSTANTIATE_TEST_SUITE_P(
    GroupOperation, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE3(GROUP_OPERATION, GroupOperationReduce, Kernel,
                      GroupNonUniformArithmetic, GroupNonUniformBallot),
                CASE3(GROUP_OPERATION, GroupOperationInclusiveScan, Kernel,
                      GroupNonUniformArithmetic, GroupNonUniformBallot),
                CASE3(GROUP_OPERATION, GroupOperationExclusiveScan, Kernel,
                      GroupNonUniformArithmetic, GroupNonUniformBallot),
            })));

// See SPIR-V Section 3.29 Kernel Enqueue Flags
INSTANTIATE_TEST_SUITE_P(
    KernelEnqueueFlags, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE1(KERNEL_ENQ_FLAGS, KernelEnqueueFlagsNoWait, Kernel),
                CASE1(KERNEL_ENQ_FLAGS, KernelEnqueueFlagsWaitKernel, Kernel),
                CASE1(KERNEL_ENQ_FLAGS, KernelEnqueueFlagsWaitWorkGroup,
                      Kernel),
            })));

// See SPIR-V Section 3.30 Kernel Profiling Info
INSTANTIATE_TEST_SUITE_P(
    KernelProfilingInfo, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE0(KERNEL_PROFILING_INFO, KernelProfilingInfoMaskNone),
                CASE1(KERNEL_PROFILING_INFO, KernelProfilingInfoCmdExecTimeMask,
                      Kernel),
            })));

// See SPIR-V Section 3.31 Capability
INSTANTIATE_TEST_SUITE_P(
    CapabilityDependsOn, EnumCapabilityTest,
    Combine(
        Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1),
        ValuesIn(std::vector<EnumCapabilityCase>{
            // clang-format off
            CASE0(CAPABILITY, CapabilityMatrix),
            CASE1(CAPABILITY, CapabilityShader, Matrix),
            CASE1(CAPABILITY, CapabilityGeometry, Shader),
            CASE1(CAPABILITY, CapabilityTessellation, Shader),
            CASE0(CAPABILITY, CapabilityAddresses),
            CASE0(CAPABILITY, CapabilityLinkage),
            CASE0(CAPABILITY, CapabilityKernel),
            CASE1(CAPABILITY, CapabilityVector16, Kernel),
            CASE1(CAPABILITY, CapabilityFloat16Buffer, Kernel),
            CASE0(CAPABILITY, CapabilityFloat16),  // Bug 15234
            CASE0(CAPABILITY, CapabilityFloat64),
            CASE0(CAPABILITY, CapabilityInt64),
            CASE1(CAPABILITY, CapabilityInt64Atomics, Int64),
            CASE1(CAPABILITY, CapabilityImageBasic, Kernel),
            CASE1(CAPABILITY, CapabilityImageReadWrite, ImageBasic),
            CASE1(CAPABILITY, CapabilityImageMipmap, ImageBasic),
            // Value 16 intentionally missing.
            CASE1(CAPABILITY, CapabilityPipes, Kernel),
            CASE0(CAPABILITY, CapabilityGroups),
            CASE1(CAPABILITY, CapabilityDeviceEnqueue, Kernel),
            CASE1(CAPABILITY, CapabilityLiteralSampler, Kernel),
            CASE1(CAPABILITY, CapabilityAtomicStorage, Shader),
            CASE0(CAPABILITY, CapabilityInt16),
            CASE1(CAPABILITY, CapabilityTessellationPointSize, Tessellation),
            CASE1(CAPABILITY, CapabilityGeometryPointSize, Geometry),
            CASE1(CAPABILITY, CapabilityImageGatherExtended, Shader),
            // Value 26 intentionally missing.
            CASE1(CAPABILITY, CapabilityStorageImageMultisample, Shader),
            CASE1(CAPABILITY, CapabilityUniformBufferArrayDynamicIndexing, Shader),
            CASE1(CAPABILITY, CapabilitySampledImageArrayDynamicIndexing, Shader),
            CASE1(CAPABILITY, CapabilityStorageBufferArrayDynamicIndexing, Shader),
            CASE1(CAPABILITY, CapabilityStorageImageArrayDynamicIndexing, Shader),
            CASE1(CAPABILITY, CapabilityClipDistance, Shader),
            CASE1(CAPABILITY, CapabilityCullDistance, Shader),
            CASE1(CAPABILITY, CapabilityImageCubeArray, SampledCubeArray),
            CASE1(CAPABILITY, CapabilitySampleRateShading, Shader),
            CASE1(CAPABILITY, CapabilityImageRect, SampledRect),
            CASE1(CAPABILITY, CapabilitySampledRect, Shader),
            CASE1(CAPABILITY, CapabilityGenericPointer, Addresses),
            CASE0(CAPABILITY, CapabilityInt8),
            CASE1(CAPABILITY, CapabilityInputAttachment, Shader),
            CASE1(CAPABILITY, CapabilitySparseResidency, Shader),
            CASE1(CAPABILITY, CapabilityMinLod, Shader),
            CASE1(CAPABILITY, CapabilityImage1D, Sampled1D),
            CASE1(CAPABILITY, CapabilitySampledCubeArray, Shader),
            CASE1(CAPABILITY, CapabilityImageBuffer, SampledBuffer),
            CASE1(CAPABILITY, CapabilityImageMSArray, Shader),
            CASE1(CAPABILITY, CapabilityStorageImageExtendedFormats, Shader),
            CASE1(CAPABILITY, CapabilityImageQuery, Shader),
            CASE1(CAPABILITY, CapabilityDerivativeControl, Shader),
            CASE1(CAPABILITY, CapabilityInterpolationFunction, Shader),
            CASE1(CAPABILITY, CapabilityTransformFeedback, Shader),
            CASE1(CAPABILITY, CapabilityGeometryStreams, Geometry),
            CASE1(CAPABILITY, CapabilityStorageImageReadWithoutFormat, Shader),
            CASE1(CAPABILITY, CapabilityStorageImageWriteWithoutFormat, Shader),
            CASE1(CAPABILITY, CapabilityMultiViewport, Geometry),
            // clang-format on
        })));

INSTANTIATE_TEST_SUITE_P(
    CapabilityDependsOnV11, EnumCapabilityTest,
    Combine(Values(SPV_ENV_UNIVERSAL_1_1),
            ValuesIn(std::vector<EnumCapabilityCase>{
                CASE1(CAPABILITY, CapabilitySubgroupDispatch, DeviceEnqueue),
                CASE1(CAPABILITY, CapabilityNamedBarrier, Kernel),
                CASE1(CAPABILITY, CapabilityPipeStorage, Pipes),
            })));

#undef CASE0
#undef CASE1
#undef CASE2

}  // namespace
}  // namespace spvtools
