xref: /aosp_15_r20/external/mesa3d/src/panfrost/util/pan_ir.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright (C) 2020 Collabora Ltd.
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20*61046927SAndroid Build Coastguard Worker  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*61046927SAndroid Build Coastguard Worker  * SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  *
23*61046927SAndroid Build Coastguard Worker  * Authors (Collabora):
24*61046927SAndroid Build Coastguard Worker  *      Alyssa Rosenzweig <[email protected]>
25*61046927SAndroid Build Coastguard Worker  */
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #include "pan_ir.h"
28*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker /* Converts a per-component mask to a byte mask */
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker uint16_t
pan_to_bytemask(unsigned bytes,unsigned mask)33*61046927SAndroid Build Coastguard Worker pan_to_bytemask(unsigned bytes, unsigned mask)
34*61046927SAndroid Build Coastguard Worker {
35*61046927SAndroid Build Coastguard Worker    switch (bytes) {
36*61046927SAndroid Build Coastguard Worker    case 0:
37*61046927SAndroid Build Coastguard Worker       assert(mask == 0);
38*61046927SAndroid Build Coastguard Worker       return 0;
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker    case 8:
41*61046927SAndroid Build Coastguard Worker       return mask;
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker    case 16: {
44*61046927SAndroid Build Coastguard Worker       unsigned space =
45*61046927SAndroid Build Coastguard Worker          (mask & 0x1) | ((mask & 0x2) << (2 - 1)) | ((mask & 0x4) << (4 - 2)) |
46*61046927SAndroid Build Coastguard Worker          ((mask & 0x8) << (6 - 3)) | ((mask & 0x10) << (8 - 4)) |
47*61046927SAndroid Build Coastguard Worker          ((mask & 0x20) << (10 - 5)) | ((mask & 0x40) << (12 - 6)) |
48*61046927SAndroid Build Coastguard Worker          ((mask & 0x80) << (14 - 7));
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker       return space | (space << 1);
51*61046927SAndroid Build Coastguard Worker    }
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker    case 32: {
54*61046927SAndroid Build Coastguard Worker       unsigned space = (mask & 0x1) | ((mask & 0x2) << (4 - 1)) |
55*61046927SAndroid Build Coastguard Worker                        ((mask & 0x4) << (8 - 2)) | ((mask & 0x8) << (12 - 3));
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker       return space | (space << 1) | (space << 2) | (space << 3);
58*61046927SAndroid Build Coastguard Worker    }
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker    case 64: {
61*61046927SAndroid Build Coastguard Worker       unsigned A = (mask & 0x1) ? 0xFF : 0x00;
62*61046927SAndroid Build Coastguard Worker       unsigned B = (mask & 0x2) ? 0xFF : 0x00;
63*61046927SAndroid Build Coastguard Worker       return A | (B << 8);
64*61046927SAndroid Build Coastguard Worker    }
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker    default:
67*61046927SAndroid Build Coastguard Worker       unreachable("Invalid register mode");
68*61046927SAndroid Build Coastguard Worker    }
69*61046927SAndroid Build Coastguard Worker }
70*61046927SAndroid Build Coastguard Worker 
71*61046927SAndroid Build Coastguard Worker void
pan_block_add_successor(pan_block * block,pan_block * successor)72*61046927SAndroid Build Coastguard Worker pan_block_add_successor(pan_block *block, pan_block *successor)
73*61046927SAndroid Build Coastguard Worker {
74*61046927SAndroid Build Coastguard Worker    assert(block);
75*61046927SAndroid Build Coastguard Worker    assert(successor);
76*61046927SAndroid Build Coastguard Worker 
77*61046927SAndroid Build Coastguard Worker    /* Cull impossible edges */
78*61046927SAndroid Build Coastguard Worker    if (block->unconditional_jumps)
79*61046927SAndroid Build Coastguard Worker       return;
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < ARRAY_SIZE(block->successors); ++i) {
82*61046927SAndroid Build Coastguard Worker       if (block->successors[i]) {
83*61046927SAndroid Build Coastguard Worker          if (block->successors[i] == successor)
84*61046927SAndroid Build Coastguard Worker             return;
85*61046927SAndroid Build Coastguard Worker          else
86*61046927SAndroid Build Coastguard Worker             continue;
87*61046927SAndroid Build Coastguard Worker       }
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker       block->successors[i] = successor;
90*61046927SAndroid Build Coastguard Worker       _mesa_set_add(successor->predecessors, block);
91*61046927SAndroid Build Coastguard Worker       return;
92*61046927SAndroid Build Coastguard Worker    }
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker    unreachable("Too many successors");
95*61046927SAndroid Build Coastguard Worker }
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker /* Prints a NIR ALU type in Bifrost-style ".f32" ".i8" etc */
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker void
pan_print_alu_type(nir_alu_type t,FILE * fp)100*61046927SAndroid Build Coastguard Worker pan_print_alu_type(nir_alu_type t, FILE *fp)
101*61046927SAndroid Build Coastguard Worker {
102*61046927SAndroid Build Coastguard Worker    unsigned size = nir_alu_type_get_type_size(t);
103*61046927SAndroid Build Coastguard Worker    nir_alu_type base = nir_alu_type_get_base_type(t);
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker    switch (base) {
106*61046927SAndroid Build Coastguard Worker    case nir_type_int:
107*61046927SAndroid Build Coastguard Worker       fprintf(fp, ".i");
108*61046927SAndroid Build Coastguard Worker       break;
109*61046927SAndroid Build Coastguard Worker    case nir_type_uint:
110*61046927SAndroid Build Coastguard Worker       fprintf(fp, ".u");
111*61046927SAndroid Build Coastguard Worker       break;
112*61046927SAndroid Build Coastguard Worker    case nir_type_bool:
113*61046927SAndroid Build Coastguard Worker       fprintf(fp, ".b");
114*61046927SAndroid Build Coastguard Worker       break;
115*61046927SAndroid Build Coastguard Worker    case nir_type_float:
116*61046927SAndroid Build Coastguard Worker       fprintf(fp, ".f");
117*61046927SAndroid Build Coastguard Worker       break;
118*61046927SAndroid Build Coastguard Worker    default:
119*61046927SAndroid Build Coastguard Worker       fprintf(fp, ".unknown");
120*61046927SAndroid Build Coastguard Worker       break;
121*61046927SAndroid Build Coastguard Worker    }
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker    fprintf(fp, "%u", size);
124*61046927SAndroid Build Coastguard Worker }
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker /* Could optimize with a better data structure if anyone cares, TODO: profile */
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker unsigned
pan_lookup_pushed_ubo(struct panfrost_ubo_push * push,unsigned ubo,unsigned offs)129*61046927SAndroid Build Coastguard Worker pan_lookup_pushed_ubo(struct panfrost_ubo_push *push, unsigned ubo,
130*61046927SAndroid Build Coastguard Worker                       unsigned offs)
131*61046927SAndroid Build Coastguard Worker {
132*61046927SAndroid Build Coastguard Worker    struct panfrost_ubo_word word = {.ubo = ubo, .offset = offs};
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < push->count; ++i) {
135*61046927SAndroid Build Coastguard Worker       if (memcmp(push->words + i, &word, sizeof(word)) == 0)
136*61046927SAndroid Build Coastguard Worker          return i;
137*61046927SAndroid Build Coastguard Worker    }
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker    unreachable("UBO not pushed");
140*61046927SAndroid Build Coastguard Worker }
141