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