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