#ifndef DRM_HELPER_H #define DRM_HELPER_H #include #include "target-helpers/inline_debug_helper.h" #include "target-helpers/drm_helper_public.h" #include "frontend/drm_driver.h" #include "util/driconf.h" /** * Instantiate a drm_driver_descriptor struct. */ #define DEFINE_DRM_DRIVER_DESCRIPTOR(descriptor_name, driver, _driconf, _driconf_count, func) \ const struct drm_driver_descriptor descriptor_name = { \ .driver_name = #driver, \ .driconf = _driconf, \ .driconf_count = _driconf_count, \ .create_screen = func, \ }; /* The static pipe loader refers to the *_driver_descriptor structs for all * drivers, regardless of whether they are configured in this Mesa build, or * whether they're included in the specific gallium target. The target (dri, * vdpau, etc.) will include this header with the #defines for the specific * drivers it's including, and the disabled drivers will have a descriptor * with a stub create function logging the failure. * * The dynamic pipe loader instead has target/pipeloader/pipe_*.c including * this header in a pipe_*.so for each driver which will have one driver's * GALLIUM_* defined. We make a single driver_descriptor entrypoint that is * dlsym()ed by the dynamic pipe loader. */ #ifdef PIPE_LOADER_DYNAMIC #define DRM_DRIVER_DESCRIPTOR(driver, driconf, driconf_count) \ PUBLIC DEFINE_DRM_DRIVER_DESCRIPTOR(driver_descriptor, driver, driconf, driconf_count, pipe_##driver##_create_screen) #define DRM_DRIVER_DESCRIPTOR_STUB(driver) #define DRM_DRIVER_DESCRIPTOR_ALIAS(driver, alias, driconf, driconf_count) #else #define DRM_DRIVER_DESCRIPTOR(driver, driconf, driconf_count) \ DEFINE_DRM_DRIVER_DESCRIPTOR(driver##_driver_descriptor, driver, driconf, driconf_count, pipe_##driver##_create_screen) #define DRM_DRIVER_DESCRIPTOR_STUB(driver) \ static struct pipe_screen * \ pipe_##driver##_create_screen(int fd, const struct pipe_screen_config *config) \ { \ fprintf(stderr, #driver ": driver missing\n"); \ return NULL; \ } \ DRM_DRIVER_DESCRIPTOR(driver, NULL, 0) #define DRM_DRIVER_DESCRIPTOR_ALIAS(driver, alias, driconf, driconf_count) \ DEFINE_DRM_DRIVER_DESCRIPTOR(alias##_driver_descriptor, alias, driconf, \ driconf_count, pipe_##driver##_create_screen) #endif #ifdef GALLIUM_KMSRO_ONLY #undef GALLIUM_V3D #undef GALLIUM_VC4 #undef GALLIUM_FREEDRENO #undef GALLIUM_ETNAVIV #undef GALLIUM_PANFROST #undef GALLIUM_LIMA #endif #ifdef GALLIUM_I915 #include "i915/drm/i915_drm_public.h" #include "i915/i915_public.h" static struct pipe_screen * pipe_i915_create_screen(int fd, const struct pipe_screen_config *config) { struct i915_winsys *iws; struct pipe_screen *screen; iws = i915_drm_winsys_create(fd); if (!iws) return NULL; screen = i915_screen_create(iws); return screen ? debug_screen_wrap(screen) : NULL; } DRM_DRIVER_DESCRIPTOR(i915, NULL, 0) #else DRM_DRIVER_DESCRIPTOR_STUB(i915) #endif #ifdef GALLIUM_IRIS #include "iris/drm/iris_drm_public.h" static struct pipe_screen * pipe_iris_create_screen(int fd, const struct pipe_screen_config *config) { struct pipe_screen *screen; screen = iris_drm_screen_create(fd, config); return screen ? debug_screen_wrap(screen) : NULL; } const driOptionDescription iris_driconf[] = { #include "iris/driinfo_iris.h" }; DRM_DRIVER_DESCRIPTOR(iris, iris_driconf, ARRAY_SIZE(iris_driconf)) #else DRM_DRIVER_DESCRIPTOR_STUB(iris) #endif #ifdef GALLIUM_CROCUS #include "crocus/drm/crocus_drm_public.h" static struct pipe_screen * pipe_crocus_create_screen(int fd, const struct pipe_screen_config *config) { struct pipe_screen *screen; screen = crocus_drm_screen_create(fd, config); return screen ? debug_screen_wrap(screen) : NULL; } const driOptionDescription crocus_driconf[] = { #include "crocus/driinfo_crocus.h" }; DRM_DRIVER_DESCRIPTOR(crocus, crocus_driconf, ARRAY_SIZE(crocus_driconf)) #else DRM_DRIVER_DESCRIPTOR_STUB(crocus) #endif #ifdef GALLIUM_NOUVEAU #include "nouveau/drm/nouveau_drm_public.h" static struct pipe_screen * pipe_nouveau_create_screen(int fd, const struct pipe_screen_config *config) { struct pipe_screen *screen; screen = nouveau_drm_screen_create(fd); return screen ? debug_screen_wrap(screen) : NULL; } DRM_DRIVER_DESCRIPTOR(nouveau, NULL, 0) #else DRM_DRIVER_DESCRIPTOR_STUB(nouveau) #endif #if defined(GALLIUM_VC4) || defined(GALLIUM_V3D) const driOptionDescription v3d_driconf[] = { #include "v3d/driinfo_v3d.h" }; #endif #ifdef GALLIUM_KMSRO #include "kmsro/drm/kmsro_drm_public.h" static struct pipe_screen * pipe_kmsro_create_screen(int fd, const struct pipe_screen_config *config) { struct pipe_screen *screen; screen = kmsro_drm_screen_create(fd, config); return screen ? debug_screen_wrap(screen) : NULL; } #if defined(GALLIUM_VC4) || defined(GALLIUM_V3D) DRM_DRIVER_DESCRIPTOR(kmsro, v3d_driconf, ARRAY_SIZE(v3d_driconf)) #else DRM_DRIVER_DESCRIPTOR(kmsro, NULL, 0) #endif #else DRM_DRIVER_DESCRIPTOR_STUB(kmsro) #endif #ifdef GALLIUM_R300 #include "radeon/radeon_winsys.h" #include "radeon/drm/radeon_drm_public.h" #include "r300/r300_public.h" static struct pipe_screen * pipe_r300_create_screen(int fd, const struct pipe_screen_config *config) { struct radeon_winsys *rw; rw = radeon_drm_winsys_create(fd, config, r300_screen_create); return rw ? debug_screen_wrap(rw->screen) : NULL; } DRM_DRIVER_DESCRIPTOR(r300, NULL, 0) #else DRM_DRIVER_DESCRIPTOR_STUB(r300) #endif #ifdef GALLIUM_R600 #include "radeon/radeon_winsys.h" #include "radeon/drm/radeon_drm_public.h" #include "r600/r600_public.h" static struct pipe_screen * pipe_r600_create_screen(int fd, const struct pipe_screen_config *config) { struct radeon_winsys *rw; rw = radeon_drm_winsys_create(fd, config, r600_screen_create); return rw ? debug_screen_wrap(rw->screen) : NULL; } DRM_DRIVER_DESCRIPTOR(r600, NULL, 0) #else DRM_DRIVER_DESCRIPTOR_STUB(r600) #endif #ifdef GALLIUM_RADEONSI #include "radeonsi/si_public.h" static struct pipe_screen * pipe_radeonsi_create_screen(int fd, const struct pipe_screen_config *config) { struct pipe_screen *screen = radeonsi_screen_create(fd, config); return screen ? debug_screen_wrap(screen) : NULL; } const driOptionDescription radeonsi_driconf[] = { #include "radeonsi/driinfo_radeonsi.h" }; DRM_DRIVER_DESCRIPTOR(radeonsi, radeonsi_driconf, ARRAY_SIZE(radeonsi_driconf)) #else DRM_DRIVER_DESCRIPTOR_STUB(radeonsi) #endif #ifdef GALLIUM_VMWGFX #include "svga/drm/svga_drm_public.h" #include "svga/svga_public.h" static struct pipe_screen * pipe_vmwgfx_create_screen(int fd, const struct pipe_screen_config *config) { struct svga_winsys_screen *sws; struct pipe_screen *screen; sws = svga_drm_winsys_screen_create(fd); if (!sws) return NULL; screen = svga_screen_create(sws); return screen ? debug_screen_wrap(screen) : NULL; } DRM_DRIVER_DESCRIPTOR(vmwgfx, NULL, 0) #else DRM_DRIVER_DESCRIPTOR_STUB(vmwgfx) #endif #ifdef GALLIUM_FREEDRENO #include "freedreno/drm/freedreno_drm_public.h" static struct pipe_screen * pipe_msm_create_screen(int fd, const struct pipe_screen_config *config) { struct pipe_screen *screen; screen = fd_drm_screen_create(fd, NULL); return screen ? debug_screen_wrap(screen) : NULL; } DRM_DRIVER_DESCRIPTOR(msm, NULL, 0) #else DRM_DRIVER_DESCRIPTOR_STUB(msm) #endif DRM_DRIVER_DESCRIPTOR_ALIAS(msm, kgsl, NULL, 0) #ifdef GALLIUM_VIRGL #include "virgl/drm/virgl_drm_public.h" #include "virgl/virgl_public.h" static struct pipe_screen * pipe_virtio_gpu_create_screen(int fd, const struct pipe_screen_config *config) { struct pipe_screen *screen; screen = virgl_drm_screen_create(fd, config); return screen ? debug_screen_wrap(screen) : NULL; } const driOptionDescription virgl_driconf[] = { #include "virgl/virgl_driinfo.h.in" }; DRM_DRIVER_DESCRIPTOR(virtio_gpu, virgl_driconf, ARRAY_SIZE(virgl_driconf)) #else DRM_DRIVER_DESCRIPTOR_STUB(virtio_gpu) #endif #ifdef GALLIUM_VC4 #include "vc4/drm/vc4_drm_public.h" static struct pipe_screen * pipe_vc4_create_screen(int fd, const struct pipe_screen_config *config) { struct pipe_screen *screen; screen = vc4_drm_screen_create(fd, config); return screen ? debug_screen_wrap(screen) : NULL; } DRM_DRIVER_DESCRIPTOR(vc4, v3d_driconf, ARRAY_SIZE(v3d_driconf)) #else DRM_DRIVER_DESCRIPTOR_STUB(vc4) #endif #ifdef GALLIUM_V3D #include "v3d/drm/v3d_drm_public.h" static struct pipe_screen * pipe_v3d_create_screen(int fd, const struct pipe_screen_config *config) { struct pipe_screen *screen; screen = v3d_drm_screen_create(fd, config); return screen ? debug_screen_wrap(screen) : NULL; } DRM_DRIVER_DESCRIPTOR(v3d, v3d_driconf, ARRAY_SIZE(v3d_driconf)) #else DRM_DRIVER_DESCRIPTOR_STUB(v3d) #endif #ifdef GALLIUM_PANFROST #include "panfrost/drm/panfrost_drm_public.h" static struct pipe_screen * pipe_panfrost_create_screen(int fd, const struct pipe_screen_config *config) { struct pipe_screen *screen; screen = panfrost_drm_screen_create(fd); return screen ? debug_screen_wrap(screen) : NULL; } DRM_DRIVER_DESCRIPTOR(panfrost, NULL, 0) #else DRM_DRIVER_DESCRIPTOR_STUB(panfrost) #endif #ifdef GALLIUM_ETNAVIV #include "etnaviv/drm/etnaviv_drm_public.h" static struct pipe_screen * pipe_etnaviv_create_screen(int fd, const struct pipe_screen_config *config) { struct pipe_screen *screen; screen = etna_drm_screen_create(fd); return screen ? debug_screen_wrap(screen) : NULL; } DRM_DRIVER_DESCRIPTOR(etnaviv, NULL, 0) #else DRM_DRIVER_DESCRIPTOR_STUB(etnaviv) #endif #ifdef GALLIUM_TEGRA #include "tegra/drm/tegra_drm_public.h" static struct pipe_screen * pipe_tegra_create_screen(int fd, const struct pipe_screen_config *config) { struct pipe_screen *screen; screen = tegra_drm_screen_create(fd); return screen ? debug_screen_wrap(screen) : NULL; } DRM_DRIVER_DESCRIPTOR(tegra, NULL, 0) #else DRM_DRIVER_DESCRIPTOR_STUB(tegra) #endif #ifdef GALLIUM_LIMA #include "lima/drm/lima_drm_public.h" static struct pipe_screen * pipe_lima_create_screen(int fd, const struct pipe_screen_config *config) { struct pipe_screen *screen; screen = lima_drm_screen_create(fd); return screen ? debug_screen_wrap(screen) : NULL; } DRM_DRIVER_DESCRIPTOR(lima, NULL, 0) #else DRM_DRIVER_DESCRIPTOR_STUB(lima) #endif #ifdef GALLIUM_ZINK #include "zink/zink_public.h" static struct pipe_screen * pipe_zink_create_screen(int fd, const struct pipe_screen_config *config) { struct pipe_screen *screen; screen = zink_drm_create_screen(fd, config); return screen ? debug_screen_wrap(screen) : NULL; } const driOptionDescription zink_driconf[] = { #include "zink/driinfo_zink.h" }; DRM_DRIVER_DESCRIPTOR(zink, zink_driconf, ARRAY_SIZE(zink_driconf)) #else DRM_DRIVER_DESCRIPTOR_STUB(zink) #endif #endif /* DRM_HELPER_H */