• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2018 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 // Validation tests for illegal instructions
16 
17 #include <string>
18 
19 #include "gmock/gmock.h"
20 #include "test/unit_spirv.h"
21 #include "test/val/val_fixtures.h"
22 
23 namespace spvtools {
24 namespace val {
25 namespace {
26 
27 using ::testing::Eq;
28 using ::testing::HasSubstr;
29 
30 using ReservedSamplingInstTest = spvtest::ValidateBase<std::string>;
31 
32 // Generate a shader for use with validation tests for sparse sampling
33 // instructions.
ShaderAssembly(const std::string & instruction_under_test)34 std::string ShaderAssembly(const std::string& instruction_under_test) {
35   std::ostringstream os;
36   os << R"(    OpCapability Shader
37                OpCapability SparseResidency
38                OpMemoryModel Logical GLSL450
39                OpEntryPoint Fragment %1 "main"
40                OpExecutionMode %1 OriginUpperLeft
41                OpSource GLSL 450
42                OpDecorate %2 DescriptorSet 0
43                OpDecorate %2 Binding 0
44        %void = OpTypeVoid
45           %4 = OpTypeFunction %void
46       %float = OpTypeFloat 32
47     %v4float = OpTypeVector %float 4
48     %float_0 = OpConstant %float 0
49           %8 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
50           %9 = OpTypeImage %float 2D 0 0 0 1 Unknown
51          %10 = OpTypeSampledImage %9
52 %_ptr_UniformConstant_10 = OpTypePointer UniformConstant %10
53           %2 = OpVariable %_ptr_UniformConstant_10 UniformConstant
54     %v2float = OpTypeVector %float 2
55          %13 = OpConstantComposite %v2float %float_0 %float_0
56         %int = OpTypeInt 32 1
57  %_struct_15 = OpTypeStruct %int %v4float
58           %1 = OpFunction %void None %4
59          %16 = OpLabel
60          %17 = OpLoad %10 %2
61 )" << instruction_under_test
62      << R"(
63                OpReturn
64                OpFunctionEnd
65 )";
66 
67   return os.str();
68 }
69 
TEST_F(ReservedSamplingInstTest,OpImageSparseSampleProjImplicitLod)70 TEST_F(ReservedSamplingInstTest, OpImageSparseSampleProjImplicitLod) {
71   const std::string input = ShaderAssembly(
72       "%result = OpImageSparseSampleProjImplicitLod %_struct_15 %17 %13");
73   CompileSuccessfully(input);
74 
75   EXPECT_THAT(ValidateInstructions(), Eq(SPV_ERROR_INVALID_BINARY));
76   EXPECT_THAT(
77       getDiagnosticString(),
78       HasSubstr("Invalid Opcode name 'OpImageSparseSampleProjImplicitLod'"));
79 }
80 
TEST_F(ReservedSamplingInstTest,OpImageSparseSampleProjExplicitLod)81 TEST_F(ReservedSamplingInstTest, OpImageSparseSampleProjExplicitLod) {
82   const std::string input = ShaderAssembly(
83       "%result = OpImageSparseSampleProjExplicitLod %_struct_15 %17 %13 Lod "
84       "%float_0\n");
85   CompileSuccessfully(input);
86 
87   EXPECT_THAT(ValidateInstructions(), Eq(SPV_ERROR_INVALID_BINARY));
88   EXPECT_THAT(
89       getDiagnosticString(),
90       HasSubstr("Invalid Opcode name 'OpImageSparseSampleProjExplicitLod'"));
91 }
92 
TEST_F(ReservedSamplingInstTest,OpImageSparseSampleProjDrefImplicitLod)93 TEST_F(ReservedSamplingInstTest, OpImageSparseSampleProjDrefImplicitLod) {
94   const std::string input = ShaderAssembly(
95       "%result = OpImageSparseSampleProjDrefImplicitLod %_struct_15 %17 %13 "
96       "%float_0\n");
97   CompileSuccessfully(input);
98 
99   EXPECT_THAT(ValidateInstructions(), Eq(SPV_ERROR_INVALID_BINARY));
100   EXPECT_THAT(
101       getDiagnosticString(),
102       HasSubstr(
103           "Invalid Opcode name 'OpImageSparseSampleProjDrefImplicitLod'"));
104 }
105 
TEST_F(ReservedSamplingInstTest,OpImageSparseSampleProjDrefExplicitLod)106 TEST_F(ReservedSamplingInstTest, OpImageSparseSampleProjDrefExplicitLod) {
107   const std::string input = ShaderAssembly(
108       "%result = OpImageSparseSampleProjDrefExplicitLod %_struct_15 %17 %13 "
109       "%float_0 Lod "
110       "%float_0\n");
111   CompileSuccessfully(input);
112 
113   EXPECT_THAT(ValidateInstructions(), Eq(SPV_ERROR_INVALID_BINARY));
114   EXPECT_THAT(
115       getDiagnosticString(),
116       HasSubstr(
117           "Invalid Opcode name 'OpImageSparseSampleProjDrefExplicitLod'"));
118 }
119 
120 }  // namespace
121 }  // namespace val
122 }  // namespace spvtools
123