mirror of
https://github.com/KhronosGroup/SPIRV-Tools
synced 2024-11-24 20:40:13 +00:00
OpSampledImage extra validation (#5695)
* Validate that the type of Image operand matches the result type's Image operand
This commit is contained in:
parent
fd96922e9a
commit
70ad4dae7d
@ -1005,7 +1005,8 @@ bool IsAllowedSampledImageOperand(spv::Op opcode, ValidationState_t& _) {
|
||||
|
||||
spv_result_t ValidateSampledImage(ValidationState_t& _,
|
||||
const Instruction* inst) {
|
||||
if (_.GetIdOpcode(inst->type_id()) != spv::Op::OpTypeSampledImage) {
|
||||
auto type_inst = _.FindDef(inst->type_id());
|
||||
if (type_inst->opcode() != spv::Op::OpTypeSampledImage) {
|
||||
return _.diag(SPV_ERROR_INVALID_DATA, inst)
|
||||
<< "Expected Result Type to be OpTypeSampledImage.";
|
||||
}
|
||||
@ -1016,6 +1017,11 @@ spv_result_t ValidateSampledImage(ValidationState_t& _,
|
||||
<< "Expected Image to be of type OpTypeImage.";
|
||||
}
|
||||
|
||||
if (type_inst->GetOperandAs<uint32_t>(1) != image_type) {
|
||||
return _.diag(SPV_ERROR_INVALID_DATA, inst)
|
||||
<< "Expected Image to have the same type as Result Type Image";
|
||||
}
|
||||
|
||||
ImageTypeInfo info;
|
||||
if (!GetImageTypeInfo(_, image_type, &info)) {
|
||||
return _.diag(SPV_ERROR_INVALID_DATA, inst)
|
||||
|
@ -4451,7 +4451,7 @@ TEST_F(ValidateImage, QuerySizeNotImage) {
|
||||
const std::string body = R"(
|
||||
%img = OpLoad %type_image_f32_2d_0011 %uniform_image_f32_2d_0011
|
||||
%sampler = OpLoad %type_sampler %uniform_sampler
|
||||
%simg = OpSampledImage %type_sampled_image_f32_2d_0001 %img %sampler
|
||||
%simg = OpSampledImage %type_sampled_image_f32_2d_0011 %img %sampler
|
||||
%res1 = OpImageQuerySize %u32vec2 %sampler
|
||||
)";
|
||||
|
||||
@ -4465,7 +4465,7 @@ TEST_F(ValidateImage, QuerySizeSampledImageDirectly) {
|
||||
const std::string body = R"(
|
||||
%img = OpLoad %type_image_f32_2d_0011 %uniform_image_f32_2d_0011
|
||||
%sampler = OpLoad %type_sampler %uniform_sampler
|
||||
%simg = OpSampledImage %type_sampled_image_f32_2d_0001 %img %sampler
|
||||
%simg = OpSampledImage %type_sampled_image_f32_2d_0011 %img %sampler
|
||||
%res1 = OpImageQuerySize %u32vec2 %simg
|
||||
)";
|
||||
|
||||
@ -10647,6 +10647,44 @@ TEST_F(ValidateImage, ImageMSArray_ArrayedTypeDoesNotRequireCapability) {
|
||||
EXPECT_THAT(getDiagnosticString(), Eq(""));
|
||||
}
|
||||
|
||||
TEST_F(ValidateImage, SampledImageTypeMismatch) {
|
||||
const std::string code = R"(
|
||||
OpCapability Shader
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main"
|
||||
OpExecutionMode %main LocalSize 1 1 1
|
||||
OpDecorate %im_var DescriptorSet 0
|
||||
OpDecorate %im_var Binding 0
|
||||
OpDecorate %s_var DescriptorSet 1
|
||||
OpDecorate %s_var Binding 0
|
||||
%void = OpTypeVoid
|
||||
%float = OpTypeFloat 32
|
||||
%im1_ty = OpTypeImage %float 2D 0 0 0 1 Unknown
|
||||
%im2_ty = OpTypeImage %float 2D 1 0 0 1 Unknown
|
||||
%s_ty = OpTypeSampler
|
||||
%s_im_ty = OpTypeSampledImage %im2_ty
|
||||
%ptr_im = OpTypePointer UniformConstant %im1_ty
|
||||
%ptr_s = OpTypePointer UniformConstant %s_ty
|
||||
%im_var = OpVariable %ptr_im UniformConstant
|
||||
%s_var = OpVariable %ptr_s UniformConstant
|
||||
%void_fn = OpTypeFunction %void
|
||||
%main = OpFunction %void None %void_fn
|
||||
%entry = OpLabel
|
||||
%im_ld = OpLoad %im1_ty %im_var
|
||||
%s_ld = OpLoad %s_ty %s_var
|
||||
%sampled_image = OpSampledImage %s_im_ty %im_ld %s_ld
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
|
||||
const spv_target_env env = SPV_ENV_VULKAN_1_0;
|
||||
CompileSuccessfully(code, env);
|
||||
ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(env));
|
||||
EXPECT_THAT(
|
||||
getDiagnosticString(),
|
||||
HasSubstr("Expected Image to have the same type as Result Type Image"));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace val
|
||||
} // namespace spvtools
|
||||
|
Loading…
Reference in New Issue
Block a user