diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c index 8139e0d6750..5ea00ddc46a 100644 --- a/src/gallium/frontends/dri/dri2.c +++ b/src/gallium/frontends/dri/dri2.c @@ -2011,35 +2011,22 @@ dri2_create_drawable(struct dri_screen *screen, const struct gl_config *visual, * * Returns the struct gl_config supported by this driver. */ -const __DRIconfig ** +struct pipe_screen * dri2_init_screen(struct dri_screen *screen, bool driver_name_is_inferred) { - const __DRIconfig **configs; struct pipe_screen *pscreen = NULL; -#ifdef HAVE_LIBDRM - if (pipe_loader_drm_probe_fd(&screen->dev, screen->fd, false)) - pscreen = pipe_loader_create_screen(screen->dev, driver_name_is_inferred); -#endif - - if (!pscreen) - return NULL; - - configs = dri_init_screen(screen, pscreen); - if (!configs) - goto fail; - screen->can_share_buffer = true; screen->auto_fake_front = dri_with_format(screen); screen->create_drawable = dri2_create_drawable; - return configs; +#ifdef HAVE_LIBDRM + if (pipe_loader_drm_probe_fd(&screen->dev, screen->fd, false)) + pscreen = pipe_loader_create_screen(screen->dev, driver_name_is_inferred); +#endif -fail: - pipe_loader_release(&screen->dev, 1); - - return NULL; + return pscreen; } /** @@ -2047,36 +2034,20 @@ fail: * * Returns the struct gl_config supported by this driver. */ -const __DRIconfig ** +struct pipe_screen * dri_swrast_kms_init_screen(struct dri_screen *screen, bool driver_name_is_inferred) { -#if defined(HAVE_SWRAST) - const __DRIconfig **configs; struct pipe_screen *pscreen = NULL; - -#ifdef HAVE_DRISW_KMS - if (pipe_loader_sw_probe_kms(&screen->dev, screen->fd)) - pscreen = pipe_loader_create_screen(screen->dev, driver_name_is_inferred); -#endif - - if (!pscreen) - return NULL; - - configs = dri_init_screen(screen, pscreen); - if (!configs) - goto fail; - screen->can_share_buffer = false; screen->auto_fake_front = dri_with_format(screen); screen->create_drawable = dri2_create_drawable; - return configs; +#if defined(HAVE_DRISW_KMS) && defined(HAVE_SWRAST) + if (pipe_loader_sw_probe_kms(&screen->dev, screen->fd)) + pscreen = pipe_loader_create_screen(screen->dev, driver_name_is_inferred); +#endif -fail: - pipe_loader_release(&screen->dev, 1); - -#endif // HAVE_SWRAST - return NULL; + return pscreen; } int diff --git a/src/gallium/frontends/dri/dri_screen.h b/src/gallium/frontends/dri/dri_screen.h index 54048acd1f0..26ad0ca1baf 100644 --- a/src/gallium/frontends/dri/dri_screen.h +++ b/src/gallium/frontends/dri/dri_screen.h @@ -215,13 +215,13 @@ dri_release_screen(struct dri_screen * screen); void dri_destroy_screen(struct dri_screen *screen); -const __DRIconfig ** +struct pipe_screen * dri2_init_screen(struct dri_screen *screen, bool driver_name_is_inferred); -const __DRIconfig ** +struct pipe_screen * dri_swrast_kms_init_screen(struct dri_screen *screen, bool driver_name_is_inferred); -const __DRIconfig ** +struct pipe_screen * kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred); -const __DRIconfig ** +struct pipe_screen * drisw_init_screen(struct dri_screen *screen, bool driver_name_is_inferred); extern const struct __DriverAPIRec dri_swrast_kms_driver_api; diff --git a/src/gallium/frontends/dri/dri_util.c b/src/gallium/frontends/dri/dri_util.c index 6d32e44b32d..9dbe6794068 100644 --- a/src/gallium/frontends/dri/dri_util.c +++ b/src/gallium/frontends/dri/dri_util.c @@ -132,22 +132,28 @@ driCreateNewScreen3(int scrn, int fd, (void) mtx_init(&screen->opencl_func_mutex, mtx_plain); + struct pipe_screen *pscreen = NULL; switch (type) { case DRI_SCREEN_DRI3: - *driver_configs = dri2_init_screen(screen, driver_name_is_inferred); + pscreen = dri2_init_screen(screen, driver_name_is_inferred); break; case DRI_SCREEN_KOPPER: - *driver_configs = kopper_init_screen(screen, driver_name_is_inferred); + pscreen = kopper_init_screen(screen, driver_name_is_inferred); break; case DRI_SCREEN_SWRAST: - *driver_configs = drisw_init_screen(screen, driver_name_is_inferred); + pscreen = drisw_init_screen(screen, driver_name_is_inferred); break; case DRI_SCREEN_KMS_SWRAST: - *driver_configs = dri_swrast_kms_init_screen(screen, driver_name_is_inferred); + pscreen = dri_swrast_kms_init_screen(screen, driver_name_is_inferred); break; default: unreachable("unknown dri screen type"); } + if (pscreen == NULL) { + dri_destroy_screen(screen); + return NULL; + } + *driver_configs = dri_init_screen(screen, pscreen); if (*driver_configs == NULL) { dri_destroy_screen(screen); return NULL; diff --git a/src/gallium/frontends/dri/drisw.c b/src/gallium/frontends/dri/drisw.c index cafc512e089..04eff24c61b 100644 --- a/src/gallium/frontends/dri/drisw.c +++ b/src/gallium/frontends/dri/drisw.c @@ -622,11 +622,10 @@ drisw_create_drawable(struct dri_screen *screen, const struct gl_config * visual return drawable; } -const __DRIconfig ** +struct pipe_screen * drisw_init_screen(struct dri_screen *screen, bool driver_name_is_inferred) { const __DRIswrastLoaderExtension *loader = screen->swrast_loader; - const __DRIconfig **configs; struct pipe_screen *pscreen = NULL; const struct drisw_loader_funcs *lf = &drisw_lf; @@ -636,6 +635,7 @@ drisw_init_screen(struct dri_screen *screen, bool driver_name_is_inferred) if (loader->putImageShm) lf = &drisw_shm_lf; } + screen->create_drawable = drisw_create_drawable; bool success = false; #ifdef HAVE_DRISW_KMS @@ -648,19 +648,7 @@ drisw_init_screen(struct dri_screen *screen, bool driver_name_is_inferred) if (success) pscreen = pipe_loader_create_screen(screen->dev, driver_name_is_inferred); - if (!pscreen) - return NULL; - - configs = dri_init_screen(screen, pscreen); - if (!configs) - goto fail; - - screen->create_drawable = drisw_create_drawable; - - return configs; -fail: - pipe_loader_release(&screen->dev, 1); - return NULL; + return pscreen; } /* swrast copy sub buffer entrypoint. */ diff --git a/src/gallium/frontends/dri/kopper.c b/src/gallium/frontends/dri/kopper.c index 60f97a2d144..332ad766a6d 100644 --- a/src/gallium/frontends/dri/kopper.c +++ b/src/gallium/frontends/dri/kopper.c @@ -56,10 +56,9 @@ static struct dri_drawable * kopper_create_drawable(struct dri_screen *screen, const struct gl_config *visual, bool isPixmap, void *loaderPrivate); -const __DRIconfig ** +struct pipe_screen * kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred) { - const __DRIconfig **configs; struct pipe_screen *pscreen = NULL; if (!screen->kopper_loader) { @@ -70,6 +69,7 @@ kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred) } screen->can_share_buffer = true; + screen->create_drawable = kopper_create_drawable; bool success; #ifdef HAVE_LIBDRM @@ -87,19 +87,10 @@ kopper_init_screen(struct dri_screen *screen, bool driver_name_is_inferred) if (!pscreen) return NULL; - configs = dri_init_screen(screen, pscreen); - if (!configs) - goto fail; - assert(pscreen->get_param(pscreen, PIPE_CAP_DEVICE_RESET_STATUS_QUERY)); screen->is_sw = zink_kopper_is_cpu(pscreen); - screen->create_drawable = kopper_create_drawable; - - return configs; -fail: - pipe_loader_release(&screen->dev, 1); - return NULL; + return pscreen; } // copypasta alert