• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef DRM_HELPER_H
2 #define DRM_HELPER_H
3 
4 #include <stdio.h>
5 #include "target-helpers/inline_debug_helper.h"
6 #include "target-helpers/drm_helper_public.h"
7 #include "frontend/drm_driver.h"
8 #include "util/driconf.h"
9 
10 /**
11  * Instantiate a drm_driver_descriptor struct.
12  */
13 #define DEFINE_DRM_DRIVER_DESCRIPTOR(descriptor_name, driver, _driconf, _driconf_count, func) \
14 const struct drm_driver_descriptor descriptor_name = {         \
15    .driver_name = #driver,                                     \
16    .driconf = _driconf,                                        \
17    .driconf_count = _driconf_count,                            \
18    .create_screen = func,                                      \
19 };
20 
21 /* The static pipe loader refers to the *_driver_descriptor structs for all
22  * drivers, regardless of whether they are configured in this Mesa build, or
23  * whether they're included in the specific gallium target.  The target (dri,
24  * vdpau, etc.) will include this header with the #defines for the specific
25  * drivers it's including, and the disabled drivers will have a descriptor
26  * with a stub create function logging the failure.
27  *
28  * The dynamic pipe loader instead has target/pipeloader/pipe_*.c including
29  * this header in a pipe_*.so for each driver which will have one driver's
30  * GALLIUM_* defined.  We make a single driver_descriptor entrypoint that is
31  * dlsym()ed by the dynamic pipe loader.
32  */
33 
34 #ifdef PIPE_LOADER_DYNAMIC
35 
36 #define DRM_DRIVER_DESCRIPTOR(driver, driconf, driconf_count)           \
37    PUBLIC DEFINE_DRM_DRIVER_DESCRIPTOR(driver_descriptor, driver, driconf, driconf_count, pipe_##driver##_create_screen)
38 
39 #define DRM_DRIVER_DESCRIPTOR_STUB(driver)
40 
41 #define DRM_DRIVER_DESCRIPTOR_ALIAS(driver, alias, driconf, driconf_count)
42 
43 #else
44 
45 #define DRM_DRIVER_DESCRIPTOR(driver, driconf, driconf_count)                          \
46    DEFINE_DRM_DRIVER_DESCRIPTOR(driver##_driver_descriptor, driver, driconf, driconf_count, pipe_##driver##_create_screen)
47 
48 #define DRM_DRIVER_DESCRIPTOR_STUB(driver)                              \
49    static struct pipe_screen *                                          \
50    pipe_##driver##_create_screen(int fd, const struct pipe_screen_config *config) \
51    {                                                                    \
52       fprintf(stderr, #driver ": driver missing\n");                    \
53       return NULL;                                                      \
54    }                                                                    \
55    DRM_DRIVER_DESCRIPTOR(driver, NULL, 0)
56 
57 #define DRM_DRIVER_DESCRIPTOR_ALIAS(driver, alias, driconf, driconf_count) \
58    DEFINE_DRM_DRIVER_DESCRIPTOR(alias##_driver_descriptor, alias, driconf, \
59                                 driconf_count, pipe_##driver##_create_screen)
60 
61 #endif
62 
63 #ifdef GALLIUM_KMSRO_ONLY
64 #undef GALLIUM_V3D
65 #undef GALLIUM_VC4
66 #undef GALLIUM_FREEDRENO
67 #undef GALLIUM_ETNAVIV
68 #undef GALLIUM_PANFROST
69 #undef GALLIUM_LIMA
70 #endif
71 
72 #ifdef GALLIUM_I915
73 #include "i915/drm/i915_drm_public.h"
74 #include "i915/i915_public.h"
75 
76 static struct pipe_screen *
pipe_i915_create_screen(int fd,const struct pipe_screen_config * config)77 pipe_i915_create_screen(int fd, const struct pipe_screen_config *config)
78 {
79    struct i915_winsys *iws;
80    struct pipe_screen *screen;
81 
82    iws = i915_drm_winsys_create(fd);
83    if (!iws)
84       return NULL;
85 
86    screen = i915_screen_create(iws);
87    return screen ? debug_screen_wrap(screen) : NULL;
88 }
89 DRM_DRIVER_DESCRIPTOR(i915, NULL, 0)
90 #else
91 DRM_DRIVER_DESCRIPTOR_STUB(i915)
92 #endif
93 
94 #ifdef GALLIUM_IRIS
95 #include "iris/drm/iris_drm_public.h"
96 
97 static struct pipe_screen *
pipe_iris_create_screen(int fd,const struct pipe_screen_config * config)98 pipe_iris_create_screen(int fd, const struct pipe_screen_config *config)
99 {
100    struct pipe_screen *screen;
101 
102    screen = iris_drm_screen_create(fd, config);
103    return screen ? debug_screen_wrap(screen) : NULL;
104 }
105 
106 const driOptionDescription iris_driconf[] = {
107       #include "iris/driinfo_iris.h"
108 };
DRM_DRIVER_DESCRIPTOR(iris,iris_driconf,ARRAY_SIZE (iris_driconf))109 DRM_DRIVER_DESCRIPTOR(iris, iris_driconf, ARRAY_SIZE(iris_driconf))
110 
111 #else
112 DRM_DRIVER_DESCRIPTOR_STUB(iris)
113 #endif
114 
115 #ifdef GALLIUM_CROCUS
116 #include "crocus/drm/crocus_drm_public.h"
117 
118 static struct pipe_screen *
119 pipe_crocus_create_screen(int fd, const struct pipe_screen_config *config)
120 {
121    struct pipe_screen *screen;
122 
123    screen = crocus_drm_screen_create(fd, config);
124    return screen ? debug_screen_wrap(screen) : NULL;
125 }
126 
127 const driOptionDescription crocus_driconf[] = {
128       #include "crocus/driinfo_crocus.h"
129 };
DRM_DRIVER_DESCRIPTOR(crocus,crocus_driconf,ARRAY_SIZE (crocus_driconf))130 DRM_DRIVER_DESCRIPTOR(crocus, crocus_driconf, ARRAY_SIZE(crocus_driconf))
131 #else
132 DRM_DRIVER_DESCRIPTOR_STUB(crocus)
133 #endif
134 
135 #ifdef GALLIUM_NOUVEAU
136 #include "nouveau/drm/nouveau_drm_public.h"
137 
138 static struct pipe_screen *
139 pipe_nouveau_create_screen(int fd, const struct pipe_screen_config *config)
140 {
141    struct pipe_screen *screen;
142 
143    screen = nouveau_drm_screen_create(fd);
144    return screen ? debug_screen_wrap(screen) : NULL;
145 }
146 DRM_DRIVER_DESCRIPTOR(nouveau, NULL, 0)
147 
148 #else
149 DRM_DRIVER_DESCRIPTOR_STUB(nouveau)
150 #endif
151 
152 #if defined(GALLIUM_VC4) || defined(GALLIUM_V3D)
153 const driOptionDescription v3d_driconf[] = {
154       #include "v3d/driinfo_v3d.h"
155 };
156 #endif
157 
158 #ifdef GALLIUM_KMSRO
159 #include "kmsro/drm/kmsro_drm_public.h"
160 
161 static struct pipe_screen *
pipe_kmsro_create_screen(int fd,const struct pipe_screen_config * config)162 pipe_kmsro_create_screen(int fd, const struct pipe_screen_config *config)
163 {
164    struct pipe_screen *screen;
165 
166    screen = kmsro_drm_screen_create(fd, config);
167    return screen ? debug_screen_wrap(screen) : NULL;
168 }
169 #if defined(GALLIUM_VC4) || defined(GALLIUM_V3D)
DRM_DRIVER_DESCRIPTOR(kmsro,v3d_driconf,ARRAY_SIZE (v3d_driconf))170 DRM_DRIVER_DESCRIPTOR(kmsro, v3d_driconf, ARRAY_SIZE(v3d_driconf))
171 #else
172 DRM_DRIVER_DESCRIPTOR(kmsro, NULL, 0)
173 #endif
174 
175 #else
176 DRM_DRIVER_DESCRIPTOR_STUB(kmsro)
177 #endif
178 
179 #ifdef GALLIUM_R300
180 #include "winsys/radeon_winsys.h"
181 #include "r300/r300_public.h"
182 
183 static struct pipe_screen *
184 pipe_r300_create_screen(int fd, const struct pipe_screen_config *config)
185 {
186    struct radeon_winsys *rw;
187 
188    rw = radeon_drm_winsys_create(fd, config, r300_screen_create);
189    return rw ? debug_screen_wrap(rw->screen) : NULL;
190 }
191 DRM_DRIVER_DESCRIPTOR(r300, NULL, 0)
192 
193 #else
194 DRM_DRIVER_DESCRIPTOR_STUB(r300)
195 #endif
196 
197 #ifdef GALLIUM_R600
198 #include "winsys/radeon_winsys.h"
199 #include "r600/r600_public.h"
200 
201 static struct pipe_screen *
pipe_r600_create_screen(int fd,const struct pipe_screen_config * config)202 pipe_r600_create_screen(int fd, const struct pipe_screen_config *config)
203 {
204    struct radeon_winsys *rw;
205 
206    rw = radeon_drm_winsys_create(fd, config, r600_screen_create);
207    return rw ? debug_screen_wrap(rw->screen) : NULL;
208 }
209 DRM_DRIVER_DESCRIPTOR(r600, NULL, 0)
210 
211 #else
212 DRM_DRIVER_DESCRIPTOR_STUB(r600)
213 #endif
214 
215 #ifdef GALLIUM_RADEONSI
216 #include "radeonsi/si_public.h"
217 
218 static struct pipe_screen *
pipe_radeonsi_create_screen(int fd,const struct pipe_screen_config * config)219 pipe_radeonsi_create_screen(int fd, const struct pipe_screen_config *config)
220 {
221    struct pipe_screen *screen = radeonsi_screen_create(fd, config);
222 
223    return screen ? debug_screen_wrap(screen) : NULL;
224 }
225 
226 const driOptionDescription radeonsi_driconf[] = {
227       #include "radeonsi/driinfo_radeonsi.h"
228 };
DRM_DRIVER_DESCRIPTOR(radeonsi,radeonsi_driconf,ARRAY_SIZE (radeonsi_driconf))229 DRM_DRIVER_DESCRIPTOR(radeonsi, radeonsi_driconf, ARRAY_SIZE(radeonsi_driconf))
230 
231 #else
232 DRM_DRIVER_DESCRIPTOR_STUB(radeonsi)
233 #endif
234 
235 #ifdef GALLIUM_VMWGFX
236 #include "svga/drm/svga_drm_public.h"
237 #include "svga/svga_public.h"
238 
239 static struct pipe_screen *
240 pipe_vmwgfx_create_screen(int fd, const struct pipe_screen_config *config)
241 {
242    struct svga_winsys_screen *sws;
243    struct pipe_screen *screen;
244 
245    sws = svga_drm_winsys_screen_create(fd);
246    if (!sws)
247       return NULL;
248 
249    screen = svga_screen_create(sws);
250    return screen ? debug_screen_wrap(screen) : NULL;
251 }
252 DRM_DRIVER_DESCRIPTOR(vmwgfx, NULL, 0)
253 
254 #else
255 DRM_DRIVER_DESCRIPTOR_STUB(vmwgfx)
256 #endif
257 
258 #ifdef GALLIUM_FREEDRENO
259 #include "freedreno/drm/freedreno_drm_public.h"
260 
261 static struct pipe_screen *
pipe_msm_create_screen(int fd,const struct pipe_screen_config * config)262 pipe_msm_create_screen(int fd, const struct pipe_screen_config *config)
263 {
264    struct pipe_screen *screen;
265 
266    screen = fd_drm_screen_create(fd, NULL, config);
267    return screen ? debug_screen_wrap(screen) : NULL;
268 }
269 DRM_DRIVER_DESCRIPTOR(msm, NULL, 0)
270 #else
271 DRM_DRIVER_DESCRIPTOR_STUB(msm)
272 #endif
273 DRM_DRIVER_DESCRIPTOR_ALIAS(msm, kgsl, NULL, 0)
274 
275 #if defined(GALLIUM_VIRGL) || (defined(GALLIUM_FREEDRENO) && !defined(PIPE_LOADER_DYNAMIC))
276 #include "virgl/drm/virgl_drm_public.h"
277 #include "virgl/virgl_public.h"
278 
279 static struct pipe_screen *
pipe_virtio_gpu_create_screen(int fd,const struct pipe_screen_config * config)280 pipe_virtio_gpu_create_screen(int fd, const struct pipe_screen_config *config)
281 {
282    struct pipe_screen *screen = NULL;
283 
284    /* Try native guest driver(s) first, and then fallback to virgl: */
285 #ifdef GALLIUM_FREEDRENO
286    if (!screen)
287       screen = fd_drm_screen_create(fd, NULL, config);
288 #endif
289 #ifdef GALLIUM_VIRGL
290    if (!screen)
291       screen = virgl_drm_screen_create(fd, config);
292 #endif
293    return screen ? debug_screen_wrap(screen) : NULL;
294 }
295 
296 const driOptionDescription virgl_driconf[] = {
297 #ifdef GALLIUM_VIRGL
298       #include "virgl/virgl_driinfo.h.in"
299 #endif
300 };
DRM_DRIVER_DESCRIPTOR(virtio_gpu,virgl_driconf,ARRAY_SIZE (virgl_driconf))301 DRM_DRIVER_DESCRIPTOR(virtio_gpu, virgl_driconf, ARRAY_SIZE(virgl_driconf))
302 
303 #else
304 DRM_DRIVER_DESCRIPTOR_STUB(virtio_gpu)
305 #endif
306 
307 #ifdef GALLIUM_VC4
308 #include "vc4/drm/vc4_drm_public.h"
309 
310 static struct pipe_screen *
311 pipe_vc4_create_screen(int fd, const struct pipe_screen_config *config)
312 {
313    struct pipe_screen *screen;
314 
315    screen = vc4_drm_screen_create(fd, config);
316    return screen ? debug_screen_wrap(screen) : NULL;
317 }
DRM_DRIVER_DESCRIPTOR(vc4,v3d_driconf,ARRAY_SIZE (v3d_driconf))318 DRM_DRIVER_DESCRIPTOR(vc4, v3d_driconf, ARRAY_SIZE(v3d_driconf))
319 #else
320 DRM_DRIVER_DESCRIPTOR_STUB(vc4)
321 #endif
322 
323 #ifdef GALLIUM_V3D
324 #include "v3d/drm/v3d_drm_public.h"
325 
326 static struct pipe_screen *
327 pipe_v3d_create_screen(int fd, const struct pipe_screen_config *config)
328 {
329    struct pipe_screen *screen;
330 
331    screen = v3d_drm_screen_create(fd, config);
332    return screen ? debug_screen_wrap(screen) : NULL;
333 }
334 
DRM_DRIVER_DESCRIPTOR(v3d,v3d_driconf,ARRAY_SIZE (v3d_driconf))335 DRM_DRIVER_DESCRIPTOR(v3d, v3d_driconf, ARRAY_SIZE(v3d_driconf))
336 
337 #else
338 DRM_DRIVER_DESCRIPTOR_STUB(v3d)
339 #endif
340 
341 #ifdef GALLIUM_PANFROST
342 #include "panfrost/drm/panfrost_drm_public.h"
343 
344 static struct pipe_screen *
345 pipe_panfrost_create_screen(int fd, const struct pipe_screen_config *config)
346 {
347    struct pipe_screen *screen;
348 
349    screen = panfrost_drm_screen_create(fd);
350    return screen ? debug_screen_wrap(screen) : NULL;
351 }
352 DRM_DRIVER_DESCRIPTOR(panfrost, NULL, 0)
353 
354 #else
355 DRM_DRIVER_DESCRIPTOR_STUB(panfrost)
356 #endif
357 
358 #ifdef GALLIUM_ETNAVIV
359 #include "etnaviv/drm/etnaviv_drm_public.h"
360 
361 static struct pipe_screen *
pipe_etnaviv_create_screen(int fd,const struct pipe_screen_config * config)362 pipe_etnaviv_create_screen(int fd, const struct pipe_screen_config *config)
363 {
364    struct pipe_screen *screen;
365 
366    screen = etna_drm_screen_create(fd);
367    return screen ? debug_screen_wrap(screen) : NULL;
368 }
369 DRM_DRIVER_DESCRIPTOR(etnaviv, NULL, 0)
370 
371 #else
372 DRM_DRIVER_DESCRIPTOR_STUB(etnaviv)
373 #endif
374 
375 #ifdef GALLIUM_TEGRA
376 #include "tegra/drm/tegra_drm_public.h"
377 
378 static struct pipe_screen *
pipe_tegra_create_screen(int fd,const struct pipe_screen_config * config)379 pipe_tegra_create_screen(int fd, const struct pipe_screen_config *config)
380 {
381    struct pipe_screen *screen;
382 
383    screen = tegra_drm_screen_create(fd);
384 
385    return screen ? debug_screen_wrap(screen) : NULL;
386 }
387 DRM_DRIVER_DESCRIPTOR(tegra, NULL, 0)
388 
389 #else
390 DRM_DRIVER_DESCRIPTOR_STUB(tegra)
391 #endif
392 
393 #ifdef GALLIUM_LIMA
394 #include "lima/drm/lima_drm_public.h"
395 
396 static struct pipe_screen *
pipe_lima_create_screen(int fd,const struct pipe_screen_config * config)397 pipe_lima_create_screen(int fd, const struct pipe_screen_config *config)
398 {
399    struct pipe_screen *screen;
400 
401    screen = lima_drm_screen_create(fd);
402    return screen ? debug_screen_wrap(screen) : NULL;
403 }
404 DRM_DRIVER_DESCRIPTOR(lima, NULL, 0)
405 
406 #else
407 DRM_DRIVER_DESCRIPTOR_STUB(lima)
408 #endif
409 
410 #ifdef GALLIUM_ZINK
411 #include "zink/zink_public.h"
412 
413 static struct pipe_screen *
pipe_zink_create_screen(int fd,const struct pipe_screen_config * config)414 pipe_zink_create_screen(int fd, const struct pipe_screen_config *config)
415 {
416    struct pipe_screen *screen;
417    screen = zink_drm_create_screen(fd, config);
418    return screen ? debug_screen_wrap(screen) : NULL;
419 }
420 
421 const driOptionDescription zink_driconf[] = {
422       #include "zink/driinfo_zink.h"
423 };
424 DRM_DRIVER_DESCRIPTOR(zink, zink_driconf, ARRAY_SIZE(zink_driconf))
425 
426 #else
427 DRM_DRIVER_DESCRIPTOR_STUB(zink)
428 #endif
429 
430 #endif /* DRM_HELPER_H */
431