-
Notifications
You must be signed in to change notification settings - Fork 664
Fix up how OpImageTexelPointer is interpreted. #1445
Copy link
Copy link
Closed
Description
The only spot we do anything special with OpImageTexelPointer is when trying to get the base pointer. In that place, we treat it like an OpAccessChain where it manipulates the operand pointer.
When looking at an example that uses it, I think this interpretation is not the best way of thinking about it. Consider the following example,
OpCapability SampledBuffer
OpCapability StorageImageExtendedFormats
OpCapability ImageBuffer
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %2 "min" %gl_GlobalInvocationID
OpExecutionMode %2 LocalSize 64 1 1
OpSource HLSL 600
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
OpDecorate %4 DescriptorSet 4
OpDecorate %4 Binding 70
%uint = OpTypeInt 32 0
%6 = OpTypeImage %uint Buffer 0 0 0 2 R32ui
%_ptr_UniformConstant_6 = OpTypePointer UniformConstant %6
%_ptr_Private_6 = OpTypePointer Private %6
%void = OpTypeVoid
%10 = OpTypeFunction %void
%uint_0 = OpConstant %uint 0
%uint_1 = OpConstant %uint 1
%v3uint = OpTypeVector %uint 3
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%_ptr_Image_uint = OpTypePointer Image %uint
%4 = OpVariable %_ptr_UniformConstant_6 UniformConstant
%16 = OpVariable %_ptr_Private_6 Private
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
%2 = OpFunction %void None %10
%17 = OpLabel
%18 = OpLoad %6 %4
OpStore %16 %18
%19 = OpImageTexelPointer %_ptr_Image_uint %16 %uint_0 %uint_0
%20 = OpAtomicIAdd %uint %19 %uint_1 %uint_0 %uint_1
OpReturn
OpFunctionEnd
In this case, the atomic add is not updating the local variable. The best way of treating this is that the OpImageTexelPointer is like a load of the input pointer and a manipulation of the value loaded. We need to treat it that way.
In particular, ADCE needs to know treat it like a load so that the store to the local is not removed.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels