From 3b176c441b7ddc5f7d2f891da3f76cf3c1814ce1 Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Wed, 23 Jul 2014 19:37:31 +0100 Subject: gallium: Add a dumb drm/kms winsys backed swrast provider Add a new winsys and target that can be used with a dri2 state tracker and loader instead of drisw. This allows to use gbm as a dri2/image loader and avoid the extra copy from the backbuffer to the shadow frontbuffer. The new driver is called "kms_swrast", and is loaded by gbm as a fallback, because it is only useful with the gbm platform (as no buffer sharing is possible) To force select the driver set the environment variable GBM_ALWAYS_SOFTWARE [Emil Velikov] - Rebase on top of gallium megadriver. - s/text/test/ in configure.ac (Spotted by Andreas Pokorny). - Add scons support for winsys/sw/kms-dri and fix the build. - Provide separate DriverAPI, due to different InitScreen hook. Signed-off-by: Emil Velikov --- src/gbm/backends/dri/gbm_dri.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) (limited to 'src/gbm') diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index 7b28be1..258e8a8 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -403,12 +403,13 @@ dri_load_driver_swrast(struct gbm_dri_device *dri) } static int -dri_screen_create(struct gbm_dri_device *dri) +dri_screen_create_dri2(struct gbm_dri_device *dri, + const char *driver_name) { const __DRIextension **extensions; int ret = 0; - dri->base.driver_name = loader_get_driver_for_fd(dri->base.base.fd, 0); + dri->base.driver_name = driver_name; if (dri->base.driver_name == NULL) return -1; @@ -491,6 +492,35 @@ dri_screen_create_swrast(struct gbm_dri_device *dri) } static int +dri_screen_create(struct gbm_dri_device *dri) +{ + const char *driver_name; + + driver_name = loader_get_driver_for_fd(dri->base.base.fd, 0); + if (!driver_name) + return -1; + + return dri_screen_create_dri2(dri, driver_name); +} + +static int +dri_screen_create_sw(struct gbm_dri_device *dri) +{ + const char *driver_name; + int ret; + + driver_name = strdup("kms_swrast"); + if (!driver_name) + return -errno; + + ret = dri_screen_create_dri2(dri, driver_name); + if (ret == 0) + return ret; + + return dri_screen_create_swrast(dri); +} + +static int gbm_dri_is_format_supported(struct gbm_device *gbm, uint32_t format, uint32_t usage) @@ -920,9 +950,9 @@ dri_device_create(int fd) if (!force_sw) { ret = dri_screen_create(dri); if (ret) - ret = dri_screen_create_swrast(dri); + ret = dri_screen_create_sw(dri); } else { - ret = dri_screen_create_swrast(dri); + ret = dri_screen_create_sw(dri); } if (ret) -- cgit v1.1