2
* Copyright © 2021 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
25
#include "brw_private.h"
26
#include "compiler/shader_info.h"
27
#include "intel/dev/intel_debug.h"
28
#include "intel/dev/intel_device_info.h"
29
#include "util/ralloc.h"
31
#include <gtest/gtest.h>
39
const bool spilled = true;
40
const bool not_spilled = false;
42
class SIMDSelectionTest : public ::testing::Test {
44
SIMDSelectionTest() : error{NULL, NULL, NULL} {
45
mem_ctx = ralloc_context(NULL);
46
devinfo = rzalloc(mem_ctx, intel_device_info);
47
prog_data = rzalloc(mem_ctx, struct brw_cs_prog_data);
48
required_dispatch_width = 0;
51
~SIMDSelectionTest() {
55
bool should_compile(unsigned simd) {
56
return brw_simd_should_compile(mem_ctx, simd, devinfo, prog_data,
57
required_dispatch_width, &error[simd]);
61
intel_device_info *devinfo;
62
struct brw_cs_prog_data *prog_data;
64
unsigned required_dispatch_width;
67
class SIMDSelectionCS : public SIMDSelectionTest {
70
prog_data->base.stage = MESA_SHADER_COMPUTE;
71
prog_data->local_size[0] = 32;
72
prog_data->local_size[1] = 1;
73
prog_data->local_size[2] = 1;
75
devinfo->max_cs_workgroup_threads = 64;
79
TEST_F(SIMDSelectionCS, DefaultsToSIMD16)
81
ASSERT_TRUE(should_compile(SIMD8));
82
brw_simd_mark_compiled(SIMD8, prog_data, not_spilled);
83
ASSERT_TRUE(should_compile(SIMD16));
84
brw_simd_mark_compiled(SIMD16, prog_data, not_spilled);
85
ASSERT_FALSE(should_compile(SIMD32));
87
ASSERT_EQ(brw_simd_select(prog_data), SIMD16);
90
TEST_F(SIMDSelectionCS, TooBigFor16)
92
prog_data->local_size[0] = devinfo->max_cs_workgroup_threads;
93
prog_data->local_size[1] = 32;
94
prog_data->local_size[2] = 1;
96
ASSERT_FALSE(should_compile(SIMD8));
97
ASSERT_FALSE(should_compile(SIMD16));
98
ASSERT_TRUE(should_compile(SIMD32));
99
brw_simd_mark_compiled(SIMD32, prog_data, spilled);
101
ASSERT_EQ(brw_simd_select(prog_data), SIMD32);
104
TEST_F(SIMDSelectionCS, WorkgroupSize1)
106
prog_data->local_size[0] = 1;
107
prog_data->local_size[1] = 1;
108
prog_data->local_size[2] = 1;
110
ASSERT_TRUE(should_compile(SIMD8));
111
brw_simd_mark_compiled(SIMD8, prog_data, not_spilled);
112
ASSERT_FALSE(should_compile(SIMD16));
113
ASSERT_FALSE(should_compile(SIMD32));
115
ASSERT_EQ(brw_simd_select(prog_data), SIMD8);
118
TEST_F(SIMDSelectionCS, WorkgroupSize8)
120
prog_data->local_size[0] = 8;
121
prog_data->local_size[1] = 1;
122
prog_data->local_size[2] = 1;
124
ASSERT_TRUE(should_compile(SIMD8));
125
brw_simd_mark_compiled(SIMD8, prog_data, not_spilled);
126
ASSERT_FALSE(should_compile(SIMD16));
127
ASSERT_FALSE(should_compile(SIMD32));
129
ASSERT_EQ(brw_simd_select(prog_data), SIMD8);
132
TEST_F(SIMDSelectionCS, WorkgroupSizeVariable)
134
prog_data->local_size[0] = 0;
135
prog_data->local_size[1] = 0;
136
prog_data->local_size[2] = 0;
138
ASSERT_TRUE(should_compile(SIMD8));
139
brw_simd_mark_compiled(SIMD8, prog_data, not_spilled);
140
ASSERT_TRUE(should_compile(SIMD16));
141
brw_simd_mark_compiled(SIMD16, prog_data, not_spilled);
142
ASSERT_TRUE(should_compile(SIMD32));
143
brw_simd_mark_compiled(SIMD32, prog_data, not_spilled);
145
ASSERT_EQ(prog_data->prog_mask, 1u << SIMD8 | 1u << SIMD16 | 1u << SIMD32);
147
const unsigned wg_8_1_1[] = { 8, 1, 1 };
148
ASSERT_EQ(brw_simd_select_for_workgroup_size(devinfo, prog_data, wg_8_1_1), SIMD8);
150
const unsigned wg_16_1_1[] = { 16, 1, 1 };
151
ASSERT_EQ(brw_simd_select_for_workgroup_size(devinfo, prog_data, wg_16_1_1), SIMD16);
153
const unsigned wg_32_1_1[] = { 32, 1, 1 };
154
ASSERT_EQ(brw_simd_select_for_workgroup_size(devinfo, prog_data, wg_32_1_1), SIMD16);
157
TEST_F(SIMDSelectionCS, WorkgroupSizeVariableSpilled)
159
prog_data->local_size[0] = 0;
160
prog_data->local_size[1] = 0;
161
prog_data->local_size[2] = 0;
163
ASSERT_TRUE(should_compile(SIMD8));
164
brw_simd_mark_compiled(SIMD8, prog_data, spilled);
165
ASSERT_TRUE(should_compile(SIMD16));
166
brw_simd_mark_compiled(SIMD16, prog_data, spilled);
167
ASSERT_TRUE(should_compile(SIMD32));
168
brw_simd_mark_compiled(SIMD32, prog_data, spilled);
170
ASSERT_EQ(prog_data->prog_mask, 1u << SIMD8 | 1u << SIMD16 | 1u << SIMD32);
172
const unsigned wg_8_1_1[] = { 8, 1, 1 };
173
ASSERT_EQ(brw_simd_select_for_workgroup_size(devinfo, prog_data, wg_8_1_1), SIMD8);
175
const unsigned wg_16_1_1[] = { 16, 1, 1 };
176
ASSERT_EQ(brw_simd_select_for_workgroup_size(devinfo, prog_data, wg_16_1_1), SIMD8);
178
const unsigned wg_32_1_1[] = { 32, 1, 1 };
179
ASSERT_EQ(brw_simd_select_for_workgroup_size(devinfo, prog_data, wg_32_1_1), SIMD8);
182
TEST_F(SIMDSelectionCS, WorkgroupSizeVariableNoSIMD8)
184
prog_data->local_size[0] = 0;
185
prog_data->local_size[1] = 0;
186
prog_data->local_size[2] = 0;
188
ASSERT_TRUE(should_compile(SIMD8));
189
ASSERT_TRUE(should_compile(SIMD16));
190
brw_simd_mark_compiled(SIMD16, prog_data, not_spilled);
191
ASSERT_TRUE(should_compile(SIMD32));
192
brw_simd_mark_compiled(SIMD32, prog_data, not_spilled);
194
ASSERT_EQ(prog_data->prog_mask, 1u << SIMD16 | 1u << SIMD32);
196
const unsigned wg_8_1_1[] = { 8, 1, 1 };
197
ASSERT_EQ(brw_simd_select_for_workgroup_size(devinfo, prog_data, wg_8_1_1), SIMD16);
199
const unsigned wg_16_1_1[] = { 16, 1, 1 };
200
ASSERT_EQ(brw_simd_select_for_workgroup_size(devinfo, prog_data, wg_16_1_1), SIMD16);
202
const unsigned wg_32_1_1[] = { 32, 1, 1 };
203
ASSERT_EQ(brw_simd_select_for_workgroup_size(devinfo, prog_data, wg_32_1_1), SIMD16);
206
TEST_F(SIMDSelectionCS, WorkgroupSizeVariableNoSIMD16)
208
prog_data->local_size[0] = 0;
209
prog_data->local_size[1] = 0;
210
prog_data->local_size[2] = 0;
212
ASSERT_TRUE(should_compile(SIMD8));
213
brw_simd_mark_compiled(SIMD8, prog_data, not_spilled);
214
ASSERT_TRUE(should_compile(SIMD16));
215
ASSERT_TRUE(should_compile(SIMD32));
216
brw_simd_mark_compiled(SIMD32, prog_data, not_spilled);
218
ASSERT_EQ(prog_data->prog_mask, 1u << SIMD8 | 1u << SIMD32);
220
const unsigned wg_8_1_1[] = { 8, 1, 1 };
221
ASSERT_EQ(brw_simd_select_for_workgroup_size(devinfo, prog_data, wg_8_1_1), SIMD8);
223
const unsigned wg_16_1_1[] = { 16, 1, 1 };
224
ASSERT_EQ(brw_simd_select_for_workgroup_size(devinfo, prog_data, wg_16_1_1), SIMD8);
226
const unsigned wg_32_1_1[] = { 32, 1, 1 };
227
ASSERT_EQ(brw_simd_select_for_workgroup_size(devinfo, prog_data, wg_32_1_1), SIMD8);
230
TEST_F(SIMDSelectionCS, WorkgroupSizeVariableNoSIMD8NoSIMD16)
232
prog_data->local_size[0] = 0;
233
prog_data->local_size[1] = 0;
234
prog_data->local_size[2] = 0;
236
ASSERT_TRUE(should_compile(SIMD8));
237
ASSERT_TRUE(should_compile(SIMD16));
238
ASSERT_TRUE(should_compile(SIMD32));
239
brw_simd_mark_compiled(SIMD32, prog_data, not_spilled);
241
ASSERT_EQ(prog_data->prog_mask, 1u << SIMD32);
243
const unsigned wg_8_1_1[] = { 8, 1, 1 };
244
ASSERT_EQ(brw_simd_select_for_workgroup_size(devinfo, prog_data, wg_8_1_1), SIMD32);
246
const unsigned wg_16_1_1[] = { 16, 1, 1 };
247
ASSERT_EQ(brw_simd_select_for_workgroup_size(devinfo, prog_data, wg_16_1_1), SIMD32);
249
const unsigned wg_32_1_1[] = { 32, 1, 1 };
250
ASSERT_EQ(brw_simd_select_for_workgroup_size(devinfo, prog_data, wg_32_1_1), SIMD32);
253
TEST_F(SIMDSelectionCS, SpillAtSIMD8)
255
ASSERT_TRUE(should_compile(SIMD8));
256
brw_simd_mark_compiled(SIMD8, prog_data, spilled);
257
ASSERT_FALSE(should_compile(SIMD16));
258
ASSERT_FALSE(should_compile(SIMD32));
260
ASSERT_EQ(brw_simd_select(prog_data), SIMD8);
263
TEST_F(SIMDSelectionCS, SpillAtSIMD16)
265
ASSERT_TRUE(should_compile(SIMD8));
266
brw_simd_mark_compiled(SIMD8, prog_data, not_spilled);
267
ASSERT_TRUE(should_compile(SIMD16));
268
brw_simd_mark_compiled(SIMD16, prog_data, spilled);
269
ASSERT_FALSE(should_compile(SIMD32));
271
ASSERT_EQ(brw_simd_select(prog_data), SIMD8);
274
TEST_F(SIMDSelectionCS, EnvironmentVariable32)
276
intel_debug |= DEBUG_DO32;
278
ASSERT_TRUE(should_compile(SIMD8));
279
brw_simd_mark_compiled(SIMD8, prog_data, not_spilled);
280
ASSERT_TRUE(should_compile(SIMD16));
281
brw_simd_mark_compiled(SIMD16, prog_data, not_spilled);
282
ASSERT_TRUE(should_compile(SIMD32));
283
brw_simd_mark_compiled(SIMD32, prog_data, not_spilled);
285
ASSERT_EQ(brw_simd_select(prog_data), SIMD32);
288
TEST_F(SIMDSelectionCS, EnvironmentVariable32ButSpills)
290
intel_debug |= DEBUG_DO32;
292
ASSERT_TRUE(should_compile(SIMD8));
293
brw_simd_mark_compiled(SIMD8, prog_data, not_spilled);
294
ASSERT_TRUE(should_compile(SIMD16));
295
brw_simd_mark_compiled(SIMD16, prog_data, not_spilled);
296
ASSERT_TRUE(should_compile(SIMD32));
297
brw_simd_mark_compiled(SIMD32, prog_data, spilled);
299
ASSERT_EQ(brw_simd_select(prog_data), SIMD16);
302
TEST_F(SIMDSelectionCS, Require8)
304
required_dispatch_width = 8;
306
ASSERT_TRUE(should_compile(SIMD8));
307
brw_simd_mark_compiled(SIMD8, prog_data, not_spilled);
308
ASSERT_FALSE(should_compile(SIMD16));
309
ASSERT_FALSE(should_compile(SIMD32));
311
ASSERT_EQ(brw_simd_select(prog_data), SIMD8);
314
TEST_F(SIMDSelectionCS, Require8ErrorWhenNotCompile)
316
required_dispatch_width = 8;
318
ASSERT_TRUE(should_compile(SIMD8));
319
ASSERT_FALSE(should_compile(SIMD16));
320
ASSERT_FALSE(should_compile(SIMD32));
322
ASSERT_EQ(brw_simd_select(prog_data), -1);
325
TEST_F(SIMDSelectionCS, Require16)
327
required_dispatch_width = 16;
329
ASSERT_FALSE(should_compile(SIMD8));
330
ASSERT_TRUE(should_compile(SIMD16));
331
brw_simd_mark_compiled(SIMD16, prog_data, not_spilled);
332
ASSERT_FALSE(should_compile(SIMD32));
334
ASSERT_EQ(brw_simd_select(prog_data), SIMD16);
337
TEST_F(SIMDSelectionCS, Require16ErrorWhenNotCompile)
339
required_dispatch_width = 16;
341
ASSERT_FALSE(should_compile(SIMD8));
342
ASSERT_TRUE(should_compile(SIMD16));
343
ASSERT_FALSE(should_compile(SIMD32));
345
ASSERT_EQ(brw_simd_select(prog_data), -1);
348
TEST_F(SIMDSelectionCS, Require32)
350
required_dispatch_width = 32;
352
ASSERT_FALSE(should_compile(SIMD8));
353
ASSERT_FALSE(should_compile(SIMD16));
354
ASSERT_TRUE(should_compile(SIMD32));
355
brw_simd_mark_compiled(SIMD32, prog_data, not_spilled);
357
ASSERT_EQ(brw_simd_select(prog_data), SIMD32);
360
TEST_F(SIMDSelectionCS, Require32ErrorWhenNotCompile)
362
required_dispatch_width = 32;
364
ASSERT_FALSE(should_compile(SIMD8));
365
ASSERT_FALSE(should_compile(SIMD16));
366
ASSERT_TRUE(should_compile(SIMD32));
368
ASSERT_EQ(brw_simd_select(prog_data), -1);