1 /*
2 * Copyright (C) 2022 Collabora, Ltd.
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 FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 * SOFTWARE.
22 */
23
24 #include "bi_builder.h"
25 #include "bi_test.h"
26 #include "compiler.h"
27
28 #include <gtest/gtest.h>
29
30 #define CASE(instr, expected) \
31 do { \
32 bi_builder *A = bit_builder(mem_ctx); \
33 bi_builder *B = bit_builder(mem_ctx); \
34 A->shader->info.bifrost = rzalloc(mem_ctx, struct bifrost_shader_info); \
35 B->shader->info.bifrost = rzalloc(mem_ctx, struct bifrost_shader_info); \
36 { \
37 bi_builder *b = A; \
38 bi_index u = bi_temp(b->shader); \
39 UNUSED bi_index v = bi_temp(b->shader); \
40 UNUSED bi_index w = bi_temp(b->shader); \
41 instr; \
42 } \
43 { \
44 bi_builder *b = B; \
45 bi_index u = bi_temp(b->shader); \
46 UNUSED bi_index v = bi_temp(b->shader); \
47 UNUSED bi_index w = bi_temp(b->shader); \
48 expected; \
49 } \
50 bi_opt_message_preload(A->shader); \
51 if (!bit_shader_equal(A->shader, B->shader)) { \
52 ADD_FAILURE(); \
53 fprintf(stderr, "Optimization produce unexpected result"); \
54 fprintf(stderr, " Actual:\n"); \
55 bi_print_shader(A->shader, stderr); \
56 fprintf(stderr, "Expected:\n"); \
57 bi_print_shader(B->shader, stderr); \
58 fprintf(stderr, "\n"); \
59 } \
60 } while (0)
61
62 #define NEGCASE(instr) CASE(instr, instr)
63
64 class MessagePreload : public testing::Test {
65 protected:
MessagePreload()66 MessagePreload()
67 {
68 mem_ctx = ralloc_context(NULL);
69
70 x = bi_register(16);
71 y = bi_register(32);
72 }
73
~MessagePreload()74 ~MessagePreload()
75 {
76 ralloc_free(mem_ctx);
77 }
78
79 void *mem_ctx;
80
81 bi_index reg, x, y;
82
preload_moves(bi_builder * b,bi_index dest,int count,int idx)83 static void preload_moves(bi_builder *b, bi_index dest, int count, int idx)
84 {
85 bi_instr *I = bi_collect_i32_to(b, dest, count);
86
87 b->cursor = bi_before_block(bi_start_block(&b->shader->blocks));
88 bi_foreach_src(I, i)
89 I->src[i] = bi_mov_i32(b, bi_register(idx * 4 + i));
90
91 b->cursor = bi_after_instr(I);
92 }
93 };
94
TEST_F(MessagePreload,PreloadLdVarSample)95 TEST_F(MessagePreload, PreloadLdVarSample)
96 {
97 CASE(
98 {
99 bi_ld_var_imm_to(b, u, bi_register(61), BI_REGISTER_FORMAT_F32,
100 BI_SAMPLE_SAMPLE, BI_UPDATE_STORE, BI_VECSIZE_V4, 0);
101 },
102 { preload_moves(b, u, 4, 0); });
103 }
104
TEST_F(MessagePreload,PreloadLdVarLdVar)105 TEST_F(MessagePreload, PreloadLdVarLdVar)
106 {
107 CASE(
108 {
109 bi_ld_var_imm_to(b, u, bi_register(61), BI_REGISTER_FORMAT_F32,
110 BI_SAMPLE_SAMPLE, BI_UPDATE_STORE, BI_VECSIZE_V4, 2);
111 bi_ld_var_imm_to(b, v, bi_register(61), BI_REGISTER_FORMAT_F32,
112 BI_SAMPLE_SAMPLE, BI_UPDATE_STORE, BI_VECSIZE_V4, 1);
113 },
114 {
115 preload_moves(b, u, 4, 0);
116 preload_moves(b, v, 4, 1);
117 });
118 }
119
TEST_F(MessagePreload,MaxTwoMessages)120 TEST_F(MessagePreload, MaxTwoMessages)
121 {
122 CASE(
123 {
124 bi_ld_var_imm_to(b, u, bi_register(61), BI_REGISTER_FORMAT_F32,
125 BI_SAMPLE_SAMPLE, BI_UPDATE_STORE, BI_VECSIZE_V4, 2);
126 bi_ld_var_imm_to(b, v, bi_register(61), BI_REGISTER_FORMAT_F32,
127 BI_SAMPLE_SAMPLE, BI_UPDATE_STORE, BI_VECSIZE_V4, 1);
128 bi_ld_var_imm_to(b, w, bi_register(61), BI_REGISTER_FORMAT_F32,
129 BI_SAMPLE_SAMPLE, BI_UPDATE_STORE, BI_VECSIZE_V4, 0);
130 },
131 {
132 preload_moves(b, u, 4, 0);
133 preload_moves(b, v, 4, 1);
134 bi_ld_var_imm_to(b, w, bi_register(61), BI_REGISTER_FORMAT_F32,
135 BI_SAMPLE_SAMPLE, BI_UPDATE_STORE, BI_VECSIZE_V4, 0);
136 });
137
138 CASE(
139 {
140 bi_var_tex_f32_to(b, u, false, BI_SAMPLE_CENTER, BI_UPDATE_STORE, 0,
141 0);
142 bi_var_tex_f16_to(b, v, false, BI_SAMPLE_CENTER, BI_UPDATE_STORE, 1,
143 2);
144 bi_var_tex_f16_to(b, w, false, BI_SAMPLE_CENTER, BI_UPDATE_STORE, 3,
145 3);
146 },
147 {
148 preload_moves(b, u, 4, 0);
149 preload_moves(b, v, 2, 1);
150 bi_var_tex_f16_to(b, w, false, BI_SAMPLE_CENTER, BI_UPDATE_STORE, 3,
151 3);
152 });
153 }
154
TEST_F(MessagePreload,PreloadVartexF16)155 TEST_F(MessagePreload, PreloadVartexF16)
156 {
157 CASE(
158 {
159 bi_var_tex_f16_to(b, u, false, BI_SAMPLE_CENTER, BI_UPDATE_STORE, 0,
160 0);
161 },
162 { preload_moves(b, u, 2, 0); });
163 }
164
TEST_F(MessagePreload,PreloadVartexF32)165 TEST_F(MessagePreload, PreloadVartexF32)
166 {
167 CASE(
168 {
169 bi_var_tex_f32_to(b, u, false, BI_SAMPLE_CENTER, BI_UPDATE_STORE, 0,
170 0);
171 },
172 { preload_moves(b, u, 4, 0); });
173 }
174
TEST_F(MessagePreload,PreloadVartexF32VartexF16)175 TEST_F(MessagePreload, PreloadVartexF32VartexF16)
176 {
177 CASE(
178 {
179 bi_var_tex_f32_to(b, u, false, BI_SAMPLE_CENTER, BI_UPDATE_STORE, 0,
180 0);
181 bi_var_tex_f16_to(b, v, false, BI_SAMPLE_CENTER, BI_UPDATE_STORE, 1,
182 2);
183 },
184 {
185 preload_moves(b, u, 4, 0);
186 preload_moves(b, v, 2, 1);
187 });
188 }
189
TEST_F(MessagePreload,PreloadVartexLodModes)190 TEST_F(MessagePreload, PreloadVartexLodModes)
191 {
192 CASE(
193 {
194 bi_var_tex_f32_to(b, u, true, BI_SAMPLE_CENTER, BI_UPDATE_STORE, 0, 0);
195 bi_var_tex_f32_to(b, v, false, BI_SAMPLE_CENTER, BI_UPDATE_STORE, 0,
196 0);
197 },
198 {
199 preload_moves(b, u, 4, 0);
200 preload_moves(b, v, 4, 1);
201 });
202 }
203