xref: /aosp_15_r20/external/mesa3d/src/gallium/drivers/freedreno/gmemtool.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © 2020 Google, Inc.
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #include <getopt.h>
7 #include <stdbool.h>
8 
9 static bool bin_debug = false;
10 #define BIN_DEBUG bin_debug
11 
12 #include "freedreno_gmem.c"
13 
14 /* NOTE, non-interesting gmem keys (ie. things that are small enough to fit
15  * in a single bin) are commented out, but retained for posterity.
16  */
17 /* clang-format off */
18 static const struct gmem_key keys[] = {
19    { .minx=0, .miny=0, .width=1536, .height=2048, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {1,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
20    /* manhattan: */
21    { .minx=0, .miny=0, .width=1920, .height=1080, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
22    { .minx=0, .miny=0, .width=1920, .height=1080, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {4,0,}},
23 // { .minx=0, .miny=0, .width=64, .height=64, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
24 // { .minx=0, .miny=0, .width=32, .height=32, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
25 // { .minx=0, .miny=0, .width=16, .height=16, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
26 // { .minx=0, .miny=0, .width=8, .height=8, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
27 // { .minx=0, .miny=0, .width=4, .height=4, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
28 // { .minx=0, .miny=0, .width=2, .height=2, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
29 // { .minx=0, .miny=0, .width=1, .height=1, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
30    { .minx=0, .miny=0, .width=1920, .height=1080, .gmem_page_align=1, .nr_cbufs=4, .cbuf_cpp = {4,4,4,4,0,0,0,0,}, .zsbuf_cpp = {4,0,}},
31 // { .minx=0, .miny=0, .width=64, .height=64, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {2,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
32    { .minx=0, .miny=0, .width=1024, .height=1024, .gmem_page_align=1, .nr_cbufs=0, .cbuf_cpp = {0,0,0,0,0,0,0,0,}, .zsbuf_cpp = {2,0,}},
33    { .minx=0, .miny=0, .width=1920, .height=1080, .gmem_page_align=1, .nr_cbufs=0, .cbuf_cpp = {0,0,0,0,0,0,0,0,}, .zsbuf_cpp = {4,0,}},
34    { .minx=0, .miny=0, .width=960, .height=540, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
35    { .minx=0, .miny=0, .width=480, .height=270, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
36 // { .minx=0, .miny=0, .width=240, .height=135, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
37 // { .minx=0, .miny=0, .width=120, .height=67, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
38 
39    /* trex: */
40    { .minx=0, .miny=0, .width=1920, .height=1080, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
41    { .minx=0, .miny=0, .width=1920, .height=1080, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {4,0,}},
42    { .minx=0, .miny=0, .width=1920, .height=1080, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {2,0,}},
43    { .minx=0, .miny=0, .width=960, .height=540, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {2,0,0,0,0,0,0,0,}, .zsbuf_cpp = {2,0,}},
44    { .minx=0, .miny=0, .width=1024, .height=1024, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {2,0,}},
45 // { .minx=0, .miny=0, .width=64, .height=64, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {2,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
46 
47    /* supertuxkart: */
48    { .minx=0, .miny=0, .width=1920, .height=1080, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
49    { .minx=0, .miny=0, .width=1920, .height=1080, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {2,0,}},
50    { .minx=0, .miny=0, .width=810, .height=810, .gmem_page_align=1, .nr_cbufs=2, .cbuf_cpp = {4,4,0,0,0,0,0,0,}, .zsbuf_cpp = {4,0,}},
51 // { .minx=0, .miny=0, .width=405, .height=405, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {2,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
52    { .minx=0, .miny=0, .width=405, .height=405, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {8,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
53    { .minx=0, .miny=0, .width=810, .height=810, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {8,0,0,0,0,0,0,0,}, .zsbuf_cpp = {4,0,}},
54    { .minx=0, .miny=0, .width=810, .height=810, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {4,0,}},
55    { .minx=0, .miny=0, .width=810, .height=810, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
56    { .minx=0, .miny=0, .width=960, .height=540, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {2,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
57    { .minx=0, .miny=0, .width=1920, .height=1080, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {8,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
58    { .minx=0, .miny=0, .width=960, .height=540, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {8,0,0,0,0,0,0,0,}, .zsbuf_cpp = {0,0,}},
59    { .minx=0, .miny=0, .width=1920, .height=1080, .gmem_page_align=1, .nr_cbufs=2, .cbuf_cpp = {4,4,0,0,0,0,0,0,}, .zsbuf_cpp = {4,0,}},
60    { .minx=0, .miny=0, .width=1920, .height=1080, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {8,0,0,0,0,0,0,0,}, .zsbuf_cpp = {4,0,}},
61    { .minx=0, .miny=0, .width=1920, .height=1080, .gmem_page_align=1, .nr_cbufs=1, .cbuf_cpp = {4,0,0,0,0,0,0,0,}, .zsbuf_cpp = {4,0,}},
62 };
63 /* clang-format on */
64 
65 struct gpu_info {
66    const char *name;
67    uint32_t gpu_id;
68    uint8_t gmem_page_align;
69    uint32_t gmemsize_bytes;
70 };
71 
72 #define SZ_128K 0x00020000
73 #define SZ_256K 0x00040000
74 #define SZ_512K 0x00080000
75 #define SZ_1M   0x00100000
76 
77 /* keep sorted by gpu name: */
78 static const struct gpu_info gpu_infos[] = {
79    {"a306", 307, 4, SZ_128K},
80    {"a405", 405, 4, SZ_256K},
81    {"a530", 530, 4, SZ_1M},
82    {"a618", 618, 1, SZ_512K},
83    {"a630", 630, 1, SZ_1M},
84    {"a650", 630, 1, SZ_1M + SZ_128K},
85 };
86 
87 static const struct option opts[] = {
88    {.name = "gpu",     .has_arg = 1, NULL, 'g'},
89    {.name = "help",    .has_arg = 0, NULL, 'h'},
90    {.name = "verbose", .has_arg = 0, NULL, 'v'},
91    {}};
92 
93 static void
usage(void)94 usage(void)
95 {
96    fprintf(stderr, "Usage:\n\n"
97                    "\tgmemtool [-hv] [-g GPU]\n\n"
98                    "Options:\n"
99                    "\t-g, --gpu=GPU   - use GMEM size/alignment/etc settings "
100                    "for the specified GPU\n"
101                    "\t-h, --help      - this usage message\n"
102                    "\t-v, --verbose   - dump more verbose output\n"
103                    "\n");
104    fprintf(stderr, "Where GPU is one of:\n");
105    for (int i = 0; i < ARRAY_SIZE(gpu_infos); i++)
106       fprintf(stderr, "\t%s\n", gpu_infos[i].name);
107    exit(2);
108 }
109 
110 int
main(int argc,char ** argv)111 main(int argc, char **argv)
112 {
113    const char *gpu_name = "a630";
114    int c;
115 
116    while ((c = getopt_long(argc, argv, "g:hv", opts, NULL)) != -1) {
117       switch (c) {
118       case 'g':
119          gpu_name = optarg;
120          break;
121       case 'v':
122          bin_debug = true;
123          break;
124       case 'h':
125       default:
126          usage();
127       }
128    }
129 
130    const struct gpu_info *gpu_info = NULL;
131 
132    for (int i = 0; i < ARRAY_SIZE(gpu_infos); i++) {
133       if (strcmp(gpu_name, gpu_infos[i].name) == 0) {
134          gpu_info = &gpu_infos[i];
135          break;
136       }
137    }
138 
139    if (!gpu_info) {
140       printf("unrecognized gpu name: %s\n", gpu_name);
141       usage();
142    }
143 
144    struct fd_dev_id dev_id = {
145          .gpu_id = gpu_info->gpu_id,
146    };
147    /* Setup a fake screen with enough GMEM related configuration
148     * to make gmem_stateobj_init() happy:
149     */
150    struct fd_screen screen = {
151       .dev_id = &dev_id,
152       .gmemsize_bytes = gpu_info->gmemsize_bytes,
153    };
154 
155    screen.info = fd_dev_info_raw(&dev_id);
156 
157    /* And finally run thru all the GMEM keys: */
158    for (int i = 0; i < ARRAY_SIZE(keys); i++) {
159       struct gmem_key key = keys[i];
160       key.gmem_page_align = gpu_info->gmem_page_align;
161       struct fd_gmem_stateobj *gmem = gmem_stateobj_init(&screen, &key);
162       dump_gmem_state(gmem);
163 
164       assert((gmem->bin_w * gmem->nbins_x) >= key.width);
165       assert((gmem->bin_h * gmem->nbins_y) >= key.height);
166       assert(gmem->bin_w < screen.info->tile_max_w);
167       assert(gmem->bin_h < screen.info->tile_max_h);
168 
169       ralloc_free(gmem);
170    }
171 
172    return 0;
173 }
174