spirv: Add initial subgroup support
[mesa.git] / src / compiler / spirv / vtn_subgroup.c
1 /*
2 * Copyright © 2016 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 */
23
24 #include "vtn_private.h"
25
26 void
27 vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode,
28 const uint32_t *w, unsigned count)
29 {
30 struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_ssa);
31
32 val->ssa = vtn_create_ssa_value(b, val->type->type);
33
34 switch (opcode) {
35 case SpvOpGroupNonUniformElect: {
36 vtn_fail_if(val->type->type != glsl_bool_type(),
37 "OpGroupNonUniformElect must return a Bool");
38 nir_intrinsic_instr *elect =
39 nir_intrinsic_instr_create(b->nb.shader, nir_intrinsic_elect);
40 nir_ssa_dest_init(&elect->instr, &elect->dest, 1, 32, NULL);
41 nir_builder_instr_insert(&b->nb, &elect->instr);
42 val->ssa->def = &elect->dest.ssa;
43 break;
44 }
45
46 case SpvOpGroupNonUniformAll:
47 case SpvOpGroupNonUniformAny:
48 case SpvOpGroupNonUniformAllEqual:
49 case SpvOpGroupNonUniformBroadcast:
50 case SpvOpGroupNonUniformBroadcastFirst:
51 case SpvOpGroupNonUniformBallot:
52 case SpvOpGroupNonUniformInverseBallot:
53 case SpvOpGroupNonUniformBallotBitExtract:
54 case SpvOpGroupNonUniformBallotBitCount:
55 case SpvOpGroupNonUniformBallotFindLSB:
56 case SpvOpGroupNonUniformBallotFindMSB:
57 case SpvOpGroupNonUniformShuffle:
58 case SpvOpGroupNonUniformShuffleXor:
59 case SpvOpGroupNonUniformShuffleUp:
60 case SpvOpGroupNonUniformShuffleDown:
61 case SpvOpGroupNonUniformIAdd:
62 case SpvOpGroupNonUniformFAdd:
63 case SpvOpGroupNonUniformIMul:
64 case SpvOpGroupNonUniformFMul:
65 case SpvOpGroupNonUniformSMin:
66 case SpvOpGroupNonUniformUMin:
67 case SpvOpGroupNonUniformFMin:
68 case SpvOpGroupNonUniformSMax:
69 case SpvOpGroupNonUniformUMax:
70 case SpvOpGroupNonUniformFMax:
71 case SpvOpGroupNonUniformBitwiseAnd:
72 case SpvOpGroupNonUniformBitwiseOr:
73 case SpvOpGroupNonUniformBitwiseXor:
74 case SpvOpGroupNonUniformLogicalAnd:
75 case SpvOpGroupNonUniformLogicalOr:
76 case SpvOpGroupNonUniformLogicalXor:
77 case SpvOpGroupNonUniformQuadBroadcast:
78 case SpvOpGroupNonUniformQuadSwap:
79 default:
80 unreachable("Invalid SPIR-V opcode");
81 }
82 }