KhronosGroup / KhronosGroup/SPIRV-Tools

OpImageTexelPointer does not check the number of channels

Open
#2,846 0 comments 0 reactions 1 assignee Claimed by @alan-baker View on GitHub
component:validation
Dominant language
C++
Stars
1.4k
Forks
709
Avg merge
1d 22h
Merged PRs (30d)
28

Description

Based on GLSL spec, we cannot use rgba image for atomic add.
However, SPIR-V validator accepts the following SPIR-V code without any validation error:

```
; SPIR-V
; Version: 1.0
; Generator: Google spiregg; 0
; Bound: 36
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %main "main" %in_var_SV_Position %target
OpSource HLSL 600
OpName %type_3d_image "type.3d.image"
OpName %target "target"
OpName %in_var_SV_Position "in.var.SV_Position"
OpName %main "main"
OpName %VS_OUTPUT "VS_OUTPUT"
OpMemberName %VS_OUTPUT 0 "Pos"
OpName %param_var_input "param.var.input"
OpName %src_main "src.main"
OpName %input "input"
OpName %bb_entry "bb.entry"
OpName %index "index"
OpDecorate %in_var_SV_Position Location 0
OpDecorate %target DescriptorSet 0
OpDecorate %target Binding 1
%uint = OpTypeInt 32 0
%uint_0 = OpConstant %uint 0
%v3uint = OpTypeVector %uint 3
%7 = OpConstantComposite %v3uint %uint_0 %uint_0 %uint_0
%uint_1 = OpConstant %uint 1
%uint_64 = OpConstant %uint 64
%type_3d_image = OpTypeImage %uint 3D 2 0 0 2 Rgba32ui
%_ptr_UniformConstant_type_3d_image = OpTypePointer UniformConstant %type_3d_image
%_ptr_Image_type_uint = OpTypePointer Image %uint
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Input_v4float = OpTypePointer Input %v4float
%void = OpTypeVoid
%15 = OpTypeFunction %void
%VS_OUTPUT = OpTypeStruct %v4float
%_ptr_Function_VS_OUTPUT = OpTypePointer Function %VS_OUTPUT
%24 = OpTypeFunction %void %_ptr_Function_VS_OUTPUT
%_ptr_Function_v3uint = OpTypePointer Function %v3uint
%_ptr_Function_uint = OpTypePointer Function %uint
%v4uint = OpTypeVector %uint 4
%target = OpVariable %_ptr_UniformConstant_type_3d_image UniformConstant
%in_var_SV_Position = OpVariable %_ptr_Input_v4float Input
%main = OpFunction %void None %15
%16 = OpLabel
%param_var_input = OpVariable %_ptr_Function_VS_OUTPUT Function
%20 = OpLoad %v4float %in_var_SV_Position
%21 = OpCompositeConstruct %VS_OUTPUT %20
%22 = OpFunctionCall %void %src_main %param_var_input
OpReturn
OpFunctionEnd
%src_main = OpFunction %void None %24
%input = OpFunctionParameter %_ptr_Function_VS_OUTPUT
%bb_entry = OpLabel
%index = OpVariable %_ptr_Function_v3uint Function
OpStore %index %7
%index_val = OpLoad %v3uint %index

; OpImageTexelPointer uses 'target' whose channel is 'Rgba32ui'
%ptr = OpImageTexelPointer %_ptr_Image_type_uint %target %index_val %uint_0
%add = OpAtomicIAdd %uint %ptr %uint_1 %uint_64 %uint_1

OpReturn
OpFunctionEnd
```

I believe it does not check image format for `OpImageTexelPointer`.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.