• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_test.h"
25 #include "bi_builder.h"
26 #include "va_compiler.h"
27 #include "valhall_enums.h"
28 
29 #include <gtest/gtest.h>
30 
31 #define R(x) bi_register(x)
32 #define DR(x) bi_discard(R(x))
33 
34 static void
strip_discard(bi_context * ctx)35 strip_discard(bi_context *ctx)
36 {
37    bi_foreach_instr_global(ctx, I) {
38       bi_foreach_src(I, s)
39          I->src[s].discard = false;
40    }
41 }
42 
43 #define CASE(test) do { \
44    void *mem_ctx = ralloc_context(NULL); \
45    bi_builder *A = bit_builder(mem_ctx); \
46    bi_builder *B = bit_builder(mem_ctx); \
47    { \
48       UNUSED bi_builder *b = A; \
49       test; \
50    } \
51    strip_discard(A->shader); \
52    va_mark_last(A->shader); \
53    { \
54       UNUSED bi_builder *b = B; \
55       test; \
56    } \
57    ASSERT_SHADER_EQUAL(A->shader, B->shader); \
58    ralloc_free(mem_ctx); \
59 } while(0)
60 
TEST(MarkLast,Simple)61 TEST(MarkLast, Simple) {
62    CASE(bi_fadd_f32_to(b, R(0), DR(0), DR(1)));
63 
64    CASE({
65         bi_fadd_f32_to(b, R(2), R(0), DR(1));
66         bi_fadd_f32_to(b, R(0), DR(0), DR(2));
67    });
68 }
69 
TEST(MarkLast,SameSourceAndDestination)70 TEST(MarkLast, SameSourceAndDestination) {
71    CASE({
72          bi_fadd_f32_to(b, R(0), DR(0), DR(0));
73          bi_fadd_f32_to(b, R(0), DR(0), DR(0));
74          bi_fadd_f32_to(b, R(0), DR(0), DR(0));
75    });
76 }
77 
TEST(MarkLast,StagingReadBefore)78 TEST(MarkLast, StagingReadBefore) {
79    CASE({
80          bi_fadd_f32_to(b, R(9), R(2), DR(7));
81          bi_st_tile(b, R(0), DR(4), DR(5), DR(6), BI_REGISTER_FORMAT_F32, BI_VECSIZE_V4);
82    });
83 }
84 
TEST(MarkLast,StagingReadAfter)85 TEST(MarkLast, StagingReadAfter) {
86    CASE({
87          bi_st_tile(b, R(0), DR(4), DR(5), DR(6), BI_REGISTER_FORMAT_F32, BI_VECSIZE_V4);
88          bi_fadd_f32_to(b, R(9), R(2), DR(7));
89    });
90 }
91 
TEST(MarkLast,NonstagingSourceToAsync)92 TEST(MarkLast, NonstagingSourceToAsync) {
93    CASE({
94          bi_st_tile(b, R(0), R(4), R(5), DR(6), BI_REGISTER_FORMAT_F32, BI_VECSIZE_V4);
95          bi_fadd_f32_to(b, R(9), DR(4), DR(5));
96    });
97 }
98 
TEST(MarkLast,Both64)99 TEST(MarkLast, Both64) {
100    CASE(bi_load_i32_to(b, R(0), DR(8), DR(9), BI_SEG_NONE, 0));
101 }
102 
TEST(MarkLast,Neither64ThenBoth)103 TEST(MarkLast, Neither64ThenBoth) {
104    CASE({
105          bi_load_i32_to(b, R(0), R(8), R(9), BI_SEG_NONE, 0);
106          bi_load_i32_to(b, R(1), DR(8), DR(9), BI_SEG_NONE, 8);
107    });
108 }
109 
TEST(MarkLast,Half64)110 TEST(MarkLast, Half64) {
111    CASE({
112          bi_load_i32_to(b, R(0), R(8), R(9), BI_SEG_NONE, 0);
113          bi_fadd_f32_to(b, R(8), DR(8), DR(8));
114    });
115 
116    CASE({
117          bi_load_i32_to(b, R(0), R(8), R(9), BI_SEG_NONE, 0);
118          bi_fadd_f32_to(b, R(9), DR(9), DR(9));
119    });
120 }
121 
TEST(MarkLast,RegisterBlendDescriptor)122 TEST(MarkLast, RegisterBlendDescriptor) {
123    CASE({
124          bi_blend_to(b, bi_null(), R(0), DR(60), DR(4), DR(5), bi_null(),
125                      BI_REGISTER_FORMAT_F32, 4, 0);
126    });
127 
128    CASE({
129          bi_blend_to(b, bi_null(), R(0), DR(60), R(4), R(5), bi_null(),
130                      BI_REGISTER_FORMAT_F32, 4, 0);
131          bi_fadd_f32_to(b, R(4), DR(4), DR(7));
132    });
133 
134    CASE({
135          bi_blend_to(b, bi_null(), R(0), DR(60), R(4), R(5), bi_null(),
136                      BI_REGISTER_FORMAT_F32, 4, 0);
137          bi_fadd_f32_to(b, R(4), DR(5), DR(7));
138    });
139 }
140 
TEST(MarkLast,ControlFlowAllFeatures)141 TEST(MarkLast, ControlFlowAllFeatures) {
142    /*      A
143     *     / \
144     *    B   C
145     */
146    CASE({
147       bi_block *A = bi_start_block(&b->shader->blocks);
148       bi_block *B = bit_block(b->shader);
149       bi_block *C = bit_block(b->shader);
150 
151       bi_block_add_successor(A, B);
152       bi_block_add_successor(A, C);
153 
154       b->cursor = bi_after_block(A);
155       {
156          bi_instr *I =
157             bi_st_tile(b, R(10), DR(14), DR(15), DR(16),
158                        BI_REGISTER_FORMAT_F32, BI_VECSIZE_V4);
159          I->slot = 2;
160 
161          bi_load_i32_to(b, R(20), R(28), R(29), BI_SEG_NONE, 0);
162 
163          bi_fadd_f32_to(b, R(0), DR(0), R(3));
164          bi_fadd_f32_to(b, R(0), DR(0), R(7));
165          bi_fma_f32_to(b, R(2), R(0), R(1), DR(4));
166       }
167 
168       b->cursor = bi_after_block(B);
169       {
170          bi_fadd_f32_to(b, R(2), DR(0), DR(2));
171          bi_fadd_f32_to(b, R(2), DR(2), DR(3));
172          bi_fadd_f32_to(b, R(2), DR(2), DR(7));
173          bi_fadd_f32_to(b, R(2), DR(2), DR(29));
174       }
175 
176       b->cursor = bi_after_block(C);
177       {
178          bi_fadd_f32_to(b, R(2), DR(1), DR(2));
179          bi_fadd_f32_to(b, R(2), DR(2), DR(7));
180 
181          bi_instr *I = bi_fadd_f32_to(b, R(2), DR(2), R(13));
182          I->flow = VA_FLOW_WAIT2;
183 
184          bi_fadd_f32_to(b, R(2), DR(2), DR(11));
185       }
186    });
187 }
188