1fd4e5da5Sopenharmony_ci// Copyright (c) 2018 Google LLC.
2fd4e5da5Sopenharmony_ci//
3fd4e5da5Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
4fd4e5da5Sopenharmony_ci// you may not use this file except in compliance with the License.
5fd4e5da5Sopenharmony_ci// You may obtain a copy of the License at
6fd4e5da5Sopenharmony_ci//
7fd4e5da5Sopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
8fd4e5da5Sopenharmony_ci//
9fd4e5da5Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
10fd4e5da5Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
11fd4e5da5Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fd4e5da5Sopenharmony_ci// See the License for the specific language governing permissions and
13fd4e5da5Sopenharmony_ci// limitations under the License.
14fd4e5da5Sopenharmony_ci
15fd4e5da5Sopenharmony_ci// Validation tests for illegal instructions
16fd4e5da5Sopenharmony_ci
17fd4e5da5Sopenharmony_ci#include <string>
18fd4e5da5Sopenharmony_ci
19fd4e5da5Sopenharmony_ci#include "gmock/gmock.h"
20fd4e5da5Sopenharmony_ci#include "test/unit_spirv.h"
21fd4e5da5Sopenharmony_ci#include "test/val/val_fixtures.h"
22fd4e5da5Sopenharmony_ci
23fd4e5da5Sopenharmony_cinamespace spvtools {
24fd4e5da5Sopenharmony_cinamespace val {
25fd4e5da5Sopenharmony_cinamespace {
26fd4e5da5Sopenharmony_ci
27fd4e5da5Sopenharmony_ciusing ::testing::Eq;
28fd4e5da5Sopenharmony_ciusing ::testing::HasSubstr;
29fd4e5da5Sopenharmony_ci
30fd4e5da5Sopenharmony_ciusing ReservedSamplingInstTest = spvtest::ValidateBase<std::string>;
31fd4e5da5Sopenharmony_ci
32fd4e5da5Sopenharmony_ci// Generate a shader for use with validation tests for sparse sampling
33fd4e5da5Sopenharmony_ci// instructions.
34fd4e5da5Sopenharmony_cistd::string ShaderAssembly(const std::string& instruction_under_test) {
35fd4e5da5Sopenharmony_ci  std::ostringstream os;
36fd4e5da5Sopenharmony_ci  os << R"(    OpCapability Shader
37fd4e5da5Sopenharmony_ci               OpCapability SparseResidency
38fd4e5da5Sopenharmony_ci               OpMemoryModel Logical GLSL450
39fd4e5da5Sopenharmony_ci               OpEntryPoint Fragment %1 "main"
40fd4e5da5Sopenharmony_ci               OpExecutionMode %1 OriginUpperLeft
41fd4e5da5Sopenharmony_ci               OpSource GLSL 450
42fd4e5da5Sopenharmony_ci               OpDecorate %2 DescriptorSet 0
43fd4e5da5Sopenharmony_ci               OpDecorate %2 Binding 0
44fd4e5da5Sopenharmony_ci       %void = OpTypeVoid
45fd4e5da5Sopenharmony_ci          %4 = OpTypeFunction %void
46fd4e5da5Sopenharmony_ci      %float = OpTypeFloat 32
47fd4e5da5Sopenharmony_ci    %v4float = OpTypeVector %float 4
48fd4e5da5Sopenharmony_ci    %float_0 = OpConstant %float 0
49fd4e5da5Sopenharmony_ci          %8 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
50fd4e5da5Sopenharmony_ci          %9 = OpTypeImage %float 2D 0 0 0 1 Unknown
51fd4e5da5Sopenharmony_ci         %10 = OpTypeSampledImage %9
52fd4e5da5Sopenharmony_ci%_ptr_UniformConstant_10 = OpTypePointer UniformConstant %10
53fd4e5da5Sopenharmony_ci          %2 = OpVariable %_ptr_UniformConstant_10 UniformConstant
54fd4e5da5Sopenharmony_ci    %v2float = OpTypeVector %float 2
55fd4e5da5Sopenharmony_ci         %13 = OpConstantComposite %v2float %float_0 %float_0
56fd4e5da5Sopenharmony_ci        %int = OpTypeInt 32 1
57fd4e5da5Sopenharmony_ci %_struct_15 = OpTypeStruct %int %v4float
58fd4e5da5Sopenharmony_ci          %1 = OpFunction %void None %4
59fd4e5da5Sopenharmony_ci         %16 = OpLabel
60fd4e5da5Sopenharmony_ci         %17 = OpLoad %10 %2
61fd4e5da5Sopenharmony_ci)" << instruction_under_test
62fd4e5da5Sopenharmony_ci     << R"(
63fd4e5da5Sopenharmony_ci               OpReturn
64fd4e5da5Sopenharmony_ci               OpFunctionEnd
65fd4e5da5Sopenharmony_ci)";
66fd4e5da5Sopenharmony_ci
67fd4e5da5Sopenharmony_ci  return os.str();
68fd4e5da5Sopenharmony_ci}
69fd4e5da5Sopenharmony_ci
70fd4e5da5Sopenharmony_ciTEST_F(ReservedSamplingInstTest, OpImageSparseSampleProjImplicitLod) {
71fd4e5da5Sopenharmony_ci  const std::string input = ShaderAssembly(
72fd4e5da5Sopenharmony_ci      "%result = OpImageSparseSampleProjImplicitLod %_struct_15 %17 %13");
73fd4e5da5Sopenharmony_ci  CompileSuccessfully(input);
74fd4e5da5Sopenharmony_ci
75fd4e5da5Sopenharmony_ci  EXPECT_THAT(ValidateInstructions(), Eq(SPV_ERROR_INVALID_BINARY));
76fd4e5da5Sopenharmony_ci  EXPECT_THAT(
77fd4e5da5Sopenharmony_ci      getDiagnosticString(),
78fd4e5da5Sopenharmony_ci      HasSubstr("Invalid Opcode name 'OpImageSparseSampleProjImplicitLod'"));
79fd4e5da5Sopenharmony_ci}
80fd4e5da5Sopenharmony_ci
81fd4e5da5Sopenharmony_ciTEST_F(ReservedSamplingInstTest, OpImageSparseSampleProjExplicitLod) {
82fd4e5da5Sopenharmony_ci  const std::string input = ShaderAssembly(
83fd4e5da5Sopenharmony_ci      "%result = OpImageSparseSampleProjExplicitLod %_struct_15 %17 %13 Lod "
84fd4e5da5Sopenharmony_ci      "%float_0\n");
85fd4e5da5Sopenharmony_ci  CompileSuccessfully(input);
86fd4e5da5Sopenharmony_ci
87fd4e5da5Sopenharmony_ci  EXPECT_THAT(ValidateInstructions(), Eq(SPV_ERROR_INVALID_BINARY));
88fd4e5da5Sopenharmony_ci  EXPECT_THAT(
89fd4e5da5Sopenharmony_ci      getDiagnosticString(),
90fd4e5da5Sopenharmony_ci      HasSubstr("Invalid Opcode name 'OpImageSparseSampleProjExplicitLod'"));
91fd4e5da5Sopenharmony_ci}
92fd4e5da5Sopenharmony_ci
93fd4e5da5Sopenharmony_ciTEST_F(ReservedSamplingInstTest, OpImageSparseSampleProjDrefImplicitLod) {
94fd4e5da5Sopenharmony_ci  const std::string input = ShaderAssembly(
95fd4e5da5Sopenharmony_ci      "%result = OpImageSparseSampleProjDrefImplicitLod %_struct_15 %17 %13 "
96fd4e5da5Sopenharmony_ci      "%float_0\n");
97fd4e5da5Sopenharmony_ci  CompileSuccessfully(input);
98fd4e5da5Sopenharmony_ci
99fd4e5da5Sopenharmony_ci  EXPECT_THAT(ValidateInstructions(), Eq(SPV_ERROR_INVALID_BINARY));
100fd4e5da5Sopenharmony_ci  EXPECT_THAT(
101fd4e5da5Sopenharmony_ci      getDiagnosticString(),
102fd4e5da5Sopenharmony_ci      HasSubstr(
103fd4e5da5Sopenharmony_ci          "Invalid Opcode name 'OpImageSparseSampleProjDrefImplicitLod'"));
104fd4e5da5Sopenharmony_ci}
105fd4e5da5Sopenharmony_ci
106fd4e5da5Sopenharmony_ciTEST_F(ReservedSamplingInstTest, OpImageSparseSampleProjDrefExplicitLod) {
107fd4e5da5Sopenharmony_ci  const std::string input = ShaderAssembly(
108fd4e5da5Sopenharmony_ci      "%result = OpImageSparseSampleProjDrefExplicitLod %_struct_15 %17 %13 "
109fd4e5da5Sopenharmony_ci      "%float_0 Lod "
110fd4e5da5Sopenharmony_ci      "%float_0\n");
111fd4e5da5Sopenharmony_ci  CompileSuccessfully(input);
112fd4e5da5Sopenharmony_ci
113fd4e5da5Sopenharmony_ci  EXPECT_THAT(ValidateInstructions(), Eq(SPV_ERROR_INVALID_BINARY));
114fd4e5da5Sopenharmony_ci  EXPECT_THAT(
115fd4e5da5Sopenharmony_ci      getDiagnosticString(),
116fd4e5da5Sopenharmony_ci      HasSubstr(
117fd4e5da5Sopenharmony_ci          "Invalid Opcode name 'OpImageSparseSampleProjDrefExplicitLod'"));
118fd4e5da5Sopenharmony_ci}
119fd4e5da5Sopenharmony_ci
120fd4e5da5Sopenharmony_ci}  // namespace
121fd4e5da5Sopenharmony_ci}  // namespace val
122fd4e5da5Sopenharmony_ci}  // namespace spvtools
123