xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/dri/dri_query_renderer.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 #include "dri_query_renderer.h"
2 
3 #include "util/u_inlines.h"
4 #include "frontend/drm_driver.h"
5 
6 #include "dri_screen.h"
7 #include "dri_query_renderer.h"
8 #include "pipe-loader/pipe_loader.h"
9 
10 /**
11  * Implement queries for values that are common across all Mesa drivers
12  *
13  * Currently only the following queries are supported by this function:
14  *
15  *     - \c __DRI2_RENDERER_VERSION
16  *     - \c __DRI2_RENDERER_PREFERRED_PROFILE
17  *     - \c __DRI2_RENDERER_OPENGL_CORE_PROFILE_VERSION
18  *     - \c __DRI2_RENDERER_OPENGL_COMPATIBLITY_PROFILE_VERSION
19  *     - \c __DRI2_RENDERER_ES_PROFILE_VERSION
20  *     - \c __DRI2_RENDERER_ES2_PROFILE_VERSION
21  *
22  * \returns
23  * Zero if a recognized value of \c param is supplied, -1 otherwise.
24  */
25 static int
driQueryRendererIntegerCommon(struct dri_screen * screen,int param,unsigned int * value)26 driQueryRendererIntegerCommon(struct dri_screen *screen, int param, unsigned int *value)
27 {
28    switch (param) {
29    case __DRI2_RENDERER_VERSION: {
30       static const char *const ver = PACKAGE_VERSION;
31       char *endptr;
32       int v[3];
33 
34       v[0] = strtol(ver, &endptr, 10);
35       assert(endptr[0] == '.');
36       if (endptr[0] != '.')
37          return -1;
38 
39       v[1] = strtol(endptr + 1, &endptr, 10);
40       assert(endptr[0] == '.');
41       if (endptr[0] != '.')
42          return -1;
43 
44       v[2] = strtol(endptr + 1, &endptr, 10);
45 
46       value[0] = v[0];
47       value[1] = v[1];
48       value[2] = v[2];
49       return 0;
50    }
51    case __DRI2_RENDERER_PREFERRED_PROFILE:
52       value[0] = (screen->max_gl_core_version != 0)
53          ? (1U << __DRI_API_OPENGL_CORE) : (1U << __DRI_API_OPENGL);
54       return 0;
55    case __DRI2_RENDERER_OPENGL_CORE_PROFILE_VERSION:
56       value[0] = screen->max_gl_core_version / 10;
57       value[1] = screen->max_gl_core_version % 10;
58       return 0;
59    case __DRI2_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION:
60       value[0] = screen->max_gl_compat_version / 10;
61       value[1] = screen->max_gl_compat_version % 10;
62       return 0;
63    case __DRI2_RENDERER_OPENGL_ES_PROFILE_VERSION:
64       value[0] = screen->max_gl_es1_version / 10;
65       value[1] = screen->max_gl_es1_version % 10;
66       return 0;
67    case __DRI2_RENDERER_OPENGL_ES2_PROFILE_VERSION:
68       value[0] = screen->max_gl_es2_version / 10;
69       value[1] = screen->max_gl_es2_version % 10;
70       return 0;
71    default:
72       break;
73    }
74 
75    return -1;
76 }
77 
78 int
dri_query_renderer_integer(__DRIscreen * _screen,int param,unsigned int * value)79 dri_query_renderer_integer(__DRIscreen *_screen, int param,
80                             unsigned int *value)
81 {
82    struct dri_screen *screen = dri_screen(_screen);
83 
84    switch (param) {
85    case __DRI2_RENDERER_VENDOR_ID:
86       value[0] =
87          (unsigned int)screen->base.screen->get_param(screen->base.screen,
88                                                       PIPE_CAP_VENDOR_ID);
89       return 0;
90    case __DRI2_RENDERER_DEVICE_ID:
91       value[0] =
92          (unsigned int)screen->base.screen->get_param(screen->base.screen,
93                                                       PIPE_CAP_DEVICE_ID);
94       return 0;
95    case __DRI2_RENDERER_ACCELERATED:
96       value[0] =
97          (unsigned int)!!screen->base.screen->get_param(screen->base.screen,
98                                                         PIPE_CAP_ACCELERATED);
99       return 0;
100 
101    case __DRI2_RENDERER_VIDEO_MEMORY: {
102       int ov = driQueryOptioni(&screen->dev->option_cache, "override_vram_size");
103       value[0] =
104          (unsigned int)screen->base.screen->get_param(screen->base.screen,
105                                                       PIPE_CAP_VIDEO_MEMORY);
106       if (ov >= 0)
107          value[0] = MIN2(ov, value[0]);
108       return 0;
109    }
110 
111    case __DRI2_RENDERER_UNIFIED_MEMORY_ARCHITECTURE:
112       value[0] =
113          (unsigned int)screen->base.screen->get_param(screen->base.screen,
114                                                       PIPE_CAP_UMA);
115       return 0;
116 
117    case __DRI2_RENDERER_PREFER_BACK_BUFFER_REUSE:
118       value[0] =
119          screen->base.screen->get_param(screen->base.screen,
120                                         PIPE_CAP_PREFER_BACK_BUFFER_REUSE);
121       return 0;
122    default:
123       return driQueryRendererIntegerCommon(screen, param, value);
124    }
125 }
126 
127 int
dri_query_renderer_string(__DRIscreen * _screen,int param,const char ** value)128 dri_query_renderer_string(__DRIscreen *_screen, int param,
129                            const char **value)
130 {
131    struct dri_screen *screen = dri_screen(_screen);
132 
133    switch (param) {
134    case __DRI2_RENDERER_VENDOR_ID:
135       value[0] = screen->base.screen->get_vendor(screen->base.screen);
136       return 0;
137    case __DRI2_RENDERER_DEVICE_ID:
138       value[0] = screen->base.screen->get_name(screen->base.screen);
139       return 0;
140    default:
141       return -1;
142    }
143 }
144