SPIRV-Cross/shaders-msl-no-opt/asm/comp/opptrdiff-basic.spv14.asm.comp
Bill Hollings 5493b3030e MSL: Support OpPtrEqual, OpPtrNotEqual, and OpPtrDiff.
- Add CompilerMSL::emit_binary_ptr_op() and to_ptr_expression()
  to emit binary pointer op. Compare matrix addresses without automatic
  transpose() conversion, to avoid error taking address of temporary copy.
- Add Compiler::add_active_interface_variable() to also track active
  interface vars in the entry point for SPIR-V 1.4 and above.
- For OpPtrAccessChain that ends in array element, use Element
  as offset to existing index, otherwise it will access into
  array dimension that doesn't exist.
- Dereference pointer function call arguments. Ultimately, this
  dereferencing is actually backwards, and in future, we should aim
  to properly support passing pointer variables between functions,
  but such a refactoring was beyond the scope here.
- Use [] to declare array of pointers, as array<T*> is not supported in MSL.
- Add unit test shaders.
2022-09-14 15:19:15 -04:00

99 lines
3.6 KiB
Plaintext

; SPIR-V
; Version: 1.4
; Generator: Khronos SPIR-V Tools Assembler; 0
; Bound: 59
; Schema: 0
OpCapability Shader
OpCapability VariablePointersStorageBuffer
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %1 "main" %2 %3 %4 %5 %6
OpExecutionMode %1 LocalSize 4 1 1
OpDecorate %7 Block
OpMemberDecorate %7 0 Offset 0
OpDecorate %8 ArrayStride 16
OpDecorate %9 Block
OpMemberDecorate %9 0 Offset 0
OpDecorate %10 ArrayStride 68
OpDecorate %11 Block
OpMemberDecorate %11 0 Offset 0
OpDecorate %12 ArrayStride 4
OpDecorate %13 ArrayStride 4
OpDecorate %2 DescriptorSet 0
OpDecorate %2 Binding 0
OpDecorate %3 DescriptorSet 0
OpDecorate %3 Binding 1
OpDecorate %4 DescriptorSet 0
OpDecorate %4 Binding 2
OpDecorate %5 BuiltIn LocalInvocationId
OpDecorate %6 BuiltIn WorkgroupId
%14 = OpTypeVoid
%15 = OpTypeBool
%16 = OpTypeInt 32 1
%17 = OpConstant %16 0
%18 = OpConstant %16 1
%19 = OpConstant %16 4
%20 = OpConstant %16 16
%21 = OpConstant %16 17
%22 = OpTypeVector %16 3
%23 = OpTypePointer Input %22
%12 = OpTypeArray %16 %19
%8 = OpTypeRuntimeArray %12
%7 = OpTypeStruct %8
%24 = OpTypePointer StorageBuffer %7
%25 = OpTypePointer StorageBuffer %12
%13 = OpTypeArray %16 %21
%10 = OpTypeRuntimeArray %13
%9 = OpTypeStruct %10
%26 = OpTypePointer StorageBuffer %9
%27 = OpTypePointer StorageBuffer %13
%28 = OpTypePointer StorageBuffer %16
%11 = OpTypeStruct %16
%29 = OpTypePointer Uniform %11
%30 = OpTypePointer Uniform %16
%2 = OpVariable %24 StorageBuffer
%3 = OpVariable %26 StorageBuffer
%4 = OpVariable %29 Uniform
%5 = OpVariable %23 Input
%6 = OpVariable %23 Input
%31 = OpTypeFunction %14
%1 = OpFunction %14 None %31
%32 = OpLabel
%33 = OpAccessChain %30 %4 %17
%34 = OpLoad %16 %33
%35 = OpLoad %22 %6
%36 = OpCompositeExtract %16 %35 0
%37 = OpLoad %22 %5
%38 = OpCompositeExtract %16 %37 0
%39 = OpAccessChain %25 %2 %17 %17
%40 = OpAccessChain %25 %2 %17 %36
%41 = OpSGreaterThanEqual %15 %36 %34
OpSelectionMerge %42 None
OpBranchConditional %41 %43 %42
%43 = OpLabel
OpReturn
%42 = OpLabel
%44 = OpIEqual %15 %38 %18
OpSelectionMerge %45 None
OpBranchConditional %44 %46 %45
%46 = OpLabel
%47 = OpPtrDiff %16 %40 %39
%48 = OpAccessChain %28 %3 %17 %36 %20
OpStore %48 %47
OpBranch %45
%45 = OpLabel
%49 = OpPhi %16 %17 %42 %17 %46 %50 %45
%50 = OpIAdd %16 %49 %18
%51 = OpIEqual %15 %50 %19
%52 = OpIMul %16 %38 %19
%53 = OpIAdd %16 %52 %49
%54 = OpAccessChain %28 %40 %38
%55 = OpAccessChain %28 %40 %49
%56 = OpPtrDiff %16 %54 %55
%57 = OpAccessChain %28 %3 %17 %36 %53
OpStore %57 %56
OpLoopMerge %58 %45 None
OpBranchConditional %51 %58 %45
%58 = OpLabel
OpReturn
OpFunctionEnd