xref: /aosp_15_r20/external/mesa3d/src/compiler/nir/tests/opt_varyings_tests_dedup.cpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright 2023 Advanced Micro Devices, Inc.
3  *
4  * SPDX-License-Identifier: MIT
5  */
6 
7 #include "nir_opt_varyings_test.h"
8 
9 class nir_opt_varyings_test_dedup : public nir_opt_varyings_test
10 {};
11 
12 #define TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, interp1, interp2) \
13 TEST_F(nir_opt_varyings_test_dedup, \
14        producer_stage##_##consumer_stage##_##slot1##_##slot2##_##bitsize##_##interp1##_##interp2) \
15 { \
16    unsigned pslot[2] = {VARYING_SLOT_##slot1, VARYING_SLOT_##slot2}; \
17    unsigned cslot[2] = {VARYING_SLOT_##slot1, VARYING_SLOT_##slot2}; \
18    unsigned interp[2] = {INTERP_##interp1, INTERP_##interp2}; \
19    \
20    /* BFCn becomes COLn in FS. */ \
21    for (unsigned s = 0; s < 2; s++) { \
22       if (MESA_SHADER_##consumer_stage == MESA_SHADER_FRAGMENT && \
23           (pslot[s] == VARYING_SLOT_BFC0 || pslot[s] == VARYING_SLOT_BFC1)) \
24          pslot[s] -= VARYING_SLOT_BFC0 - VARYING_SLOT_COL0; \
25    } \
26    \
27    create_shaders(MESA_SHADER_##producer_stage, MESA_SHADER_##consumer_stage); \
28    nir_intrinsic_instr *store[2][3] = {{NULL}}; \
29    for (unsigned s = 0; s < 2; s++) { \
30       nir_def *input = load_input(b1, (gl_varying_slot)0, 0, nir_type_float##bitsize, 0, 0); \
31       for (unsigned v = 0; v < (is_per_vertex(b1, (gl_varying_slot)pslot[s], false) ? 3 : 1); v++) { \
32          store[s][v] = \
33             store_output(b1, (gl_varying_slot)pslot[s], s, nir_type_float##bitsize, input, v); \
34       } \
35    } \
36    \
37    nir_def *load[2][3] = {{NULL}}; \
38    for (unsigned s = 0; s < 2; s++) { \
39       for (unsigned v = 0; v < (is_per_vertex(b2, (gl_varying_slot)cslot[s], true) ? 3 : 1); v++) { \
40          load[s][v] = load_input(b2, (gl_varying_slot)cslot[s], s, \
41                                  nir_type_float##bitsize, v, interp[s]); \
42          store_output(b2, VARYING_SLOT_VAR0, 0, nir_type_float##bitsize, load[s][v], 0); \
43       } \
44    } \
45    \
46    if (is_patch((gl_varying_slot)pslot[0]) == is_patch((gl_varying_slot)pslot[1]) && \
47        is_color(b2, (gl_varying_slot)cslot[0]) == is_color(b2, (gl_varying_slot)cslot[1]) && \
48        !is_texcoord(b2, (gl_varying_slot)cslot[0]) && !is_texcoord(b2, (gl_varying_slot)cslot[1]) && \
49        INTERP_##interp1 == INTERP_##interp2 && !is_interp_at_offset(INTERP_##interp1)) { \
50       ASSERT_EQ(opt_varyings(), (nir_progress_producer | nir_progress_consumer)); \
51       for (unsigned v = 0; v < (is_per_vertex(b1, (gl_varying_slot)pslot[1], false) ? 3 : 1); v++) { \
52          ASSERT_TRUE(shader_contains_instr(b1, &store[0][v]->instr)); \
53          if (nir_slot_is_sysval_output((gl_varying_slot)pslot[1], MESA_SHADER_##consumer_stage)) { \
54             ASSERT_TRUE(shader_contains_instr(b1, &store[1][v]->instr)); \
55             ASSERT_TRUE(nir_intrinsic_io_semantics(store[1][v]).no_varying); \
56          } else { \
57             ASSERT_TRUE(!shader_contains_instr(b1, &store[1][v]->instr)); \
58          } \
59       } \
60       for (unsigned v = 0; v < (is_per_vertex(b2, (gl_varying_slot)cslot[1], true) ? 3 : 1); v++) { \
61          ASSERT_TRUE(shader_contains_def(b2, load[0][v])); \
62          ASSERT_TRUE(!shader_contains_def(b2, load[1][v])); \
63       } \
64    } else { \
65       ASSERT_EQ(opt_varyings(), 0); \
66       for (unsigned v = 0; v < (is_per_vertex(b1, (gl_varying_slot)pslot[1], false) ? 3 : 1); v++) { \
67          ASSERT_TRUE(shader_contains_instr(b1, &store[0][v]->instr)); \
68          ASSERT_TRUE(shader_contains_instr(b1, &store[1][v]->instr)); \
69       } \
70       for (unsigned v = 0; v < (is_per_vertex(b2, (gl_varying_slot)cslot[1], true) ? 3 : 1); v++) { \
71          ASSERT_TRUE(shader_contains_def(b2, load[0][v])); \
72          ASSERT_TRUE(shader_contains_def(b2, load[1][v])); \
73       } \
74    } \
75 }
76 
77 #define TEST_DEDUP_TEMPL1(producer_stage, consumer_stage, slot1, slot2, bitsize, interp) \
78    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, interp, interp)
79 
80 #define TEST_DEDUP(producer_stage, consumer_stage, slot1, slot2, bitsize) \
81    TEST_DEDUP_TEMPL1(producer_stage, consumer_stage, slot1, slot2, bitsize, FLAT)
82 
83 #define TEST_DEDUP_INTERP(producer_stage, consumer_stage, slot1, slot2, bitsize) \
84    /* Same interpolation qualifier. */ \
85    TEST_DEDUP_TEMPL1(producer_stage, consumer_stage, slot1, slot2, bitsize, FLAT) \
86    TEST_DEDUP_TEMPL1(producer_stage, consumer_stage, slot1, slot2, bitsize, PERSP_PIXEL) \
87    TEST_DEDUP_TEMPL1(producer_stage, consumer_stage, slot1, slot2, bitsize, PERSP_CENTROID) \
88    TEST_DEDUP_TEMPL1(producer_stage, consumer_stage, slot1, slot2, bitsize, PERSP_SAMPLE) \
89    TEST_DEDUP_TEMPL1(producer_stage, consumer_stage, slot1, slot2, bitsize, PERSP_AT_OFFSET) \
90    TEST_DEDUP_TEMPL1(producer_stage, consumer_stage, slot1, slot2, bitsize, LINEAR_PIXEL) \
91    TEST_DEDUP_TEMPL1(producer_stage, consumer_stage, slot1, slot2, bitsize, LINEAR_CENTROID) \
92    TEST_DEDUP_TEMPL1(producer_stage, consumer_stage, slot1, slot2, bitsize, LINEAR_SAMPLE) \
93    TEST_DEDUP_TEMPL1(producer_stage, consumer_stage, slot1, slot2, bitsize, LINEAR_AT_OFFSET) \
94    /* Different interpolation qualifiers. */ \
95    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, FLAT, PERSP_PIXEL) \
96    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, FLAT, PERSP_CENTROID) \
97    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, FLAT, PERSP_SAMPLE) \
98    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, FLAT, PERSP_AT_OFFSET) \
99    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, FLAT, LINEAR_PIXEL) \
100    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, PERSP_PIXEL,     PERSP_CENTROID) \
101    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, PERSP_CENTROID,  PERSP_SAMPLE) \
102    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, PERSP_SAMPLE,    PERSP_AT_OFFSET) \
103    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, LINEAR_PIXEL,    LINEAR_CENTROID) \
104    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, LINEAR_CENTROID, LINEAR_SAMPLE) \
105    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, LINEAR_SAMPLE,   LINEAR_AT_OFFSET) \
106    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, PERSP_PIXEL,     LINEAR_PIXEL) \
107    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, PERSP_CENTROID,  LINEAR_CENTROID) \
108    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, PERSP_SAMPLE,    LINEAR_SAMPLE) \
109    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, PERSP_AT_OFFSET, LINEAR_AT_OFFSET)
110 
111 #define TEST_DEDUP_INTERP_COLOR(producer_stage, consumer_stage, slot1, slot2, bitsize) \
112    TEST_DEDUP_INTERP(producer_stage, consumer_stage, slot1, slot2, bitsize) \
113    /* Same interpolation qualifier. */ \
114    TEST_DEDUP_TEMPL1(producer_stage, consumer_stage, slot1, slot2, bitsize, COLOR_PIXEL) \
115    TEST_DEDUP_TEMPL1(producer_stage, consumer_stage, slot1, slot2, bitsize, COLOR_CENTROID) \
116    TEST_DEDUP_TEMPL1(producer_stage, consumer_stage, slot1, slot2, bitsize, COLOR_SAMPLE) \
117    TEST_DEDUP_TEMPL1(producer_stage, consumer_stage, slot1, slot2, bitsize, COLOR_AT_OFFSET) \
118    /* Different interpolation qualifiers. */ \
119    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, FLAT,             COLOR_PIXEL) \
120    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, COLOR_PIXEL,      COLOR_CENTROID) \
121    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, COLOR_CENTROID,   COLOR_SAMPLE) \
122    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, COLOR_SAMPLE,     COLOR_AT_OFFSET) \
123    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, LINEAR_PIXEL,     COLOR_PIXEL) \
124    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, LINEAR_CENTROID,  COLOR_CENTROID) \
125    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, LINEAR_SAMPLE,    COLOR_SAMPLE) \
126    TEST_DEDUP_TEMPL(producer_stage, consumer_stage, slot1, slot2, bitsize, LINEAR_AT_OFFSET, COLOR_AT_OFFSET)
127 
128 TEST_DEDUP(VERTEX, TESS_CTRL, VAR0, VAR1, 32)
129 TEST_DEDUP(VERTEX, TESS_EVAL, VAR0, VAR1, 32)
130 TEST_DEDUP(VERTEX, GEOMETRY, VAR0, VAR1, 32)
131 TEST_DEDUP(TESS_CTRL, TESS_EVAL, VAR0, VAR1, 32)
132 TEST_DEDUP(TESS_CTRL, TESS_EVAL, PATCH0, PATCH1, 32)
133 TEST_DEDUP(TESS_EVAL, GEOMETRY, VAR0, VAR1, 32)
134 
135 TEST_DEDUP_INTERP(VERTEX, FRAGMENT, VAR0, VAR1, 32)
136 TEST_DEDUP_INTERP(TESS_EVAL, FRAGMENT, VAR0, VAR1, 32)
137 TEST_DEDUP_INTERP(GEOMETRY, FRAGMENT, VAR0, VAR1, 32)
138 
139 TEST_DEDUP_INTERP_COLOR(VERTEX, FRAGMENT, COL0, COL1, 32)
140 TEST_DEDUP_INTERP_COLOR(TESS_EVAL, FRAGMENT, COL0, COL1, 32)
141 TEST_DEDUP_INTERP_COLOR(GEOMETRY, FRAGMENT, COL0, COL1, 32)
142 
143 TEST_DEDUP(TESS_CTRL, TESS_EVAL, VAR0, PATCH0, 32)
144 TEST_DEDUP_INTERP(VERTEX, FRAGMENT, VAR0, COL0, 32)
145 TEST_DEDUP_INTERP(TESS_EVAL, FRAGMENT, VAR0, COL0, 32)
146 TEST_DEDUP_INTERP(GEOMETRY, FRAGMENT, VAR0, COL0, 32)
147 
148 TEST_DEDUP_INTERP(VERTEX, FRAGMENT, CLIP_DIST0, VAR0, 32)
149 TEST_DEDUP_INTERP(VERTEX, FRAGMENT, TEX0, TEX1, 32)
150 TEST_DEDUP_INTERP(VERTEX, FRAGMENT, TEX0, VAR0, 32)
151 
152 }
153