mirror of
https://github.com/gfx-rs/wgpu.git
synced 2024-11-29 10:13:34 +00:00
abba12ae4e
Add the following flags to `wgpu_types::Features`: - `SHADER_INT64_ATOMIC_ALL_OPS` enables all atomic operations on `atomic<i64>` and `atomic<u64>` values. - `SHADER_INT64_ATOMIC_MIN_MAX` is a subset of the above, enabling only `AtomicFunction::Min` and `AtomicFunction::Max` operations on `atomic<i64>` and `atomic<u64>` values in the `Storage` address space. These are the only 64-bit atomic operations available on Metal as of 3.1. Add corresponding flags to `naga::valid::Capabilities`. These are supported by the WGSL front end, and all Naga backends. Platform support: - On Direct3d 12, in `D3D12_FEATURE_DATA_D3D12_OPTIONS9`, if `AtomicInt64OnTypedResourceSupported` and `AtomicInt64OnGroupSharedSupported` are both available, then both wgpu features described above are available. - On Metal, `SHADER_INT64_ATOMIC_MIN_MAX` is available on Apple9 hardware, and on hardware that advertises both Apple8 and Mac2 support. This also requires Metal Shading Language 2.4 or later. Metal does not yet support the more general `SHADER_INT64_ATOMIC_ALL_OPS`. - On Vulkan, if the `VK_KHR_shader_atomic_int64` extension is available with both the `shader_buffer_int64_atomics` and `shader_shared_int64_atomics` features, then both wgpu features described above are available.
205 lines
4.7 KiB
Plaintext
205 lines
4.7 KiB
Plaintext
; SPIR-V
|
|
; Version: 1.0
|
|
; Generator: rspirv
|
|
; Bound: 125
|
|
OpCapability Shader
|
|
OpCapability Int64Atomics
|
|
OpCapability Int64
|
|
OpExtension "SPV_KHR_storage_buffer_storage_class"
|
|
%1 = OpExtInstImport "GLSL.std.450"
|
|
OpMemoryModel Logical GLSL450
|
|
OpEntryPoint GLCompute %19 "test_atomic_compare_exchange_i64"
|
|
OpEntryPoint GLCompute %77 "test_atomic_compare_exchange_u64"
|
|
OpExecutionMode %19 LocalSize 1 1 1
|
|
OpExecutionMode %77 LocalSize 1 1 1
|
|
OpDecorate %5 ArrayStride 8
|
|
OpDecorate %8 ArrayStride 8
|
|
OpMemberDecorate %10 0 Offset 0
|
|
OpMemberDecorate %10 1 Offset 8
|
|
OpMemberDecorate %11 0 Offset 0
|
|
OpMemberDecorate %11 1 Offset 8
|
|
OpDecorate %12 DescriptorSet 0
|
|
OpDecorate %12 Binding 0
|
|
OpDecorate %13 Block
|
|
OpMemberDecorate %13 0 Offset 0
|
|
OpDecorate %15 DescriptorSet 0
|
|
OpDecorate %15 Binding 1
|
|
OpDecorate %16 Block
|
|
OpMemberDecorate %16 0 Offset 0
|
|
%2 = OpTypeVoid
|
|
%3 = OpTypeInt 32 0
|
|
%4 = OpTypeInt 64 1
|
|
%6 = OpConstant %3 128
|
|
%5 = OpTypeArray %4 %6
|
|
%7 = OpTypeInt 64 0
|
|
%8 = OpTypeArray %7 %6
|
|
%9 = OpTypeBool
|
|
%10 = OpTypeStruct %4 %9
|
|
%11 = OpTypeStruct %7 %9
|
|
%13 = OpTypeStruct %5
|
|
%14 = OpTypePointer StorageBuffer %13
|
|
%12 = OpVariable %14 StorageBuffer
|
|
%16 = OpTypeStruct %8
|
|
%17 = OpTypePointer StorageBuffer %16
|
|
%15 = OpVariable %17 StorageBuffer
|
|
%20 = OpTypeFunction %2
|
|
%21 = OpTypePointer StorageBuffer %5
|
|
%22 = OpConstant %3 0
|
|
%24 = OpConstantFalse %9
|
|
%25 = OpConstant %4 10
|
|
%26 = OpConstant %3 1
|
|
%28 = OpTypePointer Function %3
|
|
%30 = OpTypePointer Function %4
|
|
%31 = OpConstantNull %4
|
|
%33 = OpTypePointer Function %9
|
|
%34 = OpConstantNull %9
|
|
%47 = OpTypePointer StorageBuffer %4
|
|
%51 = OpTypeInt 32 1
|
|
%50 = OpConstant %51 1
|
|
%52 = OpConstant %3 64
|
|
%78 = OpTypePointer StorageBuffer %8
|
|
%80 = OpConstant %7 10
|
|
%83 = OpTypePointer Function %7
|
|
%84 = OpConstantNull %7
|
|
%86 = OpConstantNull %9
|
|
%99 = OpTypePointer StorageBuffer %7
|
|
%19 = OpFunction %2 None %20
|
|
%18 = OpLabel
|
|
%27 = OpVariable %28 Function %22
|
|
%29 = OpVariable %30 Function %31
|
|
%32 = OpVariable %33 Function %34
|
|
%23 = OpAccessChain %21 %12 %22
|
|
OpBranch %35
|
|
%35 = OpLabel
|
|
OpBranch %36
|
|
%36 = OpLabel
|
|
OpLoopMerge %37 %39 None
|
|
OpBranch %38
|
|
%38 = OpLabel
|
|
%40 = OpLoad %3 %27
|
|
%41 = OpULessThan %9 %40 %6
|
|
OpSelectionMerge %42 None
|
|
OpBranchConditional %41 %42 %43
|
|
%43 = OpLabel
|
|
OpBranch %37
|
|
%42 = OpLabel
|
|
OpBranch %44
|
|
%44 = OpLabel
|
|
%46 = OpLoad %3 %27
|
|
%48 = OpAccessChain %47 %23 %46
|
|
%49 = OpAtomicLoad %4 %48 %50 %52
|
|
OpStore %29 %49
|
|
OpStore %32 %24
|
|
OpBranch %53
|
|
%53 = OpLabel
|
|
OpLoopMerge %54 %56 None
|
|
OpBranch %55
|
|
%55 = OpLabel
|
|
%57 = OpLoad %9 %32
|
|
%58 = OpLogicalNot %9 %57
|
|
OpSelectionMerge %59 None
|
|
OpBranchConditional %58 %59 %60
|
|
%60 = OpLabel
|
|
OpBranch %54
|
|
%59 = OpLabel
|
|
OpBranch %61
|
|
%61 = OpLabel
|
|
%63 = OpLoad %4 %29
|
|
%64 = OpIAdd %4 %63 %25
|
|
%66 = OpLoad %3 %27
|
|
%67 = OpLoad %4 %29
|
|
%69 = OpAccessChain %47 %23 %66
|
|
%70 = OpAtomicCompareExchange %4 %69 %50 %52 %52 %64 %67
|
|
%71 = OpIEqual %9 %70 %67
|
|
%68 = OpCompositeConstruct %10 %70 %71
|
|
%72 = OpCompositeExtract %4 %68 0
|
|
OpStore %29 %72
|
|
%73 = OpCompositeExtract %9 %68 1
|
|
OpStore %32 %73
|
|
OpBranch %62
|
|
%62 = OpLabel
|
|
OpBranch %56
|
|
%56 = OpLabel
|
|
OpBranch %53
|
|
%54 = OpLabel
|
|
OpBranch %45
|
|
%45 = OpLabel
|
|
OpBranch %39
|
|
%39 = OpLabel
|
|
%74 = OpLoad %3 %27
|
|
%75 = OpIAdd %3 %74 %26
|
|
OpStore %27 %75
|
|
OpBranch %36
|
|
%37 = OpLabel
|
|
OpReturn
|
|
OpFunctionEnd
|
|
%77 = OpFunction %2 None %20
|
|
%76 = OpLabel
|
|
%81 = OpVariable %28 Function %22
|
|
%82 = OpVariable %83 Function %84
|
|
%85 = OpVariable %33 Function %86
|
|
%79 = OpAccessChain %78 %15 %22
|
|
OpBranch %87
|
|
%87 = OpLabel
|
|
OpBranch %88
|
|
%88 = OpLabel
|
|
OpLoopMerge %89 %91 None
|
|
OpBranch %90
|
|
%90 = OpLabel
|
|
%92 = OpLoad %3 %81
|
|
%93 = OpULessThan %9 %92 %6
|
|
OpSelectionMerge %94 None
|
|
OpBranchConditional %93 %94 %95
|
|
%95 = OpLabel
|
|
OpBranch %89
|
|
%94 = OpLabel
|
|
OpBranch %96
|
|
%96 = OpLabel
|
|
%98 = OpLoad %3 %81
|
|
%100 = OpAccessChain %99 %79 %98
|
|
%101 = OpAtomicLoad %7 %100 %50 %52
|
|
OpStore %82 %101
|
|
OpStore %85 %24
|
|
OpBranch %102
|
|
%102 = OpLabel
|
|
OpLoopMerge %103 %105 None
|
|
OpBranch %104
|
|
%104 = OpLabel
|
|
%106 = OpLoad %9 %85
|
|
%107 = OpLogicalNot %9 %106
|
|
OpSelectionMerge %108 None
|
|
OpBranchConditional %107 %108 %109
|
|
%109 = OpLabel
|
|
OpBranch %103
|
|
%108 = OpLabel
|
|
OpBranch %110
|
|
%110 = OpLabel
|
|
%112 = OpLoad %7 %82
|
|
%113 = OpIAdd %7 %112 %80
|
|
%115 = OpLoad %3 %81
|
|
%116 = OpLoad %7 %82
|
|
%118 = OpAccessChain %99 %79 %115
|
|
%119 = OpAtomicCompareExchange %7 %118 %50 %52 %52 %113 %116
|
|
%120 = OpIEqual %9 %119 %116
|
|
%117 = OpCompositeConstruct %11 %119 %120
|
|
%121 = OpCompositeExtract %7 %117 0
|
|
OpStore %82 %121
|
|
%122 = OpCompositeExtract %9 %117 1
|
|
OpStore %85 %122
|
|
OpBranch %111
|
|
%111 = OpLabel
|
|
OpBranch %105
|
|
%105 = OpLabel
|
|
OpBranch %102
|
|
%103 = OpLabel
|
|
OpBranch %97
|
|
%97 = OpLabel
|
|
OpBranch %91
|
|
%91 = OpLabel
|
|
%123 = OpLoad %3 %81
|
|
%124 = OpIAdd %3 %123 %26
|
|
OpStore %81 %124
|
|
OpBranch %88
|
|
%89 = OpLabel
|
|
OpReturn
|
|
OpFunctionEnd |