pipe-loader: remove config from pipe_loader_create_screen

The config passed into the screen should be independent from the state
tracker, because at least in the case of radeonsi, the screen structure
can be shared between different state trackers.

Incidentally, this also fixes crashes that were recently introduced.

Fixes: a35a9e7c ("gallium: add driconf options to pipe_screen_config")
Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Nicolai Hähnle
2017-08-03 15:02:09 +02:00
parent 9fb8476e67
commit ae7283dcbc
13 changed files with 20 additions and 27 deletions

View File

@@ -123,13 +123,14 @@ pipe_loader_get_driinfo_xml(const char *driver_name)
} }
struct pipe_screen * struct pipe_screen *
pipe_loader_create_screen(struct pipe_loader_device *dev, pipe_loader_create_screen(struct pipe_loader_device *dev)
struct pipe_screen_config *config)
{ {
pipe_loader_load_options(dev); struct pipe_screen_config config;
config->options = &dev->option_cache;
return dev->ops->create_screen(dev, config); pipe_loader_load_options(dev);
config.options = &dev->option_cache;
return dev->ops->create_screen(dev, &config);
} }
struct util_dl_library * struct util_dl_library *

View File

@@ -86,12 +86,9 @@ pipe_loader_probe(struct pipe_loader_device **devs, int ndev);
* Create a pipe_screen for the specified device. * Create a pipe_screen for the specified device.
* *
* \param dev Device the screen will be created for. * \param dev Device the screen will be created for.
* \param config Configuration options. The lifetime of this structure and its
* elements may be limited to the duration of this call.
*/ */
struct pipe_screen * struct pipe_screen *
pipe_loader_create_screen(struct pipe_loader_device *dev, pipe_loader_create_screen(struct pipe_loader_device *dev);
struct pipe_screen_config *config);
/** /**
* Query the configuration parameters for the specified device. * Query the configuration parameters for the specified device.

View File

@@ -406,7 +406,7 @@ vl_dri2_screen_create(Display *display, int screen)
goto free_authenticate; goto free_authenticate;
if (pipe_loader_drm_probe_fd(&scrn->base.dev, fd)) if (pipe_loader_drm_probe_fd(&scrn->base.dev, fd))
scrn->base.pscreen = pipe_loader_create_screen(scrn->base.dev, NULL); scrn->base.pscreen = pipe_loader_create_screen(scrn->base.dev);
if (!scrn->base.pscreen) if (!scrn->base.pscreen)
goto release_pipe; goto release_pipe;

View File

@@ -817,7 +817,7 @@ vl_dri3_screen_create(Display *display, int screen)
free(geom_reply); free(geom_reply);
if (pipe_loader_drm_probe_fd(&scrn->base.dev, fd)) if (pipe_loader_drm_probe_fd(&scrn->base.dev, fd))
scrn->base.pscreen = pipe_loader_create_screen(scrn->base.dev, NULL); scrn->base.pscreen = pipe_loader_create_screen(scrn->base.dev);
if (!scrn->base.pscreen) if (!scrn->base.pscreen)
goto release_pipe; goto release_pipe;

View File

@@ -52,7 +52,7 @@ vl_drm_screen_create(int fd)
goto free_screen; goto free_screen;
if (pipe_loader_drm_probe_fd(&vscreen->dev, new_fd)) if (pipe_loader_drm_probe_fd(&vscreen->dev, new_fd))
vscreen->pscreen = pipe_loader_create_screen(vscreen->dev, NULL); vscreen->pscreen = pipe_loader_create_screen(vscreen->dev);
if (!vscreen->pscreen) if (!vscreen->pscreen)
goto release_pipe; goto release_pipe;

View File

@@ -42,7 +42,7 @@ namespace {
device::device(clover::platform &platform, pipe_loader_device *ldev) : device::device(clover::platform &platform, pipe_loader_device *ldev) :
platform(platform), ldev(ldev) { platform(platform), ldev(ldev) {
pipe = pipe_loader_create_screen(ldev, NULL); pipe = pipe_loader_create_screen(ldev);
if (!pipe || !pipe->get_param(pipe, PIPE_CAP_COMPUTE)) { if (!pipe || !pipe->get_param(pipe, PIPE_CAP_COMPUTE)) {
if (pipe) if (pipe)
pipe->destroy(pipe); pipe->destroy(pipe);

View File

@@ -2071,11 +2071,9 @@ dri2_init_screen(__DRIscreen * sPriv)
if (pipe_loader_drm_probe_fd(&screen->dev, fd)) { if (pipe_loader_drm_probe_fd(&screen->dev, fd)) {
struct pipe_screen_config config = {};
dri_init_options(screen); dri_init_options(screen);
pscreen = pipe_loader_create_screen(screen->dev, &config); pscreen = pipe_loader_create_screen(screen->dev);
} }
if (!pscreen) if (!pscreen)
@@ -2166,12 +2164,10 @@ dri_kms_init_screen(__DRIscreen * sPriv)
if (screen->fd < 0 || (fd = fcntl(screen->fd, F_DUPFD_CLOEXEC, 3)) < 0) if (screen->fd < 0 || (fd = fcntl(screen->fd, F_DUPFD_CLOEXEC, 3)) < 0)
goto free_screen; goto free_screen;
struct pipe_screen_config config = {};
dri_init_options(screen); dri_init_options(screen);
if (pipe_loader_sw_probe_kms(&screen->dev, fd)) if (pipe_loader_sw_probe_kms(&screen->dev, fd))
pscreen = pipe_loader_create_screen(screen->dev, &config); pscreen = pipe_loader_create_screen(screen->dev);
if (!pscreen) if (!pscreen)
goto release_pipe; goto release_pipe;

View File

@@ -401,10 +401,9 @@ drisw_init_screen(__DRIscreen * sPriv)
sPriv->extensions = drisw_screen_extensions; sPriv->extensions = drisw_screen_extensions;
if (pipe_loader_sw_probe_dri(&screen->dev, &drisw_lf)) { if (pipe_loader_sw_probe_dri(&screen->dev, &drisw_lf)) {
struct pipe_screen_config config;
dri_init_options(screen); dri_init_options(screen);
pscreen = pipe_loader_create_screen(screen->dev, &config); pscreen = pipe_loader_create_screen(screen->dev);
} }
if (!pscreen) if (!pscreen)

View File

@@ -162,7 +162,7 @@ xa_tracker_create(int drm_fd)
goto out_no_fd; goto out_no_fd;
if (pipe_loader_drm_probe_fd(&xa->dev, fd)) if (pipe_loader_drm_probe_fd(&xa->dev, fd))
xa->screen = pipe_loader_create_screen(xa->dev, NULL); xa->screen = pipe_loader_create_screen(xa->dev);
if (!xa->screen) if (!xa->screen)
goto out_no_screen; goto out_no_screen;

View File

@@ -229,7 +229,7 @@ drm_create_adapter( int fd,
return D3DERR_DRIVERINTERNALERROR; return D3DERR_DRIVERINTERNALERROR;
} }
ctx->base.hal = pipe_loader_create_screen(ctx->dev, NULL); ctx->base.hal = pipe_loader_create_screen(ctx->dev);
if (!ctx->base.hal) { if (!ctx->base.hal) {
ERR("Unable to load requested driver.\n"); ERR("Unable to load requested driver.\n");
drm_destroy(&ctx->base); drm_destroy(&ctx->base);
@@ -312,7 +312,7 @@ drm_create_adapter( int fd,
/* wrap it to create a software screen that can share resources */ /* wrap it to create a software screen that can share resources */
if (pipe_loader_sw_probe_wrapped(&ctx->swdev, ctx->base.hal)) if (pipe_loader_sw_probe_wrapped(&ctx->swdev, ctx->base.hal))
ctx->base.ref = pipe_loader_create_screen(ctx->swdev, NULL); ctx->base.ref = pipe_loader_create_screen(ctx->swdev);
if (!ctx->base.ref) { if (!ctx->base.ref) {
ERR("Couldn't wrap drm screen to swrast screen. Software devices " ERR("Couldn't wrap drm screen to swrast screen. Software devices "

View File

@@ -76,7 +76,7 @@ static void init_ctx(struct context *ctx)
ret = pipe_loader_probe(&ctx->dev, 1); ret = pipe_loader_probe(&ctx->dev, 1);
assert(ret); assert(ret);
ctx->screen = pipe_loader_create_screen(ctx->dev, NULL); ctx->screen = pipe_loader_create_screen(ctx->dev);
assert(ctx->screen); assert(ctx->screen);
ctx->pipe = ctx->screen->context_create(ctx->screen, NULL, 0); ctx->pipe = ctx->screen->context_create(ctx->screen, NULL, 0);

View File

@@ -96,7 +96,7 @@ static void init_prog(struct program *p)
assert(ret); assert(ret);
/* init a pipe screen */ /* init a pipe screen */
p->screen = pipe_loader_create_screen(p->dev, NULL); p->screen = pipe_loader_create_screen(p->dev);
assert(p->screen); assert(p->screen);
/* create the pipe driver context and cso context */ /* create the pipe driver context and cso context */

View File

@@ -91,7 +91,7 @@ static void init_prog(struct program *p)
assert(ret); assert(ret);
/* init a pipe screen */ /* init a pipe screen */
p->screen = pipe_loader_create_screen(p->dev, NULL); p->screen = pipe_loader_create_screen(p->dev);
assert(p->screen); assert(p->screen);
/* create the pipe driver context and cso context */ /* create the pipe driver context and cso context */