• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include <algorithm>
16 #include <memory>
17 #include <string>
18 
19 #include "gmock/gmock.h"
20 #include "gtest/gtest.h"
21 #include "source/opt/build_module.h"
22 #include "source/opt/ir_context.h"
23 
24 namespace spvtools {
25 namespace opt {
26 namespace {
27 
28 using FeatureManagerTest = ::testing::Test;
29 
TEST_F(FeatureManagerTest,MissingExtension)30 TEST_F(FeatureManagerTest, MissingExtension) {
31   const std::string text = R"(
32 OpCapability Shader
33 OpMemoryModel Logical GLSL450
34   )";
35 
36   std::unique_ptr<IRContext> context =
37       BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text);
38   ASSERT_NE(context, nullptr);
39 
40   EXPECT_FALSE(context->get_feature_mgr()->HasExtension(
41       Extension::kSPV_KHR_variable_pointers));
42 }
43 
TEST_F(FeatureManagerTest,OneExtension)44 TEST_F(FeatureManagerTest, OneExtension) {
45   const std::string text = R"(
46 OpCapability Shader
47 OpMemoryModel Logical GLSL450
48 OpExtension "SPV_KHR_variable_pointers"
49   )";
50 
51   std::unique_ptr<IRContext> context =
52       BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text);
53   ASSERT_NE(context, nullptr);
54 
55   EXPECT_TRUE(context->get_feature_mgr()->HasExtension(
56       Extension::kSPV_KHR_variable_pointers));
57 }
58 
TEST_F(FeatureManagerTest,NotADifferentExtension)59 TEST_F(FeatureManagerTest, NotADifferentExtension) {
60   const std::string text = R"(
61 OpCapability Shader
62 OpMemoryModel Logical GLSL450
63 OpExtension "SPV_KHR_variable_pointers"
64   )";
65 
66   std::unique_ptr<IRContext> context =
67       BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text);
68   ASSERT_NE(context, nullptr);
69 
70   EXPECT_FALSE(context->get_feature_mgr()->HasExtension(
71       Extension::kSPV_KHR_storage_buffer_storage_class));
72 }
73 
TEST_F(FeatureManagerTest,TwoExtensions)74 TEST_F(FeatureManagerTest, TwoExtensions) {
75   const std::string text = R"(
76 OpCapability Shader
77 OpMemoryModel Logical GLSL450
78 OpExtension "SPV_KHR_variable_pointers"
79 OpExtension "SPV_KHR_storage_buffer_storage_class"
80   )";
81 
82   std::unique_ptr<IRContext> context =
83       BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text);
84   ASSERT_NE(context, nullptr);
85 
86   EXPECT_TRUE(context->get_feature_mgr()->HasExtension(
87       Extension::kSPV_KHR_variable_pointers));
88   EXPECT_TRUE(context->get_feature_mgr()->HasExtension(
89       Extension::kSPV_KHR_storage_buffer_storage_class));
90 }
91 
92 // Test capability checks.
TEST_F(FeatureManagerTest,ExplicitlyPresent1)93 TEST_F(FeatureManagerTest, ExplicitlyPresent1) {
94   const std::string text = R"(
95 OpCapability Shader
96 OpMemoryModel Logical GLSL450
97   )";
98 
99   std::unique_ptr<IRContext> context =
100       BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text);
101   ASSERT_NE(context, nullptr);
102 
103   EXPECT_TRUE(context->get_feature_mgr()->HasCapability(SpvCapabilityShader));
104   EXPECT_FALSE(context->get_feature_mgr()->HasCapability(SpvCapabilityKernel));
105 }
106 
TEST_F(FeatureManagerTest,ExplicitlyPresent2)107 TEST_F(FeatureManagerTest, ExplicitlyPresent2) {
108   const std::string text = R"(
109 OpCapability Kernel
110 OpMemoryModel Logical GLSL450
111   )";
112 
113   std::unique_ptr<IRContext> context =
114       BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text);
115   ASSERT_NE(context, nullptr);
116 
117   EXPECT_FALSE(context->get_feature_mgr()->HasCapability(SpvCapabilityShader));
118   EXPECT_TRUE(context->get_feature_mgr()->HasCapability(SpvCapabilityKernel));
119 }
120 
TEST_F(FeatureManagerTest,ImplicitlyPresent)121 TEST_F(FeatureManagerTest, ImplicitlyPresent) {
122   const std::string text = R"(
123 OpCapability Tessellation
124 OpMemoryModel Logical GLSL450
125   )";
126 
127   std::unique_ptr<IRContext> context =
128       BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text);
129   ASSERT_NE(context, nullptr);
130 
131   // Check multiple levels of indirection.  Tessellation implies Shader, which
132   // implies Matrix.
133   EXPECT_TRUE(
134       context->get_feature_mgr()->HasCapability(SpvCapabilityTessellation));
135   EXPECT_TRUE(context->get_feature_mgr()->HasCapability(SpvCapabilityShader));
136   EXPECT_TRUE(context->get_feature_mgr()->HasCapability(SpvCapabilityMatrix));
137   EXPECT_FALSE(context->get_feature_mgr()->HasCapability(SpvCapabilityKernel));
138 }
139 
140 }  // namespace
141 }  // namespace opt
142 }  // namespace spvtools
143