diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader.c b/src/gallium/auxiliary/pipe-loader/pipe_loader.c index ec8a0e0b28d..8ffb416b3a1 100644 --- a/src/gallium/auxiliary/pipe-loader/pipe_loader.c +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader.c @@ -169,11 +169,12 @@ pipe_loader_get_driinfo_xml(const char *driver_name) } struct pipe_screen * -pipe_loader_create_screen_vk(struct pipe_loader_device *dev, bool sw_vk) +pipe_loader_create_screen_vk(struct pipe_loader_device *dev, bool sw_vk, bool implicit) { struct pipe_screen_config config; pipe_loader_load_options(dev); + config.implicit_driver_load = implicit; config.options_info = &dev->option_info; config.options = &dev->option_cache; @@ -181,9 +182,9 @@ pipe_loader_create_screen_vk(struct pipe_loader_device *dev, bool sw_vk) } struct pipe_screen * -pipe_loader_create_screen(struct pipe_loader_device *dev) +pipe_loader_create_screen(struct pipe_loader_device *dev, bool implicit) { - return pipe_loader_create_screen_vk(dev, false); + return pipe_loader_create_screen_vk(dev, false, implicit); } struct util_dl_library * diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader.h b/src/gallium/auxiliary/pipe-loader/pipe_loader.h index 3ed6a75b6d2..70dc2e289e0 100644 --- a/src/gallium/auxiliary/pipe-loader/pipe_loader.h +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader.h @@ -88,17 +88,19 @@ pipe_loader_probe(struct pipe_loader_device **devs, int ndev, bool with_zink); * * \param dev Device the screen will be created for. * \param sw_vk Device is for software vulkan + * \param implicit Whether the driver is being loaded implicitly. */ struct pipe_screen * -pipe_loader_create_screen_vk(struct pipe_loader_device *dev, bool sw_vk); +pipe_loader_create_screen_vk(struct pipe_loader_device *dev, bool sw_vk, bool implicit); /** * Create a pipe_screen for the specified device. * * \param dev Device the screen will be created for. + * \param implicit Whether the driver is being loaded implicitly. */ struct pipe_screen * -pipe_loader_create_screen(struct pipe_loader_device *dev); +pipe_loader_create_screen(struct pipe_loader_device *dev, bool implicit); /** * Ensures that the driconf option cache has been parsed for the driver. diff --git a/src/gallium/auxiliary/vl/vl_winsys_dri.c b/src/gallium/auxiliary/vl/vl_winsys_dri.c index fb3bd089d1f..6e99c945a42 100644 --- a/src/gallium/auxiliary/vl/vl_winsys_dri.c +++ b/src/gallium/auxiliary/vl/vl_winsys_dri.c @@ -459,7 +459,7 @@ vl_dri2_screen_create(Display *display, int screen) goto free_authenticate; if (pipe_loader_drm_probe_fd(&scrn->base.dev, fd, false)) - scrn->base.pscreen = pipe_loader_create_screen(scrn->base.dev); + scrn->base.pscreen = pipe_loader_create_screen(scrn->base.dev, false); if (!scrn->base.pscreen) goto release_pipe; diff --git a/src/gallium/auxiliary/vl/vl_winsys_dri3.c b/src/gallium/auxiliary/vl/vl_winsys_dri3.c index 6d0f6bf03e0..97febbccbfe 100644 --- a/src/gallium/auxiliary/vl/vl_winsys_dri3.c +++ b/src/gallium/auxiliary/vl/vl_winsys_dri3.c @@ -843,7 +843,7 @@ vl_dri3_screen_create(Display *display, int screen) free(geom_reply); if (pipe_loader_drm_probe_fd(&scrn->base.dev, fd, false)) - scrn->base.pscreen = pipe_loader_create_screen(scrn->base.dev); + scrn->base.pscreen = pipe_loader_create_screen(scrn->base.dev, false); if (!scrn->base.pscreen) goto release_pipe; diff --git a/src/gallium/auxiliary/vl/vl_winsys_drm.c b/src/gallium/auxiliary/vl/vl_winsys_drm.c index a35c8072908..3e346d13abf 100644 --- a/src/gallium/auxiliary/vl/vl_winsys_drm.c +++ b/src/gallium/auxiliary/vl/vl_winsys_drm.c @@ -47,7 +47,7 @@ vl_drm_screen_create(int fd) return NULL; if (pipe_loader_drm_probe_fd(&vscreen->dev, fd, false)) - vscreen->pscreen = pipe_loader_create_screen(vscreen->dev); + vscreen->pscreen = pipe_loader_create_screen(vscreen->dev, false); if (!vscreen->pscreen) goto release_pipe; diff --git a/src/gallium/frontends/clover/core/device.cpp b/src/gallium/frontends/clover/core/device.cpp index 848c19b7660..acf417da388 100644 --- a/src/gallium/frontends/clover/core/device.cpp +++ b/src/gallium/frontends/clover/core/device.cpp @@ -163,7 +163,7 @@ namespace { device::device(clover::platform &platform, pipe_loader_device *ldev) : platform(platform), clc_cache(NULL), ldev(ldev) { - pipe = pipe_loader_create_screen(ldev); + pipe = pipe_loader_create_screen(ldev, false); if (pipe && pipe->get_param(pipe, PIPE_CAP_COMPUTE)) { const bool has_supported_ir = supports_ir(PIPE_SHADER_IR_NATIVE) || supports_ir(PIPE_SHADER_IR_NIR_SERIALIZED); diff --git a/src/gallium/frontends/dri/dri2.c b/src/gallium/frontends/dri/dri2.c index d18b15f2400..801ec908212 100644 --- a/src/gallium/frontends/dri/dri2.c +++ b/src/gallium/frontends/dri/dri2.c @@ -2341,7 +2341,7 @@ dri2_init_screen(struct dri_screen *screen, bool implicit) #ifdef HAVE_LIBDRM if (pipe_loader_drm_probe_fd(&screen->dev, screen->fd, false)) - pscreen = pipe_loader_create_screen(screen->dev); + pscreen = pipe_loader_create_screen(screen->dev, implicit); #endif if (!pscreen) @@ -2398,7 +2398,7 @@ dri_swrast_kms_init_screen(struct dri_screen *screen, bool implicit) #ifdef HAVE_DRISW_KMS if (pipe_loader_sw_probe_kms(&screen->dev, screen->fd)) - pscreen = pipe_loader_create_screen(screen->dev); + pscreen = pipe_loader_create_screen(screen->dev, implicit); #endif if (!pscreen) diff --git a/src/gallium/frontends/dri/drisw.c b/src/gallium/frontends/dri/drisw.c index 806a25d8f0b..3b138d7916d 100644 --- a/src/gallium/frontends/dri/drisw.c +++ b/src/gallium/frontends/dri/drisw.c @@ -598,7 +598,7 @@ drisw_init_screen(struct dri_screen *screen, bool implicit) success = pipe_loader_sw_probe_dri(&screen->dev, lf); if (success) - pscreen = pipe_loader_create_screen(screen->dev); + pscreen = pipe_loader_create_screen(screen->dev, implicit); if (!pscreen) goto fail; diff --git a/src/gallium/frontends/dri/kopper.c b/src/gallium/frontends/dri/kopper.c index c0615885db6..bc7fe59be26 100644 --- a/src/gallium/frontends/dri/kopper.c +++ b/src/gallium/frontends/dri/kopper.c @@ -136,7 +136,7 @@ kopper_init_screen(struct dri_screen *screen, bool implicit) #endif if (success) - pscreen = pipe_loader_create_screen(screen->dev); + pscreen = pipe_loader_create_screen(screen->dev, implicit); if (!pscreen) goto fail; diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index 897ff8605f7..df7286fcab5 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -1203,7 +1203,7 @@ lvp_physical_device_init(struct lvp_physical_device *device, } device->pld = pld; - device->pscreen = pipe_loader_create_screen_vk(device->pld, true); + device->pscreen = pipe_loader_create_screen_vk(device->pld, true, false); if (!device->pscreen) return vk_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY); for (unsigned i = 0; i < ARRAY_SIZE(device->drv_options); i++) diff --git a/src/gallium/frontends/rusticl/mesa/pipe/device.rs b/src/gallium/frontends/rusticl/mesa/pipe/device.rs index eecf5437c05..be471a00ec9 100644 --- a/src/gallium/frontends/rusticl/mesa/pipe/device.rs +++ b/src/gallium/frontends/rusticl/mesa/pipe/device.rs @@ -21,7 +21,7 @@ impl PipeLoaderDevice { } fn load_screen(self) -> Option { - let s = unsafe { pipe_loader_create_screen(self.ldev.as_ptr()) }; + let s = unsafe { pipe_loader_create_screen(self.ldev.as_ptr(), false) }; PipeScreen::new(self, s) } diff --git a/src/gallium/frontends/teflon/tfl_device.c b/src/gallium/frontends/teflon/tfl_device.c index 6d3a431c872..899a7121627 100644 --- a/src/gallium/frontends/teflon/tfl_device.c +++ b/src/gallium/frontends/teflon/tfl_device.c @@ -468,7 +468,7 @@ __attribute__((visibility("default"))) TfLiteDelegate *tflite_plugin_create_dele teflon_debug("Teflon delegate: loaded %s driver\n", delegate->dev->driver_name); - screen = pipe_loader_create_screen(delegate->dev); + screen = pipe_loader_create_screen(delegate->dev, false); delegate->context = screen->context_create(screen, NULL, PIPE_CONTEXT_COMPUTE_ONLY); return &delegate->base; diff --git a/src/gallium/frontends/xa/xa_tracker.c b/src/gallium/frontends/xa/xa_tracker.c index 7686a9b84b8..fd941b6a062 100644 --- a/src/gallium/frontends/xa/xa_tracker.c +++ b/src/gallium/frontends/xa/xa_tracker.c @@ -172,7 +172,7 @@ xa_tracker_create(int drm_fd) return NULL; if (pipe_loader_drm_probe_fd(&xa->dev, drm_fd, false)) - xa->screen = pipe_loader_create_screen(xa->dev); + xa->screen = pipe_loader_create_screen(xa->dev, false); if (!xa->screen) goto out_no_screen; diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h index 2d58ce058e5..b00d7cb3425 100644 --- a/src/gallium/include/pipe/p_screen.h +++ b/src/gallium/include/pipe/p_screen.h @@ -810,6 +810,7 @@ struct pipe_screen { * Global configuration options for screen creation. */ struct pipe_screen_config { + bool implicit_driver_load; struct driOptionCache *options; const struct driOptionCache *options_info; }; diff --git a/src/gallium/targets/d3dadapter9/drm.c b/src/gallium/targets/d3dadapter9/drm.c index 46882118b50..b5205dd5def 100644 --- a/src/gallium/targets/d3dadapter9/drm.c +++ b/src/gallium/targets/d3dadapter9/drm.c @@ -225,7 +225,7 @@ drm_create_adapter( int fd, return D3DERR_DRIVERINTERNALERROR; } - ctx->base.hal = pipe_loader_create_screen(ctx->dev); + ctx->base.hal = pipe_loader_create_screen(ctx->dev, false); if (!ctx->base.hal) { ERR("Unable to load requested driver.\n"); drm_destroy(&ctx->base); @@ -285,7 +285,7 @@ drm_create_adapter( int fd, sw_rendering |= debug_get_bool_option("D3D_ALWAYS_SOFTWARE", false); /* wrap it to create a software screen that can share resources */ if (sw_rendering && pipe_loader_sw_probe_wrapped(&ctx->swdev, ctx->base.hal)) - ctx->base.ref = pipe_loader_create_screen(ctx->swdev); + ctx->base.ref = pipe_loader_create_screen(ctx->swdev, false); else { /* Use the hardware for sw rendering */ ctx->swdev = ctx->dev; diff --git a/src/gallium/tests/trivial/quad-tex.c b/src/gallium/tests/trivial/quad-tex.c index 2b93cd23806..19bac09a108 100644 --- a/src/gallium/tests/trivial/quad-tex.c +++ b/src/gallium/tests/trivial/quad-tex.c @@ -97,7 +97,7 @@ static void init_prog(struct program *p) assert(ret); /* init a pipe screen */ - p->screen = pipe_loader_create_screen(p->dev); + p->screen = pipe_loader_create_screen(p->dev, false); assert(p->screen); /* create the pipe driver context and cso context */ diff --git a/src/gallium/tests/trivial/tri.c b/src/gallium/tests/trivial/tri.c index 4a3990d33e1..30015af26cc 100644 --- a/src/gallium/tests/trivial/tri.c +++ b/src/gallium/tests/trivial/tri.c @@ -91,7 +91,7 @@ static void init_prog(struct program *p) assert(ret); /* init a pipe screen */ - p->screen = pipe_loader_create_screen(p->dev); + p->screen = pipe_loader_create_screen(p->dev, false); assert(p->screen); /* create the pipe driver context and cso context */