|
| 1 | +//TEST:SIMPLE(filecheck=CHK): -target spirv-asm -stage compute -entry computeMain -skip-spirv-validation |
| 2 | + |
| 3 | +RWStructuredBuffer<int> inputBuffer; |
| 4 | + |
| 5 | +struct RecordData |
| 6 | +{ |
| 7 | + int myData; |
| 8 | +} |
| 9 | + |
| 10 | +[shader("compute")] |
| 11 | +[numthreads(1, 1, 1)] |
| 12 | +void computeMain() |
| 13 | +{ |
| 14 | + spirv_asm |
| 15 | + { |
| 16 | + OpExecutionMode $computeMain ShaderIndexAMDX $(0); |
| 17 | + OpExecutionMode $computeMain StaticNumWorkgroupsAMDX $(1) $(1) $(1); |
| 18 | + }; |
| 19 | + |
| 20 | + //TODO: "myNodeID" is supposed to come from [NodeID("name")] attribute on "node" variable. |
| 21 | + // Until it is implemented properly, we will use an int-type generic argument. |
| 22 | + // |
| 23 | + #define myNodeID_1 0 |
| 24 | + #define myNodeID_2 1 |
| 25 | + |
| 26 | + ThreadNodeOutputRecords<RecordData, myNodeID_1> node1 = { 1 }; |
| 27 | + ThreadNodeOutputRecords<RecordData, myNodeID_2> node2 = { 1 }; |
| 28 | + |
| 29 | + node1.Get().myData = inputBuffer[0]; |
| 30 | + node2.Get().myData = inputBuffer[0]; |
| 31 | + |
| 32 | + node1.OutputComplete(); |
| 33 | + node2.OutputComplete(); |
| 34 | +} |
| 35 | + |
| 36 | +//CHK: OpCapability ShaderEnqueueAMDX |
| 37 | +//CHK: OpExtension "SPV_AMDX_shader_enqueue" |
| 38 | + |
| 39 | +//CHK: ; Annotations |
| 40 | + |
| 41 | +//CHK-DAG: [[RecordType1:%[a-zA-Z_0-9]+]] = OpTypeNodePayloadArrayAMDX %RecordData |
| 42 | +//CHK-DAG: [[RecordType2:%[a-zA-Z_0-9]+]] = OpTypeNodePayloadArrayAMDX %RecordData |
| 43 | +//CHK-DAG: [[PtrType1:%[a-zA-Z_0-9]+]] = OpTypePointer NodePayloadAMDX [[RecordType1]] |
| 44 | +//CHK-DAG: [[PtrType2:%[a-zA-Z_0-9]+]] = OpTypePointer NodePayloadAMDX [[RecordType2]] |
| 45 | +//CHK-DAG: [[NodeID_1:%[a-zA-Z_0-9]+]] = OpConstantStringAMDX "NodeID_0" |
| 46 | +//CHK-DAG: [[NodeID_2:%[a-zA-Z_0-9]+]] = OpConstantStringAMDX "NodeID_1" |
| 47 | +//CHK-DAG: OpDecorateId [[RecordType1]] PayloadNodeNameAMDX [[NodeID_1]] |
| 48 | +//CHK-DAG: OpDecorateId [[RecordType2]] PayloadNodeNameAMDX [[NodeID_2]] |
| 49 | + |
| 50 | +//CHK-NOT: = OpTypeNodePayloadArrayAMDX |
| 51 | +//CHK-NOT: = OpConstantStringAMDX |
| 52 | +//CHK-NOT: OpDecorateID {{.*}} PayloadNodeNameAMDX |
| 53 | + |
| 54 | +//CHK: ; Function |
| 55 | + |
| 56 | +// ThreadNodeOutputRecords::__init() |
| 57 | +//CHK-DAG: [[Alloc1:%[a-zA-Z_0-9]+]] = OpAllocateNodePayloadsAMDX [[PtrType1]] % |
| 58 | +//CHK-DAG: [[Alloc2:%[a-zA-Z_0-9]+]] = OpAllocateNodePayloadsAMDX [[PtrType2]] % |
| 59 | +//CHK-NOT: = OpAllocateNodePayloadsAMDX |
| 60 | + |
| 61 | +// ThreadNodeOutputRecords::Get() |
| 62 | +//CHK-DAG: [[Load1:%[a-zA-Z_0-9]+]] = OpLoad [[PtrType1]] %var |
| 63 | +//CHK-DAG: [[Load2:%[a-zA-Z_0-9]+]] = OpLoad [[PtrType2]] %var |
| 64 | +//CHK-DAG: = OpAccessChain [[PtrType1]] [[Load1]] % |
| 65 | +//CHK-DAG: = OpAccessChain [[PtrType2]] [[Load2]] % |
| 66 | + |
| 67 | +// ThreadNodeOutputRecords::OutputComplete() |
| 68 | +//CHK-DAG: OpEnqueueNodePayloadsAMDX [[Alloc1]] |
| 69 | +//CHK-DAG: OpEnqueueNodePayloadsAMDX [[Alloc2]] |
| 70 | +//CHK-NOT: OpEnqueueNodePayloadsAMDX |
| 71 | + |
0 commit comments