1 // Copyright (c) 2017 Google Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 // Tests for OpExtension validator rules.
16
17 #include <string>
18 #include <utility>
19 #include <vector>
20
21 #include "gtest/gtest.h"
22 #include "source/enum_string_mapping.h"
23 #include "source/extensions.h"
24
25 namespace spvtools {
26 namespace {
27
28 using ::testing::Values;
29 using ::testing::ValuesIn;
30
31 using ExtensionTest =
32 ::testing::TestWithParam<std::pair<Extension, std::string>>;
33 using UnknownExtensionTest = ::testing::TestWithParam<std::string>;
34 using CapabilityTest =
35 ::testing::TestWithParam<std::pair<SpvCapability, std::string>>;
36
TEST_P(ExtensionTest,TestExtensionFromString)37 TEST_P(ExtensionTest, TestExtensionFromString) {
38 const std::pair<Extension, std::string>& param = GetParam();
39 const Extension extension = param.first;
40 const std::string extension_str = param.second;
41 Extension result_extension;
42 ASSERT_TRUE(GetExtensionFromString(extension_str.c_str(), &result_extension));
43 EXPECT_EQ(extension, result_extension);
44 }
45
TEST_P(ExtensionTest,TestExtensionToString)46 TEST_P(ExtensionTest, TestExtensionToString) {
47 const std::pair<Extension, std::string>& param = GetParam();
48 const Extension extension = param.first;
49 const std::string extension_str = param.second;
50 const std::string result_str = ExtensionToString(extension);
51 EXPECT_EQ(extension_str, result_str);
52 }
53
TEST_P(UnknownExtensionTest,TestExtensionFromStringFails)54 TEST_P(UnknownExtensionTest, TestExtensionFromStringFails) {
55 Extension result_extension;
56 ASSERT_FALSE(GetExtensionFromString(GetParam().c_str(), &result_extension));
57 }
58
TEST_P(CapabilityTest,TestCapabilityToString)59 TEST_P(CapabilityTest, TestCapabilityToString) {
60 const std::pair<SpvCapability, std::string>& param = GetParam();
61 const SpvCapability capability = param.first;
62 const std::string capability_str = param.second;
63 const std::string result_str = CapabilityToString(capability);
64 EXPECT_EQ(capability_str, result_str);
65 }
66
67 INSTANTIATE_TEST_SUITE_P(
68 AllExtensions, ExtensionTest,
69 ValuesIn(std::vector<std::pair<Extension, std::string>>({
70 {Extension::kSPV_KHR_16bit_storage, "SPV_KHR_16bit_storage"},
71 {Extension::kSPV_KHR_device_group, "SPV_KHR_device_group"},
72 {Extension::kSPV_KHR_multiview, "SPV_KHR_multiview"},
73 {Extension::kSPV_KHR_shader_ballot, "SPV_KHR_shader_ballot"},
74 {Extension::kSPV_KHR_shader_draw_parameters,
75 "SPV_KHR_shader_draw_parameters"},
76 {Extension::kSPV_KHR_subgroup_vote, "SPV_KHR_subgroup_vote"},
77 {Extension::kSPV_NVX_multiview_per_view_attributes,
78 "SPV_NVX_multiview_per_view_attributes"},
79 {Extension::kSPV_NV_geometry_shader_passthrough,
80 "SPV_NV_geometry_shader_passthrough"},
81 {Extension::kSPV_NV_sample_mask_override_coverage,
82 "SPV_NV_sample_mask_override_coverage"},
83 {Extension::kSPV_NV_stereo_view_rendering,
84 "SPV_NV_stereo_view_rendering"},
85 {Extension::kSPV_NV_viewport_array2, "SPV_NV_viewport_array2"},
86 {Extension::kSPV_GOOGLE_decorate_string, "SPV_GOOGLE_decorate_string"},
87 {Extension::kSPV_GOOGLE_hlsl_functionality1,
88 "SPV_GOOGLE_hlsl_functionality1"},
89 {Extension::kSPV_KHR_8bit_storage, "SPV_KHR_8bit_storage"},
90 })));
91
92 INSTANTIATE_TEST_SUITE_P(UnknownExtensions, UnknownExtensionTest,
93 Values("", "SPV_KHR_", "SPV_KHR_device_group_ERROR",
94 /*alphabetically before all extensions*/ "A",
95 /*alphabetically after all extensions*/ "Z",
96 "SPV_ERROR_random_string_hfsdklhlktherh"));
97
98 INSTANTIATE_TEST_SUITE_P(
99 AllCapabilities, CapabilityTest,
100 ValuesIn(std::vector<std::pair<SpvCapability, std::string>>(
101 {{SpvCapabilityMatrix, "Matrix"},
102 {SpvCapabilityShader, "Shader"},
103 {SpvCapabilityGeometry, "Geometry"},
104 {SpvCapabilityTessellation, "Tessellation"},
105 {SpvCapabilityAddresses, "Addresses"},
106 {SpvCapabilityLinkage, "Linkage"},
107 {SpvCapabilityKernel, "Kernel"},
108 {SpvCapabilityVector16, "Vector16"},
109 {SpvCapabilityFloat16Buffer, "Float16Buffer"},
110 {SpvCapabilityFloat16, "Float16"},
111 {SpvCapabilityFloat64, "Float64"},
112 {SpvCapabilityInt64, "Int64"},
113 {SpvCapabilityInt64Atomics, "Int64Atomics"},
114 {SpvCapabilityImageBasic, "ImageBasic"},
115 {SpvCapabilityImageReadWrite, "ImageReadWrite"},
116 {SpvCapabilityImageMipmap, "ImageMipmap"},
117 {SpvCapabilityPipes, "Pipes"},
118 {SpvCapabilityGroups, "Groups"},
119 {SpvCapabilityDeviceEnqueue, "DeviceEnqueue"},
120 {SpvCapabilityLiteralSampler, "LiteralSampler"},
121 {SpvCapabilityAtomicStorage, "AtomicStorage"},
122 {SpvCapabilityInt16, "Int16"},
123 {SpvCapabilityTessellationPointSize, "TessellationPointSize"},
124 {SpvCapabilityGeometryPointSize, "GeometryPointSize"},
125 {SpvCapabilityImageGatherExtended, "ImageGatherExtended"},
126 {SpvCapabilityStorageImageMultisample, "StorageImageMultisample"},
127 {SpvCapabilityUniformBufferArrayDynamicIndexing,
128 "UniformBufferArrayDynamicIndexing"},
129 {SpvCapabilitySampledImageArrayDynamicIndexing,
130 "SampledImageArrayDynamicIndexing"},
131 {SpvCapabilityStorageBufferArrayDynamicIndexing,
132 "StorageBufferArrayDynamicIndexing"},
133 {SpvCapabilityStorageImageArrayDynamicIndexing,
134 "StorageImageArrayDynamicIndexing"},
135 {SpvCapabilityClipDistance, "ClipDistance"},
136 {SpvCapabilityCullDistance, "CullDistance"},
137 {SpvCapabilityImageCubeArray, "ImageCubeArray"},
138 {SpvCapabilitySampleRateShading, "SampleRateShading"},
139 {SpvCapabilityImageRect, "ImageRect"},
140 {SpvCapabilitySampledRect, "SampledRect"},
141 {SpvCapabilityGenericPointer, "GenericPointer"},
142 {SpvCapabilityInt8, "Int8"},
143 {SpvCapabilityInputAttachment, "InputAttachment"},
144 {SpvCapabilitySparseResidency, "SparseResidency"},
145 {SpvCapabilityMinLod, "MinLod"},
146 {SpvCapabilitySampled1D, "Sampled1D"},
147 {SpvCapabilityImage1D, "Image1D"},
148 {SpvCapabilitySampledCubeArray, "SampledCubeArray"},
149 {SpvCapabilitySampledBuffer, "SampledBuffer"},
150 {SpvCapabilityImageBuffer, "ImageBuffer"},
151 {SpvCapabilityImageMSArray, "ImageMSArray"},
152 {SpvCapabilityStorageImageExtendedFormats,
153 "StorageImageExtendedFormats"},
154 {SpvCapabilityImageQuery, "ImageQuery"},
155 {SpvCapabilityDerivativeControl, "DerivativeControl"},
156 {SpvCapabilityInterpolationFunction, "InterpolationFunction"},
157 {SpvCapabilityTransformFeedback, "TransformFeedback"},
158 {SpvCapabilityGeometryStreams, "GeometryStreams"},
159 {SpvCapabilityStorageImageReadWithoutFormat,
160 "StorageImageReadWithoutFormat"},
161 {SpvCapabilityStorageImageWriteWithoutFormat,
162 "StorageImageWriteWithoutFormat"},
163 {SpvCapabilityMultiViewport, "MultiViewport"},
164 {SpvCapabilitySubgroupDispatch, "SubgroupDispatch"},
165 {SpvCapabilityNamedBarrier, "NamedBarrier"},
166 {SpvCapabilityPipeStorage, "PipeStorage"},
167 {SpvCapabilitySubgroupBallotKHR, "SubgroupBallotKHR"},
168 {SpvCapabilityDrawParameters, "DrawParameters"},
169 {SpvCapabilitySubgroupVoteKHR, "SubgroupVoteKHR"},
170 {SpvCapabilityStorageBuffer16BitAccess, "StorageBuffer16BitAccess"},
171 {SpvCapabilityStorageUniformBufferBlock16,
172 "StorageBuffer16BitAccess"}, // Preferred name
173 {SpvCapabilityUniformAndStorageBuffer16BitAccess,
174 "UniformAndStorageBuffer16BitAccess"},
175 {SpvCapabilityStorageUniform16,
176 "UniformAndStorageBuffer16BitAccess"}, // Preferred name
177 {SpvCapabilityStoragePushConstant16, "StoragePushConstant16"},
178 {SpvCapabilityStorageInputOutput16, "StorageInputOutput16"},
179 {SpvCapabilityDeviceGroup, "DeviceGroup"},
180 {SpvCapabilityMultiView, "MultiView"},
181 {SpvCapabilitySampleMaskOverrideCoverageNV,
182 "SampleMaskOverrideCoverageNV"},
183 {SpvCapabilityGeometryShaderPassthroughNV,
184 "GeometryShaderPassthroughNV"},
185 // The next two are different names for the same token.
186 {SpvCapabilityShaderViewportIndexLayerNV,
187 "ShaderViewportIndexLayerEXT"},
188 {SpvCapabilityShaderViewportIndexLayerEXT,
189 "ShaderViewportIndexLayerEXT"},
190 {SpvCapabilityShaderViewportMaskNV, "ShaderViewportMaskNV"},
191 {SpvCapabilityShaderStereoViewNV, "ShaderStereoViewNV"},
192 {SpvCapabilityPerViewAttributesNV, "PerViewAttributesNV"}})));
193
194 } // namespace
195 } // namespace spvtools
196