xref: /aosp_15_r20/external/mesa3d/src/panfrost/tools/panfrost_texfeatures.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2022 Collabora, Ltd.
3*61046927SAndroid Build Coastguard Worker  * Copyright 2022 Amazon.com, Inc. or its affiliates.
4*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker  */
6*61046927SAndroid Build Coastguard Worker 
7*61046927SAndroid Build Coastguard Worker #include <assert.h>
8*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
9*61046927SAndroid Build Coastguard Worker #include <stdio.h>
10*61046927SAndroid Build Coastguard Worker #include <stdint.h>
11*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
12*61046927SAndroid Build Coastguard Worker #include <string.h>
13*61046927SAndroid Build Coastguard Worker #include <xf86drm.h>
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker #include <lib/kmod/pan_kmod.h>
16*61046927SAndroid Build Coastguard Worker #include <lib/pan_props.h>
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker /*
19*61046927SAndroid Build Coastguard Worker  * Mapping of texture feature bits to compressed formats on Mali-G57, other
20*61046927SAndroid Build Coastguard Worker  * Malis should be similar.
21*61046927SAndroid Build Coastguard Worker  */
22*61046927SAndroid Build Coastguard Worker struct format {
23*61046927SAndroid Build Coastguard Worker    unsigned bit;
24*61046927SAndroid Build Coastguard Worker    const char *name;
25*61046927SAndroid Build Coastguard Worker };
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #define FMT(bit, name)                                                         \
28*61046927SAndroid Build Coastguard Worker    {                                                                           \
29*61046927SAndroid Build Coastguard Worker       bit, name ":"                                                            \
30*61046927SAndroid Build Coastguard Worker    }
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker static struct format formats[] = {
33*61046927SAndroid Build Coastguard Worker    FMT(1, "ETC2"),
34*61046927SAndroid Build Coastguard Worker    FMT(3, "ETC2 EAC"),
35*61046927SAndroid Build Coastguard Worker    FMT(19, "ETC2 PTA"),
36*61046927SAndroid Build Coastguard Worker    FMT(2, "EAC 1"),
37*61046927SAndroid Build Coastguard Worker    FMT(4, "EAC 2"),
38*61046927SAndroid Build Coastguard Worker    FMT(17, "EAC snorm 1"),
39*61046927SAndroid Build Coastguard Worker    FMT(18, "EAC snorm 2"),
40*61046927SAndroid Build Coastguard Worker    {0, NULL},
41*61046927SAndroid Build Coastguard Worker    FMT(20, "ASTC 3D LDR"),
42*61046927SAndroid Build Coastguard Worker    FMT(21, "ASTC 3D HDR"),
43*61046927SAndroid Build Coastguard Worker    FMT(22, "ASTC 2D LDR"),
44*61046927SAndroid Build Coastguard Worker    FMT(23, "ASTC 3D HDR"),
45*61046927SAndroid Build Coastguard Worker    {0, NULL},
46*61046927SAndroid Build Coastguard Worker    FMT(7, "BC1"),
47*61046927SAndroid Build Coastguard Worker    FMT(8, "BC2"),
48*61046927SAndroid Build Coastguard Worker    FMT(9, "BC3"),
49*61046927SAndroid Build Coastguard Worker    FMT(10, "BC4 unorm"),
50*61046927SAndroid Build Coastguard Worker    FMT(11, "BC4 snorm"),
51*61046927SAndroid Build Coastguard Worker    FMT(12, "BC5 unorm"),
52*61046927SAndroid Build Coastguard Worker    FMT(13, "BC5 snorm"),
53*61046927SAndroid Build Coastguard Worker    FMT(14, "BC6H UF16"),
54*61046927SAndroid Build Coastguard Worker    FMT(15, "BC6H SF16"),
55*61046927SAndroid Build Coastguard Worker    FMT(16, "BC7"),
56*61046927SAndroid Build Coastguard Worker };
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker /* ANSI escape code */
59*61046927SAndroid Build Coastguard Worker #define RESET    "\033[0m"
60*61046927SAndroid Build Coastguard Worker #define RED(x)   "\033[31m" x RESET
61*61046927SAndroid Build Coastguard Worker #define GREEN(x) "\033[32m" x RESET
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker int
main(void)64*61046927SAndroid Build Coastguard Worker main(void)
65*61046927SAndroid Build Coastguard Worker {
66*61046927SAndroid Build Coastguard Worker    int fd = drmOpenWithType("panfrost", NULL, DRM_NODE_RENDER);
67*61046927SAndroid Build Coastguard Worker    if (fd < 0) {
68*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "No panfrost device\n");
69*61046927SAndroid Build Coastguard Worker       exit(1);
70*61046927SAndroid Build Coastguard Worker    }
71*61046927SAndroid Build Coastguard Worker 
72*61046927SAndroid Build Coastguard Worker    struct pan_kmod_dev *dev =
73*61046927SAndroid Build Coastguard Worker       pan_kmod_dev_create(fd, PAN_KMOD_DEV_FLAG_OWNS_FD, NULL);
74*61046927SAndroid Build Coastguard Worker    struct pan_kmod_dev_props props;
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker    pan_kmod_dev_query_props(dev, &props);
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker    uint32_t supported = panfrost_query_compressed_formats(&props);
79*61046927SAndroid Build Coastguard Worker    bool all_ok = true;
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker    printf("System-on-chip compressed texture support:"
82*61046927SAndroid Build Coastguard Worker           "\n\n");
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < ARRAY_SIZE(formats); ++i) {
85*61046927SAndroid Build Coastguard Worker       if (formats[i].name == NULL) {
86*61046927SAndroid Build Coastguard Worker          printf("\n");
87*61046927SAndroid Build Coastguard Worker          continue;
88*61046927SAndroid Build Coastguard Worker       }
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker       /* Maximum length for justification */
91*61046927SAndroid Build Coastguard Worker       assert(strlen(formats[i].name) <= 12);
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker       bool ok = (supported & BITFIELD_BIT(formats[i].bit));
94*61046927SAndroid Build Coastguard Worker       all_ok &= ok;
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker       printf("%-14s %s\n", formats[i].name, ok ? GREEN("YES") : RED(" NO"));
97*61046927SAndroid Build Coastguard Worker    }
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker    if (!all_ok) {
100*61046927SAndroid Build Coastguard Worker       printf(
101*61046927SAndroid Build Coastguard Worker          "\n"
102*61046927SAndroid Build Coastguard Worker          "This system-on-chip lacks support for some formats. This is not a driver bug.\n"
103*61046927SAndroid Build Coastguard Worker          "Unsupported formats will be emulated at a performance and memory cost.\n");
104*61046927SAndroid Build Coastguard Worker    }
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker    pan_kmod_dev_destroy(dev);
107*61046927SAndroid Build Coastguard Worker }
108