• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2020 Google LLC
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 "source/fuzz/transformation_add_constant_null.h"
16 
17 #include "gtest/gtest.h"
18 #include "source/fuzz/fuzzer_util.h"
19 #include "test/fuzz/fuzz_test_util.h"
20 
21 namespace spvtools {
22 namespace fuzz {
23 namespace {
24 
TEST(TransformationAddConstantNullTest,BasicTest)25 TEST(TransformationAddConstantNullTest, BasicTest) {
26   std::string shader = R"(
27                OpCapability Shader
28           %1 = OpExtInstImport "GLSL.std.450"
29                OpMemoryModel Logical GLSL450
30                OpEntryPoint Fragment %4 "main"
31                OpExecutionMode %4 OriginUpperLeft
32                OpSource ESSL 310
33           %2 = OpTypeVoid
34           %3 = OpTypeFunction %2
35           %6 = OpTypeFloat 32
36           %7 = OpTypeInt 32 1
37           %8 = OpTypeVector %6 2
38           %9 = OpTypeVector %6 3
39          %10 = OpTypeVector %6 4
40          %11 = OpTypeVector %7 2
41          %20 = OpTypeSampler
42          %21 = OpTypeImage %6 2D 0 0 0 0 Rgba32f
43          %22 = OpTypeSampledImage %21
44           %4 = OpFunction %2 None %3
45           %5 = OpLabel
46                OpReturn
47                OpFunctionEnd
48   )";
49 
50   const auto env = SPV_ENV_UNIVERSAL_1_4;
51   const auto consumer = nullptr;
52   const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
53   spvtools::ValidatorOptions validator_options;
54   ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
55                                                kConsoleMessageConsumer));
56   TransformationContext transformation_context(
57       MakeUnique<FactManager>(context.get()), validator_options);
58   // Id already in use
59   ASSERT_FALSE(TransformationAddConstantNull(4, 11).IsApplicable(
60       context.get(), transformation_context));
61   // %1 is not a type
62   ASSERT_FALSE(TransformationAddConstantNull(100, 1).IsApplicable(
63       context.get(), transformation_context));
64 
65   // %3 is a function type
66   ASSERT_FALSE(TransformationAddConstantNull(100, 3).IsApplicable(
67       context.get(), transformation_context));
68 
69   // %20 is a sampler type
70   ASSERT_FALSE(TransformationAddConstantNull(100, 20).IsApplicable(
71       context.get(), transformation_context));
72 
73   // %21 is an image type
74   ASSERT_FALSE(TransformationAddConstantNull(100, 21).IsApplicable(
75       context.get(), transformation_context));
76 
77   // %22 is a sampled image type
78   ASSERT_FALSE(TransformationAddConstantNull(100, 22).IsApplicable(
79       context.get(), transformation_context));
80 
81   TransformationAddConstantNull transformations[] = {
82       // %100 = OpConstantNull %6
83       TransformationAddConstantNull(100, 6),
84 
85       // %101 = OpConstantNull %7
86       TransformationAddConstantNull(101, 7),
87 
88       // %102 = OpConstantNull %8
89       TransformationAddConstantNull(102, 8),
90 
91       // %103 = OpConstantNull %9
92       TransformationAddConstantNull(103, 9),
93 
94       // %104 = OpConstantNull %10
95       TransformationAddConstantNull(104, 10),
96 
97       // %105 = OpConstantNull %11
98       TransformationAddConstantNull(105, 11)};
99 
100   for (auto& transformation : transformations) {
101     ASSERT_TRUE(
102         transformation.IsApplicable(context.get(), transformation_context));
103     ApplyAndCheckFreshIds(transformation, context.get(),
104                           &transformation_context);
105   }
106   ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
107                                                kConsoleMessageConsumer));
108 
109   std::string after_transformation = R"(
110                OpCapability Shader
111           %1 = OpExtInstImport "GLSL.std.450"
112                OpMemoryModel Logical GLSL450
113                OpEntryPoint Fragment %4 "main"
114                OpExecutionMode %4 OriginUpperLeft
115                OpSource ESSL 310
116           %2 = OpTypeVoid
117           %3 = OpTypeFunction %2
118           %6 = OpTypeFloat 32
119           %7 = OpTypeInt 32 1
120           %8 = OpTypeVector %6 2
121           %9 = OpTypeVector %6 3
122          %10 = OpTypeVector %6 4
123          %11 = OpTypeVector %7 2
124          %20 = OpTypeSampler
125          %21 = OpTypeImage %6 2D 0 0 0 0 Rgba32f
126          %22 = OpTypeSampledImage %21
127         %100 = OpConstantNull %6
128         %101 = OpConstantNull %7
129         %102 = OpConstantNull %8
130         %103 = OpConstantNull %9
131         %104 = OpConstantNull %10
132         %105 = OpConstantNull %11
133           %4 = OpFunction %2 None %3
134           %5 = OpLabel
135                OpReturn
136                OpFunctionEnd
137   )";
138   ASSERT_TRUE(IsEqual(env, after_transformation, context.get()));
139 }
140 
141 }  // namespace
142 }  // namespace fuzz
143 }  // namespace spvtools
144