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