}
if (dri->driver == NULL) {
- fprintf(stderr, "gbm: failed to open any driver (search paths %s)",
+ fprintf(stderr, "gbm: failed to open any driver (search paths %s)\n",
search_paths);
+ fprintf(stderr, "gbm: Last dlopen error: %s\n", dlerror());
return NULL;
}
}
static int
-dri_screen_create(struct gbm_dri_device *dri)
+dri_screen_create_dri2(struct gbm_dri_device *dri, 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;
return 0;
}
+static int
+dri_screen_create(struct gbm_dri_device *dri)
+{
+ 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)
+{
+ 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,
if (bo == NULL)
return NULL;
+ memset(&create_arg, 0, sizeof(create_arg));
create_arg.bpp = 32;
create_arg.width = width;
create_arg.height = height;
dri_use |= __DRI_IMAGE_USE_SCANOUT;
if (usage & GBM_BO_USE_CURSOR)
dri_use |= __DRI_IMAGE_USE_CURSOR;
+ if (usage & GBM_BO_USE_LINEAR)
+ dri_use |= __DRI_IMAGE_USE_LINEAR;
/* Gallium drivers requires shared in order to get the handle/stride */
dri_use |= __DRI_IMAGE_USE_SHARE;
dri_destroy(struct gbm_device *gbm)
{
struct gbm_dri_device *dri = gbm_dri_device(gbm);
+ unsigned i;
dri->core->destroyScreen(dri->screen);
+ for (i = 0; dri->driver_configs[i]; i++)
+ free((__DRIconfig *) dri->driver_configs[i]);
free(dri->driver_configs);
dlclose(dri->driver);
free(dri->base.driver_name);
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)