diff --git a/src/gallium/auxiliary/target-helpers/drm_helper.h b/src/gallium/auxiliary/target-helpers/drm_helper.h index ff4621e1a88..6167a94d85f 100644 --- a/src/gallium/auxiliary/target-helpers/drm_helper.h +++ b/src/gallium/auxiliary/target-helpers/drm_helper.h @@ -265,7 +265,7 @@ pipe_msm_create_screen(int fd, const struct pipe_screen_config *config) { struct pipe_screen *screen; - screen = fd_drm_screen_create(fd, NULL); + screen = fd_drm_screen_create(fd, NULL, config); return screen ? debug_screen_wrap(screen) : NULL; } DRM_DRIVER_DESCRIPTOR(msm, NULL, 0) diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c index 2e377f9e05f..7b27846ef1a 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -35,6 +35,7 @@ #include "util/u_memory.h" #include "util/u_screen.h" #include "util/u_string.h" +#include "util/xmlconfig.h" #include "util/os_time.h" @@ -923,7 +924,8 @@ fd_screen_get_driver_uuid(struct pipe_screen *pscreen, char *uuid) } struct pipe_screen * -fd_screen_create(struct fd_device *dev, struct renderonly *ro) +fd_screen_create(struct fd_device *dev, struct renderonly *ro, + const struct pipe_screen_config *config) { struct fd_screen *screen = CALLOC_STRUCT(fd_screen); struct pipe_screen *pscreen; @@ -1013,6 +1015,10 @@ fd_screen_create(struct fd_device *dev, struct renderonly *ro) screen->has_syncobj = fd_has_syncobj(screen->dev); + /* parse driconf configuration now for device specific overrides: */ + driParseConfigFiles(config->options, config->options_info, 0, "msm", + NULL, fd_dev_name(screen->gpu_id), NULL, 0, NULL, 0); + struct sysinfo si; sysinfo(&si); screen->ram_size = si.totalram; diff --git a/src/gallium/drivers/freedreno/freedreno_screen.h b/src/gallium/drivers/freedreno/freedreno_screen.h index ddc450a57a8..7928ccb613a 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.h +++ b/src/gallium/drivers/freedreno/freedreno_screen.h @@ -179,7 +179,8 @@ struct fd_bo *fd_screen_bo_from_handle(struct pipe_screen *pscreen, struct winsys_handle *whandle); struct pipe_screen *fd_screen_create(struct fd_device *dev, - struct renderonly *ro); + struct renderonly *ro, + const struct pipe_screen_config *config); static inline boolean is_a20x(struct fd_screen *screen) diff --git a/src/gallium/drivers/freedreno/meson.build b/src/gallium/drivers/freedreno/meson.build index 9f1747646e1..dac51b1c3c7 100644 --- a/src/gallium/drivers/freedreno/meson.build +++ b/src/gallium/drivers/freedreno/meson.build @@ -286,7 +286,10 @@ driver_freedreno = declare_dependency( libfreedreno_layout, libfreedreno_perfcntrs ], - dependencies : idep_nir, + dependencies : [ + idep_nir, + idep_xmlconfig, + ], ) ir3_compiler = executable( @@ -320,6 +323,7 @@ gmemtool = executable( idep_nir, idep_mesautil, idep_u_tracepoints, + idep_xmlconfig, ], link_with : [ libfreedreno, diff --git a/src/gallium/winsys/freedreno/drm/freedreno_drm_public.h b/src/gallium/winsys/freedreno/drm/freedreno_drm_public.h index 2f5591e867a..a15f6cf8683 100644 --- a/src/gallium/winsys/freedreno/drm/freedreno_drm_public.h +++ b/src/gallium/winsys/freedreno/drm/freedreno_drm_public.h @@ -5,6 +5,7 @@ struct pipe_screen; struct renderonly; -struct pipe_screen *fd_drm_screen_create(int drmFD, struct renderonly *ro); +struct pipe_screen *fd_drm_screen_create(int drmFD, struct renderonly *ro, + const struct pipe_screen_config *config); #endif diff --git a/src/gallium/winsys/freedreno/drm/freedreno_drm_winsys.c b/src/gallium/winsys/freedreno/drm/freedreno_drm_winsys.c index 211e1656429..3e4109e3e9a 100644 --- a/src/gallium/winsys/freedreno/drm/freedreno_drm_winsys.c +++ b/src/gallium/winsys/freedreno/drm/freedreno_drm_winsys.c @@ -69,7 +69,8 @@ fd_drm_screen_destroy(struct pipe_screen *pscreen) } struct pipe_screen * -fd_drm_screen_create(int fd, struct renderonly *ro) +fd_drm_screen_create(int fd, struct renderonly *ro, + const struct pipe_screen_config *config) { struct pipe_screen *pscreen = NULL; @@ -88,7 +89,7 @@ fd_drm_screen_create(int fd, struct renderonly *ro) if (!dev) goto unlock; - pscreen = fd_screen_create(dev, ro); + pscreen = fd_screen_create(dev, ro, config); if (pscreen) { int fd = fd_device_fd(dev); diff --git a/src/gallium/winsys/kmsro/drm/kmsro_drm_winsys.c b/src/gallium/winsys/kmsro/drm/kmsro_drm_winsys.c index ec927986c80..6d2f0cabd67 100644 --- a/src/gallium/winsys/kmsro/drm/kmsro_drm_winsys.c +++ b/src/gallium/winsys/kmsro/drm/kmsro_drm_winsys.c @@ -91,7 +91,7 @@ struct pipe_screen *kmsro_drm_screen_create(int fd, ro->gpu_fd = drmOpenWithType("msm", NULL, DRM_NODE_RENDER); if (ro->gpu_fd >= 0) { ro->create_for_resource = renderonly_create_kms_dumb_buffer_for_resource; - screen = fd_drm_screen_create(ro->gpu_fd, ro); + screen = fd_drm_screen_create(ro->gpu_fd, ro, config); if (!screen) goto out_free;