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(struct dri_screen * screen,int param,unsigned int * value)79 dri_query_renderer_integer(struct dri_screen *screen, int param,
80 unsigned int *value)
81 {
82 switch (param) {
83 case __DRI2_RENDERER_VENDOR_ID:
84 value[0] =
85 (unsigned int)screen->base.screen->caps.vendor_id;
86 return 0;
87 case __DRI2_RENDERER_DEVICE_ID:
88 value[0] =
89 (unsigned int)screen->base.screen->caps.device_id;
90 return 0;
91 case __DRI2_RENDERER_ACCELERATED:
92 value[0] =
93 (unsigned int)!!screen->base.screen->caps.accelerated;
94 return 0;
95
96 case __DRI2_RENDERER_VIDEO_MEMORY: {
97 int ov = driQueryOptioni(&screen->dev->option_cache, "override_vram_size");
98 value[0] =
99 (unsigned int)screen->base.screen->caps.video_memory;
100 if (ov >= 0)
101 value[0] = MIN2(ov, value[0]);
102 return 0;
103 }
104
105 case __DRI2_RENDERER_UNIFIED_MEMORY_ARCHITECTURE:
106 value[0] =
107 (unsigned int)screen->base.screen->caps.uma;
108 return 0;
109
110 case __DRI2_RENDERER_PREFER_BACK_BUFFER_REUSE:
111 value[0] =
112 screen->base.screen->caps.prefer_back_buffer_reuse;
113 return 0;
114 default:
115 return driQueryRendererIntegerCommon(screen, param, value);
116 }
117 }
118
119 int
dri_query_renderer_string(struct dri_screen * screen,int param,const char ** value)120 dri_query_renderer_string(struct dri_screen *screen, int param,
121 const char **value)
122 {
123 switch (param) {
124 case __DRI2_RENDERER_VENDOR_ID:
125 value[0] = screen->base.screen->get_vendor(screen->base.screen);
126 return 0;
127 case __DRI2_RENDERER_DEVICE_ID:
128 value[0] = screen->base.screen->get_name(screen->base.screen);
129 return 0;
130 default:
131 return -1;
132 }
133 }
134