1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2023 Intel Corporation
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
20*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker *
23*61046927SAndroid Build Coastguard Worker */
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
26*61046927SAndroid Build Coastguard Worker #include <stdio.h>
27*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
28*61046927SAndroid Build Coastguard Worker #include <stdarg.h>
29*61046927SAndroid Build Coastguard Worker #include <string.h>
30*61046927SAndroid Build Coastguard Worker #include <unistd.h>
31*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
32*61046927SAndroid Build Coastguard Worker #include <assert.h>
33*61046927SAndroid Build Coastguard Worker #include <getopt.h>
34*61046927SAndroid Build Coastguard Worker
35*61046927SAndroid Build Coastguard Worker #include "dev/intel_debug.h"
36*61046927SAndroid Build Coastguard Worker #include "dev/intel_device_info.h"
37*61046927SAndroid Build Coastguard Worker #include "isl/isl.h"
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker const struct debug_control usages_control[] = {
40*61046927SAndroid Build Coastguard Worker { "rt", ISL_SURF_USAGE_RENDER_TARGET_BIT, },
41*61046927SAndroid Build Coastguard Worker { "depth", ISL_SURF_USAGE_DEPTH_BIT, },
42*61046927SAndroid Build Coastguard Worker { "stencil", ISL_SURF_USAGE_STENCIL_BIT, },
43*61046927SAndroid Build Coastguard Worker { "texture", ISL_SURF_USAGE_TEXTURE_BIT, },
44*61046927SAndroid Build Coastguard Worker { "cube", ISL_SURF_USAGE_CUBE_BIT, },
45*61046927SAndroid Build Coastguard Worker { "disable-aux", ISL_SURF_USAGE_DISABLE_AUX_BIT, },
46*61046927SAndroid Build Coastguard Worker { "display", ISL_SURF_USAGE_DISPLAY_BIT, },
47*61046927SAndroid Build Coastguard Worker { "storage", ISL_SURF_USAGE_STORAGE_BIT, },
48*61046927SAndroid Build Coastguard Worker { "hiz", ISL_SURF_USAGE_HIZ_BIT, },
49*61046927SAndroid Build Coastguard Worker { "mcs", ISL_SURF_USAGE_MCS_BIT, },
50*61046927SAndroid Build Coastguard Worker { "ccs", ISL_SURF_USAGE_CCS_BIT, },
51*61046927SAndroid Build Coastguard Worker { "vertex", ISL_SURF_USAGE_VERTEX_BUFFER_BIT, },
52*61046927SAndroid Build Coastguard Worker { "index", ISL_SURF_USAGE_INDEX_BUFFER_BIT, },
53*61046927SAndroid Build Coastguard Worker { "constant", ISL_SURF_USAGE_CONSTANT_BUFFER_BIT, },
54*61046927SAndroid Build Coastguard Worker { "cpb", ISL_SURF_USAGE_CPB_BIT, },
55*61046927SAndroid Build Coastguard Worker };
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Worker static void
print_help(const char * name)58*61046927SAndroid Build Coastguard Worker print_help(const char *name)
59*61046927SAndroid Build Coastguard Worker {
60*61046927SAndroid Build Coastguard Worker printf("Usage: %s [OPTION] ...\n", name);
61*61046927SAndroid Build Coastguard Worker printf("Prints out ISL surface parameters.\n");
62*61046927SAndroid Build Coastguard Worker printf(" --help Display this help and exit\n");
63*61046927SAndroid Build Coastguard Worker printf(" -p, --platform NAME Platform to use\n");
64*61046927SAndroid Build Coastguard Worker printf(" -D, --dimension DIM Dimension of the surface (1, 2, 3)\n");
65*61046927SAndroid Build Coastguard Worker printf(" -f, --format FORMAT Format of the surface (--list-formats to list them)\n");
66*61046927SAndroid Build Coastguard Worker printf(" -w, --width WIDTH Width of the surface\n");
67*61046927SAndroid Build Coastguard Worker printf(" -h, --height HEIGHT Height of the surface\n");
68*61046927SAndroid Build Coastguard Worker printf(" -d, --depth DEPTH Depth of the surface\n");
69*61046927SAndroid Build Coastguard Worker printf(" -a, --array ARRAY Array length of the surface\n");
70*61046927SAndroid Build Coastguard Worker printf(" -s, --samples SAMPLES Sample count of the surface\n");
71*61046927SAndroid Build Coastguard Worker printf(" -l, --levels LEVELS Miplevel count of the surface\n");
72*61046927SAndroid Build Coastguard Worker printf(" -P, --pitch PITCH Row pitch of the surface\n");
73*61046927SAndroid Build Coastguard Worker printf(" -u, --usages USAGE1,USAGE2,... Usage list of the surface\n");
74*61046927SAndroid Build Coastguard Worker printf(" usages: ");
75*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < ARRAY_SIZE(usages_control); i++)
76*61046927SAndroid Build Coastguard Worker printf("%s%s", i == 0 ? "" : ", ", usages_control[i].string);
77*61046927SAndroid Build Coastguard Worker printf("\n");
78*61046927SAndroid Build Coastguard Worker printf(" -F, --list-formats List format names\n");
79*61046927SAndroid Build Coastguard Worker printf("\n");
80*61046927SAndroid Build Coastguard Worker }
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker int
main(int argc,char * argv[])83*61046927SAndroid Build Coastguard Worker main(int argc, char *argv[])
84*61046927SAndroid Build Coastguard Worker {
85*61046927SAndroid Build Coastguard Worker int c, i;
86*61046927SAndroid Build Coastguard Worker bool help = false;
87*61046927SAndroid Build Coastguard Worker const struct option isl_opts[] = {
88*61046927SAndroid Build Coastguard Worker { "help", no_argument, (int *) &help, true },
89*61046927SAndroid Build Coastguard Worker { "platform", required_argument, NULL, 'p' },
90*61046927SAndroid Build Coastguard Worker { "dimension", required_argument, NULL, 'D' },
91*61046927SAndroid Build Coastguard Worker { "format", required_argument, NULL, 'f' },
92*61046927SAndroid Build Coastguard Worker { "width", required_argument, NULL, 'w' },
93*61046927SAndroid Build Coastguard Worker { "height", required_argument, NULL, 'h' },
94*61046927SAndroid Build Coastguard Worker { "depth", required_argument, NULL, 'd' },
95*61046927SAndroid Build Coastguard Worker { "array", required_argument, NULL, 'a' },
96*61046927SAndroid Build Coastguard Worker { "samples", required_argument, NULL, 's' },
97*61046927SAndroid Build Coastguard Worker { "levels", required_argument, NULL, 'l' },
98*61046927SAndroid Build Coastguard Worker { "pitch", required_argument, NULL, 'P' },
99*61046927SAndroid Build Coastguard Worker { "usages", required_argument, NULL, 'u' },
100*61046927SAndroid Build Coastguard Worker { "list-formats", no_argument, NULL, 'F' },
101*61046927SAndroid Build Coastguard Worker { NULL, 0, NULL, 0 }
102*61046927SAndroid Build Coastguard Worker };
103*61046927SAndroid Build Coastguard Worker
104*61046927SAndroid Build Coastguard Worker const char *platform = "tgl";
105*61046927SAndroid Build Coastguard Worker enum isl_surf_dim dimension = ISL_SURF_DIM_2D;
106*61046927SAndroid Build Coastguard Worker enum isl_format format = ISL_FORMAT_R8G8B8A8_UNORM;
107*61046927SAndroid Build Coastguard Worker uint32_t width = 1;
108*61046927SAndroid Build Coastguard Worker uint32_t height = 1;
109*61046927SAndroid Build Coastguard Worker uint32_t depth = 1;
110*61046927SAndroid Build Coastguard Worker uint32_t array = 1;
111*61046927SAndroid Build Coastguard Worker uint32_t samples = 1;
112*61046927SAndroid Build Coastguard Worker uint32_t levels = 1;
113*61046927SAndroid Build Coastguard Worker uint32_t row_pitch = 0;
114*61046927SAndroid Build Coastguard Worker isl_surf_usage_flags_t usages = ISL_SURF_USAGE_RENDER_TARGET_BIT | ISL_SURF_USAGE_TEXTURE_BIT;
115*61046927SAndroid Build Coastguard Worker
116*61046927SAndroid Build Coastguard Worker i = 0;
117*61046927SAndroid Build Coastguard Worker while ((c = getopt_long(argc, argv, "p:D:f:w:h:d:a:s:l:P:u:F", isl_opts, &i)) != -1) {
118*61046927SAndroid Build Coastguard Worker switch (c) {
119*61046927SAndroid Build Coastguard Worker case 'p':
120*61046927SAndroid Build Coastguard Worker platform = optarg;
121*61046927SAndroid Build Coastguard Worker break;
122*61046927SAndroid Build Coastguard Worker case 'D':
123*61046927SAndroid Build Coastguard Worker dimension = atoi(optarg) - 1;
124*61046927SAndroid Build Coastguard Worker break;
125*61046927SAndroid Build Coastguard Worker case 'f':
126*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < ISL_NUM_FORMATS; i++) {
127*61046927SAndroid Build Coastguard Worker if (isl_format_get_layout(i)->bpb != 0 &&
128*61046927SAndroid Build Coastguard Worker strcmp(optarg, isl_format_get_short_name(i)) == 0) {
129*61046927SAndroid Build Coastguard Worker format = i;
130*61046927SAndroid Build Coastguard Worker break;
131*61046927SAndroid Build Coastguard Worker }
132*61046927SAndroid Build Coastguard Worker }
133*61046927SAndroid Build Coastguard Worker break;
134*61046927SAndroid Build Coastguard Worker case 'w':
135*61046927SAndroid Build Coastguard Worker width = atoi(optarg);
136*61046927SAndroid Build Coastguard Worker break;
137*61046927SAndroid Build Coastguard Worker case 'h':
138*61046927SAndroid Build Coastguard Worker height = atoi(optarg);
139*61046927SAndroid Build Coastguard Worker break;
140*61046927SAndroid Build Coastguard Worker case 'd':
141*61046927SAndroid Build Coastguard Worker depth = atoi(optarg);
142*61046927SAndroid Build Coastguard Worker break;
143*61046927SAndroid Build Coastguard Worker case 'a':
144*61046927SAndroid Build Coastguard Worker array = atoi(optarg);
145*61046927SAndroid Build Coastguard Worker break;
146*61046927SAndroid Build Coastguard Worker case 's':
147*61046927SAndroid Build Coastguard Worker samples = atoi(optarg);
148*61046927SAndroid Build Coastguard Worker break;
149*61046927SAndroid Build Coastguard Worker case 'l':
150*61046927SAndroid Build Coastguard Worker levels = atoi(optarg);
151*61046927SAndroid Build Coastguard Worker break;
152*61046927SAndroid Build Coastguard Worker case 'P':
153*61046927SAndroid Build Coastguard Worker row_pitch = atoi(optarg);
154*61046927SAndroid Build Coastguard Worker break;
155*61046927SAndroid Build Coastguard Worker case 'u': {
156*61046927SAndroid Build Coastguard Worker usages = parse_debug_string(optarg, usages_control);
157*61046927SAndroid Build Coastguard Worker break;
158*61046927SAndroid Build Coastguard Worker }
159*61046927SAndroid Build Coastguard Worker case 'F':
160*61046927SAndroid Build Coastguard Worker printf("Format list:\n");
161*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < ISL_NUM_FORMATS; i++) {
162*61046927SAndroid Build Coastguard Worker if (isl_format_get_layout(i)->bpb != 0)
163*61046927SAndroid Build Coastguard Worker printf(" %s\n", isl_format_get_short_name(i));
164*61046927SAndroid Build Coastguard Worker }
165*61046927SAndroid Build Coastguard Worker exit(EXIT_SUCCESS);
166*61046927SAndroid Build Coastguard Worker break;
167*61046927SAndroid Build Coastguard Worker case '?':
168*61046927SAndroid Build Coastguard Worker print_help(argv[0]);
169*61046927SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
170*61046927SAndroid Build Coastguard Worker default:
171*61046927SAndroid Build Coastguard Worker break;
172*61046927SAndroid Build Coastguard Worker }
173*61046927SAndroid Build Coastguard Worker }
174*61046927SAndroid Build Coastguard Worker
175*61046927SAndroid Build Coastguard Worker process_intel_debug_variable();
176*61046927SAndroid Build Coastguard Worker
177*61046927SAndroid Build Coastguard Worker int pci_id = intel_device_name_to_pci_device_id(platform);
178*61046927SAndroid Build Coastguard Worker if (pci_id == -1) {
179*61046927SAndroid Build Coastguard Worker printf("Unknown platform: %s\n", platform);
180*61046927SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
181*61046927SAndroid Build Coastguard Worker }
182*61046927SAndroid Build Coastguard Worker
183*61046927SAndroid Build Coastguard Worker struct intel_device_info devinfo;
184*61046927SAndroid Build Coastguard Worker if (!intel_get_device_info_from_pci_id(pci_id, &devinfo)) {
185*61046927SAndroid Build Coastguard Worker printf("Unable to identify devid=0x%x\n", pci_id);
186*61046927SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
187*61046927SAndroid Build Coastguard Worker }
188*61046927SAndroid Build Coastguard Worker
189*61046927SAndroid Build Coastguard Worker struct isl_device isl_dev;
190*61046927SAndroid Build Coastguard Worker isl_device_init(&isl_dev, &devinfo);
191*61046927SAndroid Build Coastguard Worker
192*61046927SAndroid Build Coastguard Worker struct isl_surf surf;
193*61046927SAndroid Build Coastguard Worker bool ok = isl_surf_init(&isl_dev, &surf,
194*61046927SAndroid Build Coastguard Worker .format = format,
195*61046927SAndroid Build Coastguard Worker .dim = dimension,
196*61046927SAndroid Build Coastguard Worker .width = width,
197*61046927SAndroid Build Coastguard Worker .height = height,
198*61046927SAndroid Build Coastguard Worker .depth = depth,
199*61046927SAndroid Build Coastguard Worker .levels = levels,
200*61046927SAndroid Build Coastguard Worker .array_len = array,
201*61046927SAndroid Build Coastguard Worker .samples = samples,
202*61046927SAndroid Build Coastguard Worker .row_pitch_B = row_pitch,
203*61046927SAndroid Build Coastguard Worker .usage = usages,
204*61046927SAndroid Build Coastguard Worker .tiling_flags = ISL_TILING_ANY_MASK);
205*61046927SAndroid Build Coastguard Worker if (!ok) {
206*61046927SAndroid Build Coastguard Worker printf("Surface creation failed\n");
207*61046927SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
208*61046927SAndroid Build Coastguard Worker }
209*61046927SAndroid Build Coastguard Worker
210*61046927SAndroid Build Coastguard Worker #define _2d_vals(name) \
211*61046927SAndroid Build Coastguard Worker name.w, name.h
212*61046927SAndroid Build Coastguard Worker #define _3d_vals(name) \
213*61046927SAndroid Build Coastguard Worker name.w, name.h, name.d
214*61046927SAndroid Build Coastguard Worker #define _4d_vals(name) \
215*61046927SAndroid Build Coastguard Worker name.w, name.h, name.d, name.a
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker printf("Surface parameters:\n");
218*61046927SAndroid Build Coastguard Worker printf(" dim: %ud\n", surf.dim + 1);
219*61046927SAndroid Build Coastguard Worker printf(" dim_layout: %u\n", surf.dim_layout);
220*61046927SAndroid Build Coastguard Worker printf(" msaa_layout: %u\n", surf.msaa_layout);
221*61046927SAndroid Build Coastguard Worker printf(" tiling: %s\n", isl_tiling_to_name(surf.tiling));
222*61046927SAndroid Build Coastguard Worker printf(" format: %s\n", isl_format_get_short_name(surf.format));
223*61046927SAndroid Build Coastguard Worker printf(" img_align_el: %ux%ux%u\n", _3d_vals(surf.image_alignment_el));
224*61046927SAndroid Build Coastguard Worker printf(" logical_level0_px: %ux%ux%ux%u\n", _4d_vals(surf.logical_level0_px));
225*61046927SAndroid Build Coastguard Worker printf(" phys_level0_sa: %ux%ux%ux%u\n", _4d_vals(surf.phys_level0_sa));
226*61046927SAndroid Build Coastguard Worker printf(" levels: %u\n", surf.levels);
227*61046927SAndroid Build Coastguard Worker printf(" samples: %ux\n", surf.samples);
228*61046927SAndroid Build Coastguard Worker printf(" size_B: %"PRIu64"\n", surf.size_B);
229*61046927SAndroid Build Coastguard Worker printf(" alignment_B: %u\n", surf.alignment_B);
230*61046927SAndroid Build Coastguard Worker printf(" row_pitch_B: %u\n", surf.row_pitch_B);
231*61046927SAndroid Build Coastguard Worker printf(" array_pitch_el_rows: %u\n", surf.array_pitch_el_rows);
232*61046927SAndroid Build Coastguard Worker
233*61046927SAndroid Build Coastguard Worker struct isl_tile_info tile_info;
234*61046927SAndroid Build Coastguard Worker isl_surf_get_tile_info(&surf, &tile_info);
235*61046927SAndroid Build Coastguard Worker printf(" tile_info:\n");
236*61046927SAndroid Build Coastguard Worker printf(" tiling: %s\n", isl_tiling_to_name(tile_info.tiling));
237*61046927SAndroid Build Coastguard Worker printf(" format_bpb: %u\n", tile_info.format_bpb);
238*61046927SAndroid Build Coastguard Worker printf(" logical_extent_el: %ux%ux%ux%u\n", _4d_vals(tile_info.logical_extent_el));
239*61046927SAndroid Build Coastguard Worker printf(" phys_extent_B: %ux%u = %u\n",
240*61046927SAndroid Build Coastguard Worker _2d_vals(tile_info.phys_extent_B),
241*61046927SAndroid Build Coastguard Worker tile_info.phys_extent_B.w * tile_info.phys_extent_B.h);
242*61046927SAndroid Build Coastguard Worker
243*61046927SAndroid Build Coastguard Worker return EXIT_SUCCESS;
244*61046927SAndroid Build Coastguard Worker }
245