2 * Copyright © 2016 Intel Corporation
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:
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
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
24 #include "vtn_private.h"
27 vtn_handle_subgroup(struct vtn_builder
*b
, SpvOp opcode
,
28 const uint32_t *w
, unsigned count
)
30 struct vtn_value
*val
= vtn_push_value(b
, w
[2], vtn_value_type_ssa
);
32 val
->ssa
= vtn_create_ssa_value(b
, val
->type
->type
);
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
;
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
:
80 unreachable("Invalid SPIR-V opcode");