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